c++ - BitBlt 问题 GDI

标签 c++ winapi gdi+ gdi ellipse

我在这个程序中使用 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/

相关文章:

c++ - 多个可互换 View (MFC/C++)

c++ - 获取 Windows API 标题栏图标

c# - 使用 gdi+ (C#) 将 png 转换为 gif

c++ - Gdiplus 位图没有 Alpha channel

C++ WM_LBUTTONDOWN 在使用 WM_NCHITTEST 时不触发

c++ - 如何将 HBITMAP 转换为 JNI 的 BYTE 数组

c++ - 什么是真正的桌面背景HWND?

C++画一棵树

c++ - 当 n 为 0 时除法 z/(x/n)

c++ - Win32 : Why is full-screen mode buggy?