【问题标题】:MFC Device Context SelectObject Drawing to BitmapMFC 设备上下文 SelectObject 绘制到位图
【发布时间】:2013-05-04 04:04:08
【问题描述】:

我正在使用 Cairo 将旧的 Windows 95 MFC 代码转换为 C++11 的项目。由于我对 MFC 不熟悉,所以我对原始程序中用于绘图的不同坐标空间感到困惑,并且很难找到解释这些功能的信息和示例。

这就是我所看到的。在代码中,似乎有一次使用 CreateCompatibleDC 创建了一个新的 CDC 设备上下文。随后创建位图对象。然后使用 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 函数调用,我认为他们正在使用显示屏幕坐标将位图绘制到实际显示屏幕上。但我真的不确定,并希望得到一些澄清。谢谢!

【问题讨论】:

    标签: mfc bitmap gdi


    【解决方案1】:

    听起来你完全理解了!

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

    那么任何对 DC 的绘制实际上都是在向内存 DC“内部”的位图绘制。

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

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

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

    【讨论】:

    • 非常感谢您提供的信息丰富的回答,非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 2011-04-02
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多