我现在正在使用windows.h(GDI)在C ++中编写简单的类似mspaint的程序。对于我的程序,我只需要笔工具。因此,我需要存储主窗口的图片(例如,在内存HDC和HBITMAP中),以便在WM_PAINT消息之后绘制它。
当我第一次将窗口的HDC存储到我的内存HDC和HBITMAP中时?在什么消息我应该存储窗口?例如,我认为我们不能在WM_CREATE中这样做,因为我们还没有窗口。
PatBlt和BitBlt有什么区别?我应该如何使用我的应用程序?
如何将窗口的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);
但这不起作用:程序崩溃。
之后如何在WM_PAINT中恢复窗口?
如何用白色清除窗户?
答案 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;
}
...更多代码
休息;