【发布时间】:2015-10-22 01:49:53
【问题描述】:
我对如何双缓冲这个有点困惑。我是
不确定我是否需要创建另一个 CreateCompatibleBitmap 或 CreateCompatibleDC 以及如何链接它们。
这按原样工作,但我认为它的双缓冲不正确。
void __OnPaint(HWND hWnd, HDC _hdc = nullptr)
{
HDC hdc = _hdc;
PAINTSTRUCT paint;
RECT& rcClient = paint.rcPaint;
if (!_hdc)
hdc = BeginPaint(hWnd, &paint);
else
GetClientRect(hWnd, &rcClient);
if (hdc)
{
int width = rcClient.right - rcClient.left;
int height = rcClient.bottom - rcClient.top;
HDC hDCMem = CreateCompatibleDC(_hdc);
HBITMAP hBitmapMem = CreateCompatibleBitmap(hDCMem, width, height);
SelectObject(hDCMem, hBitmapMem);
Rectangle(hDCMem, 0, 0, width, height);
BLENDFUNCTION bfn;
bfn.BlendOp = AC_SRC_OVER;
bfn.BlendFlags = 0;
bfn.AlphaFormat = 0;
bfn.SourceConstantAlpha = 0x50;
AlphaBlend(hdc, 0, 0, width, height, hDCMem, 0, 0, width, height, bfn);
SetTextColor(hdc, RGB(255, 0, 0));
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, "Your text here", -1, &rcClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
//BitBlt(hdc, 0, 0, width, height, hDCMem, 0, 0, SRCCOPY);
DeleteDC(hDCMem);
DeleteObject(hBitmapMem);
}
if (!_hdc)
EndPaint(hWnd, &paint);
}
我还发现我有另一个问题。 我在 WM_TIMER 中移动了我的窗口,我调用了我的 __onpaint,我遇到的问题是它不会重绘它与 alphaBlend 有关系,它保留了第一次绘制时窗口下的东西,因为它在我之前就已经工作了使用那个
【问题讨论】:
-
通常你需要
AlphaBlend来绘制半透明的位图图像。但是你没有任何图像,你只是写信给hdc。您是否仅针对双缓冲?还是与位图图像有关? -
HDC hDCMem = CreateCompatibleDC(_hdc);这应该是 hdc 而不是 _hdc -
哦,我错过了,我试图在我完全透明的窗口上绘制一个半透明的矩形
-
hBitmapMem 是单色位图。请参阅CreateCompatibleBitmap 的备注部分:“当创建内存设备上下文时,它最初会选择一个 1×1 单色位图。如果在 CreateCompatibleBitmap 中使用此内存设备上下文,创建的位图是单色位图。要创建彩色位图,请使用用于创建内存设备上下文的 HDC [...]"跨度>