gpt4 book ai didi

c++ - BitBlt 问题 GDI

转载 作者:行者123 更新时间:2023-11-30 00:40:24 24 4
gpt4 key购买 nike

我在这个程序中使用 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 x 1 像素的位图。要在屏幕外绘制,您需要 DC 位图。请花时间阅读 the MSDN page for CreateCompatible - 它指出了这个确切的问题。

如果您对此不熟悉,请将位图想象成您在其上绘制的实际 Canvas - DC 只是进行该绘制的支持结构。根据您的代码,您已经设置了画架和画笔 - 但您没有在任何东西上作画。

这里通常的做法是:

  • CreateCompatibleDC 创建 DC
  • CreateCompatibleBitmap 以创建您将实际绘制到的位图
  • 选择将新位图对象放入内存 DC
  • 绘制到内存 DC - 它绘制您选择的位图
  • BitBlt 从内存 DC(即你的位图,它被选中)到 WM_PAINT 中的位图
  • 清理:SelectObject将原始位图放回内存DC,并删除位图和DC。

关于c++ - BitBlt 问题 GDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com