MFC设备上下文选择对象图形到位图

MFC设备上下文选择对象图形到位图,mfc,bitmap,gdi,Mfc,Bitmap,Gdi,我正在使用Cairo将旧的windows95mfc代码翻译成C++11。由于我不熟悉MFC,我对原始程序中绘制的不同坐标空间感到困惑,很难找到解释这些函数的信息和示例 这就是我看到的。在代码中,似乎有一个新的CDC设备上下文正在使用CreateCompatibleDC创建。随后创建位图对象。然后使用SelectObject函数将此位图设置为新设备上下文。据我所知,这是一个依赖于DDB设备的位图 例如: bmp_dc = new CDC(); bmp_dc->CreateCo

我正在使用Cairo将旧的windows95mfc代码翻译成C++11。由于我不熟悉MFC,我对原始程序中绘制的不同坐标空间感到困惑,很难找到解释这些函数的信息和示例

这就是我看到的。在代码中,似乎有一个新的CDC设备上下文正在使用CreateCompatibleDC创建。随后创建位图对象。然后使用SelectObject函数将此位图设置为新设备上下文。据我所知,这是一个依赖于DDB设备的位图

例如:

    bmp_dc = new CDC();
    bmp_dc->CreateCompatibleDC(NULL);

    int num_bits_per_pixel = bmp_dc->GetDeviceCaps(NUMBITSPIXEL);
    int num_planes = bmp_dc->GetDeviceCaps(NUMPLANES);
    c_bmp = new CBitmap();
    c_bmp->CreateBitmap(width, height,num_planes,num_bits_per_pixel,NULL);

    bmp_dc->SelectObject(c_bmp);
然后,这个新的设备上下文被传递给许多使用它执行绘图操作的类(bmp_dc->MoveTo()、LineTo、eliple等)。我的问题是,所有这些使用该设备上下文的绘图操作是否直接绘制到位图中,而不是绘制到显示屏上?他们是否假设位图左上角是绘制时的原点


我注意到以后会有很多BitBlt函数调用,我认为他们正在使用显示屏坐标将位图绘制到实际显示屏上。但我真的不确定,并希望得到一些澄清。谢谢

听起来你完全明白了

代码使用
CreateCompatibleDC
创建与物理显示格式相同的内存DC(它将NULL作为参数传递,这意味着使用dektop DC)。然后,如您所说,要绘制位图,需要使用
SelectObject
将位图选择到内存DC中

然后,任何绘制到DC的图形实际上都是绘制到内存DC“内部”的位图

最后,
BitBlt
可以将位图内容(从内存DC)显示到显示设备。这是双缓冲绘图的经典实现,以避免在显示期间闪烁

图形命令都使用相同的坐标系-左上角是(0,0)原点


有什么事情与此相矛盾吗?如果是这样,也许您可以发布更多的代码。

非常感谢您提供了信息丰富的答案,非常感谢!:)