BitBlt问题GDI

Geo*_*Shg 1 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;
Run Code Online (Sandbox Code Playgroud)

Bre*_*McK 7

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

这里的第一个问题是处理闪烁:首先你需要覆盖WM_ERASEBKGND,因为Hans指出 - 否则Windows会用窗口刷(来自RegisterClass)擦除背景,并且擦除是闪烁的常见原因.

这里的下一个问题是你正在使用一个'空'DC:CreateCompatibleDC为你提供一个DC - 它只是一个绘图上下文 - 但是上下文包含一个1像素乘1像素的位图.要在屏幕外绘制,您需要DC 位图.花时间阅读CreateCompatible的MSDN页面 - 它会调出这个确切的问题.

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

通常的方法是:

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