【问题标题】:BitBlt Problem GDIBitBlt 问题 GDI
【发布时间】:2011-09-03 00:59:08
【问题描述】:

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

【问题讨论】:

  • 您必须处理 WM_ERASEBKGND 以避免闪烁。

标签: c++ winapi gdi+ gdi ellipse


【解决方案1】:

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

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

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

如果您不熟悉此功能,请将位图视为您在其上绘制的实际画布 - DC 只是进行该绘制的支撑结构。按照您的代码,您已经设置好画架和画笔 - 但您没有在任何东西上绘画。

这里通常的做法是:

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

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2016-06-15
    • 2010-10-03
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多