我在此程序中使用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;
答案 0 :(得分:6)
看起来您正在尝试绘制基于内存的位图,然后将其bitblt到屏幕,以避免闪烁?
这里的第一个问题是处理闪烁:首先你需要覆盖WM_ERASEBKGND,因为Hans指出 - 否则Windows会用窗口刷(来自RegisterClass)擦除背景,并且擦除是闪烁的常见原因。 / p>
这里的下一个问题是你正在使用一个'空'DC:CreateCompatibleDC为你提供一个DC - 它只是一个绘图上下文 - 但是上下文包含一个1像素乘1像素的位图。要在屏幕外绘制,您需要DC 和位图。请花点时间阅读the MSDN page for CreateCompatible - 它会引出这个问题。
如果您是新手,请将位图视为您绘制的实际画布 - DC只是执行该绘图的支持结构。正如你的代码所示,你已经设置了画架和画笔 - 但你不会在任何东西上画画。
通常的做法是: