类似MSPaint的应用程序编写。怎么做BitBlt吧?

时间:2011-09-26 14:42:06

标签: c++ windows winapi gdi

我现在正在使用windows.h(GDI)在C ++中编写简单的类似mspaint的程序。对于我的程序,我只需要笔工具。因此,我需要存储主窗口的图片(例如,在内存HDC和HBITMAP中),以便在WM_PAINT消息之后绘制它。

  1. 当我第一次将窗口的HDC存储到我的内存HDC和HBITMAP中时?在什么消息我应该存储窗口?例如,我认为我们不能在WM_CREATE中这样做,因为我们还没有窗口。

  2. PatBlt和BitBlt有什么区别?我应该如何使用我的应用程序?

  3. 如何将窗口的HDC内容复制到我的内存HDC和位图?我正在尝试做这样的事情:

        LPRECT lpRect;
        GetClientRect(hwnd, lpRect);
        width = lpRect->right - lpRect->left;
        height = lpRect->bottom - lpRect->top;
    
        HDC hDC = GetDC(hwnd);
        memoryDC = CreateCompatibleDC(hDC);
        memoryBitmap = CreateCompatibleBitmap(hDC, width, height);
        SelectObject(memoryDC, memoryBitmap);
        PatBlt(memoryDC, 0, 0, width, height, PATCOPY);
        ReleaseDC(hwnd, hDC);
    
  4. 但这不起作用:程序崩溃。

    1. 之后如何在WM_PAINT中恢复窗口?

    2. 如何用白色清除窗户?

2 个答案:

答案 0 :(得分:4)

1:我建议你尽可能晚地延迟加载你的屏幕外画布。如果您在WM_PAINT中需要它并且尚未创建它,那么请创建它。如果您在某人开始绘图时需要它,那么就创建它。如果它在您需要时存在,则使用它。

2:PatBlt使用设备上下文的当前画笔填充位图的一个区域。画笔定义模式,这就是它被称为PatBlt的原因。 BitBlt将数据从源位图复制到目标位图。如果要将图像从屏幕外位图移动到帧缓冲区,可以使用BitBlt。

3:GetClientRect的lpRect参数是输出参数。这意味着你必须提供内存。在这种情况下,GetClientRect正在尝试将矩形写入空指针并导致崩溃。

RECT clientRect;
GetClientRect(hwnd, &clientRect);
width = clientRect.right - clientRect.left;
height = clientRect.bottom - clientRect.top;

答案 1 :(得分:0)

WM_PAINT:似乎是创建内存hdc的最佳位置。你可以做这样的事情

WM_PAINT:
如果(!first_paint) { ...码 first_paint = true; } ...更多代码 休息;