SelectObject(dc, hBMP) 是什么作用?

11

我猜我理解了如果我在“设备上下文”中选择“对象”,并且如果这个对象是一个画刷字体,那么这些对象的特性将用于在设备上下文上进行绘图。

然而,我不明白在将位图选择到设备上下文之后会发生什么,更不用说为什么需要这样做。

我有一个程序,在某个地方执行了以下操作:

HDC dc = ::GetDC(hWnd);

ffBitmap   = ::CreateCompatibleBitmap(dc, windowWidth, windowHeight);
ffMemoryDc = ::CreateCompatibleDC(dc);

hOldBitmap          = (HBITMAP) ::SelectObject(ffMemoryDc, ffBitmap);

然后将绘制内容放入 ffMemoryDc ,并将 ffMemoryDc *BitBlt* 到窗口的真实 设备上下文中。

BitBlt ( dc, 
         0, 0, windowWidth, windowHeight,
         ffMemoryDc,
         0, 0,
         SRCCOPY
       );

整个程序中没有其他地方引用变量ffBitmap, 但是如果我不选择SelectObject(ffBitmap),就什么都不会绘制,所以它是必要的。

如果有人能够解释一下这里发生了什么,那我将不胜感激。


1
把它看作是一个橡皮图章。由SelectObject创建,用BitBlt应用。额外的间接性很重要。 - Hans Passant
1个回答

4

这就是它的工作原理。您在DC中选择的位图是“绘制”的位图。引用MSDN

在应用程序可以使用内存设备上下文进行绘图操作之前,必须将正确宽度和高度的位图选择到设备上下文中。


为什么我们不能只使用CreateCompatibleBitmap创建一个位图,并将ffMemoryDc作为第一个参数传递进去呢? - IC_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接