BitBlt Problem GDI
BitBlt Problem GDI
我在这个程序中使用BitBlt时遇到问题。你调整窗口的大小,椭圆也随之调整大小。当然,用普通的hdc方法,它是断断续续的。我尝试了BitBlt方法,但也不起作用(可能是因为我做错了)。有人能纠正我的错误吗?乙醇
bool sizing; //global
case WM_PAINT:
{
RECT rect;
GetClientRect(hwnd, &rect);
hdc = BeginPaint(hwnd, &ps);
mem = CreateCompatibleDC(hdc);
SelectObject(mem, GetStockObject(HOLLOW_BRUSH));
if(sizing)
{
Ellipse(mem,rect.left, rect.top, rect.right, rect.bottom);
}
BitBlt(hdc, rect.left, rect.top, rect.left - rect.right, rect.top -rect.bottom , mem, rect.left, rect.top, SRCCOPY);
DeleteDC(mem);
EndPaint(hwnd, &ps);
break;
}
case WM_SIZE:
sizing = true;
break;
看起来你正试图绘制一个基于内存的位图,然后将其位图到屏幕上,以避免闪烁?
这里的第一个问题是处理闪烁:首先,正如Hans所指出的,你需要覆盖WM_ERASEBKGND,否则Windows将使用任何窗口笔刷(来自RegisterClass)擦除背景,而擦除是闪烁的常见原因。
这里的下一个问题是,您使用的是一个"空"DC:CreateCompatibleDC会给您一个DC,它只是一个绘图上下文,但上下文包含一个1像素乘1像素的位图。要在屏幕外绘制,您需要一个DC和位图。请花点时间阅读CreateCompatible的MSDN页面-它指出了这个确切的问题。
如果你是新手,可以把位图想象成你在上面绘制的实际画布——DC只是进行绘制的支持结构。按照你的代码,你已经设置好了画架和画笔,但你没有在任何东西上画画。
这里常用的方法是:
- CreateCompatibleDC以创建DC
- CreateCompatibleBitmap创建实际绘制的位图
- 选择将新位图放入内存DC
- 绘制到内存DC-它在您选择的位图上绘制
- BitBlt从内存DC(即您的位图,它被选中)到WM_PAINT
- 清理:选择将原始位图对象放回内存DC,然后删除位图和DC
相关文章:
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 没有专用显卡的 Direct2D 与 GDI+
- GDI 绘制到外部窗口 (C++)
- C++ WinAPI[GDI].自定义 gui 正确重绘
- C++ Gdi+将图像转换为灰度
- C++GDI+ 选择调色板
- 无法让 Assimp 在 Windows " linker problem" 上运行?(与2019年相比)
- 如何从内存中分配GDI+ POINT类地址?
- GDI+-无法对Gdiplus::Graphics(C++)执行任何操作
- C++gdi::内存中的位图到PNG图像
- GDI+ flickering
- 如何在C++中为 Windows 的 GDI 正确设置库?
- 使用 Win32 将 GDI 绘制大小缩放为窗口大小
- 如何从依赖于设备的 HBITMAP 构造 GDI+ 位图对象
- 从 OpenGL 切换到 GDI
- 使用 GDI+ 在C++中制作流畅的动画
- avcodec_receive_packet错误(gdi 屏幕截图 + ffmpeg)
- 如何从 GDI+ 图元文件对象获取原始图元文件字节
- c++ GDI 打印导致系统冻结
- BitBlt Problem GDI