Я немного смущен тем, как удваивать буфер. Я не уверен, что мне нужно создать еще CreateCompatibleBitmap
или CreateCompatibleDC
и как связать все это. Это работает как есть, но я не думаю, что его двойное забуференное право.Двойная буферизация AlphaBlend rect с наложением текста
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, проблема с импровизацией - это то, что он не перерисовывает его, есть что-то делать с альфа-бландом, он держит то, что когда-либо было под окном во время 1-го розыгрыша, так как он работал до того, как я использовал
Обычно вам нужно «AlphaBlend», когда вы рисуете растровое изображение с полупрозрачностью. Но у вас нет изображений, вы просто пишете на 'hdc'. Вы нацелены только на двойную буферизацию? или это что-то с растровыми изображениями? –
'HDC hDCMem = CreateCompatibleDC (_hdc);' this должно быть hdc not _hdc – milevyo
oh я пропустил это, я попытался нарисовать полупрозрачный прямоугольник над моим полностью прозрачным окном – ramafe