类似于mspaint的应用程序编写.如何做好BitBlt

MSPaint-like app writing. How to do BitBlt right?

本文关键字:何做好 BitBlt mspaint 应用程序 类似于      更新时间:2023-10-16

我现在正在使用windows.h (GDI)在c++中编写简单的mspaint-like程序。对于我的程序,我只需要钢笔工具。所以,我需要在某个地方存储主窗口的图片(例如在内存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);
    

但这不起作用:程序崩溃。

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

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

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;

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

WM_PAINT:
如果(! first_paint){代码…First_paint = true;}…更多的代码打破;