2011-05-27 49 views
0

我在此程序中使用BitBlt时遇到问题。您调整窗口大小并调整椭圆大小。当然,用正常的HDC方法,它是波涛汹涌,波涛汹涌。我尝试了BitBlt方法,但这也不起作用(可能是因为我做错了)。 有人可以解决我什么我donig错了吗?感谢名单BitBlt问题GDI

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; 
+0

您必须处理WM_ERASEBKGND以避免闪烁。 – 2011-05-27 00:42:19

回答

6

它看起来像你想画一个基于内存的位图,然后块传送是在屏幕上,避免闪烁?

这里的第一个问题是处理闪烁问题:首先,你需要重写WM_ERASEBKGND,正如汉斯指出的那样 - 否则Windows将使用任何窗口刷子(来自RegisterClass)擦除背景,并且擦除通常是闪烁的原因。

这里的下一个问题是您使用'空'DC:CreateCompatibleDC给你一个DC - 这只是一个绘图上下文 - 但上下文包含1个像素1像素的位图。要画外屏,需要一个DC 位图。请花时间阅读the MSDN page for CreateCompatible--它会调出这个确切的问题。

如果您不熟悉这一点,请将位图视为您绘制的实际画布 - DC仅作为执行该绘制的支持结构。当你的代码站立时,你已经设置了画架和油漆刷 - 但你没有绘制任何东西。这里

通常的做法是:

  • CreateCompatibleDC创建DC
  • CreateCompatibleBitmap创建一个你会真正吸取到
  • 选择对象的新位图到内存DC
  • 绘制位图到内存DC - 它在你选择的位图上绘制它
  • BitBlt从内存DC(即你的位图,它被选中)到WM中的一个_PAINT
  • 清理:SelectObject将原始位图重新放回内存DC中,并删除位图和DC。