类似于mspaint的应用程序编写.如何做好BitBlt
MSPaint-like app writing. How to do BitBlt right?
我现在正在使用windows.h (GDI)在c++中编写简单的mspaint-like程序。对于我的程序,我只需要钢笔工具。所以,我需要在某个地方存储主窗口的图片(例如在内存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之后恢复窗口?
-
如何用白色清除我的窗户?
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;}…更多的代码打破;
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 在C++中释放内存期间,迭代器与指针有何不同
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 类中的 C++ int 被设置为值,似乎不知从何而来
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 如何使用 bitblt 在屏幕上绘制由位图制作的数组?
- 收益率和回报有何不同?
- 覆盖私有功能,它与受保护功能有何不同?
- 擦除删除成语的性能增益从何而来
- BitBlt转换为字节数组并从c ++解析为c#
- 无论代码长度如何,以下代码的内存要求有何不同?
- "virtual"对C++析构函数有何影响?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- 系统时间从何而来?
- stl::unordered_map 和 stl::vector 的销毁有何不同
- C++ 友元函数在内存位置上有何不同?
- 为什么我可以在不链接任何额外库的情况下包含 sys/*.h
- C 是否具有接口类概念,如果它在那里,那么它与Java接口类别有何不同
- 类似于mspaint的应用程序编写.如何做好BitBlt