1

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

1 回答 1

8

看起来您正在尝试绘制到基于内存的位图,然后将其 bitblt 到屏幕上,以避免闪烁?

这里的第一个问题是处理闪烁:首先您需要覆盖 WM_ERASEBKGND,正如 Hans 指出的那样 - 否则 Windows 将使用任何窗口画笔(来自 RegisterClass)擦除背景,而擦除是闪烁的常见原因。

下一个问题是您使用的是“空”DC:CreateCompatibleDC 为您提供了一个 DC——它只是一个绘图上下文——但该上下文包含一个 1 像素乘 1 像素的位图。要在屏幕外绘制,您需要一个 DC一个位图。请花时间阅读CreateCompatible 的 MSDN 页面- 它指出了这个确切的问题。

如果您对此不熟悉,请将位图视为您绘制的实际画布 - DC 只是进行该绘图的支持结构。正如您的代码所代表的那样,您已经设置了画架和画笔 - 但您没有在任何东西上绘画。

这里通常的做法是:

  • CreateCompatibleDC 创建 DC
  • CreateCompatibleBitmap 创建您将实际绘制的位图
  • SelectObject 将你的新位图放入内存 DC
  • 绘制到内存 DC - 它在您选择的位图上绘制
  • BitBlt 从内存 DC(即,您的位图,它被选中)到 WM_PAINT 中的那个
  • 清理:SelectObject把原来的位图放回内存DC,并删除位图和DC。
于 2011-05-27T02:55:59.257 回答