我正在开发一个项目,使用Cairo将旧的Windows 95 MFC代码翻译成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,Ellipse等)。我的问题是,所有这些使用该设备上下文的绘图操作是否直接绘制到位图中,而不是直接显示在显示屏上?并且,他们是否认为位图左上角是绘图时的原点?
我注意到稍后会发生一些BitBlt函数调用,我认为他们正在使用显示屏坐标将位图绘制到实际的显示屏上。但我真的不确定,并希望得到一些澄清。谢谢!
答案 0 :(得分:2)
听起来你理解得很完美!
代码使用CreateCompatibleDC
创建与物理显示格式相同的内存DC(它将NULL作为参数传递,这意味着使用dektop DC)。然后,要绘制到位图,必须使用SelectObject
将位图选择到内存DC中,正如您所说。
然后任何到DC的绘图实际上是在内部DC“内部”绘制到位图。
最后,BitBlt
可以显示位图内容(从内存DC)到显示设备。这是双缓冲绘图的经典实现,以避免在显示期间闪烁。
绘图命令全部使用相同的坐标系 - 左上角是(0,0)原点。
有什么事情与此相矛盾吗?如果是这样,也许您可以发布更多代码。