Проблема при использовании растрового изображения с двойной буферизацией с AlphaBlend

#c #winapi

#c #winapi

Вопрос:

Мой текст перекрывается при его изменении.

но это текст времени, поэтому он всегда меняется

я уже пробовал


TranslateBlt(memhdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right, TextBoxRect.bottom, hdc, TextBoxRect.right, TextBoxRect.bottom, RGB (0,0,0));

случай WM_ERASEBKGND: возвращает true;

InvalidateRect(NULL, amp;TextBoxRect, TRUE);


вот мой код.


 HDC hdc = GetDC(NULL);
HDC memhdc;
HBITMAP bgbitmap, oldbitmap;

stringstream stream;
int cur = delay / 10;
stream << "Ms : " << msec;
wchar_t str[120];
mbstowcs_s(NULL, str, 120, stream.str().c_str(), 120);

memhdc = CreateCompatibleDC(hdc);
bgbitmap = CreateCompatibleBitmap(hdc, TextBoxRect.right, TextBoxRect.bottom);
oldbitmap = (HBITMAP) SelectObject(memhdc, bgbitmap);

BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 255;
bf.AlphaFormat = 0;

AlphaBlend(memhdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right, TextBoxRect.bottom, hdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right, TextBoxRect.bottom, bf);
SetBkMode(memhdc, TRANSPARENT);
SetTextColor(memhdc, RGB(255, 0, 0));
DrawText(memhdc, str, -1, amp;TextBoxRect, DT_LEFT | DT_NOCLIP);

BitBlt(hdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right, TextBoxRect.bottom, memhdc, TextBoxRect.left, TextBoxRect.top, SRCCOPY);

DeleteObject(SelectObject(memhdc,oldbitmap));
DeleteObject(bgbitmap);
DeleteDC(memhdc);
ReleaseDC(NULL, hdc);
  

Комментарии:

1. Нарисуйте свой текст сплошным фоном ( OPAQUE вместо TRANSPARENT ) или используйте BitBlt для восстановления исходной части растрового изображения вне экрана, прежде чем отображать текст поверх него.

Ответ №1:

Я думаю, вы готовы нарисовать прозрачные цифровые изменения.

Вы можете попробовать вызвать InvalidateRect и UpdateWindow обновить локальную область одновременно, потому что система рассматривает операцию рисования в окне как операцию с низким приоритетом, которая может быть немедленно перерисована с помощью UpdateWindow.

Также вы можете попробовать следующий код, как говорит Джонатан Поттер

Точно так же, как :

    AlphaBlend(memhdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right,       TextBoxRect.bottom, hdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right, TextBoxRect.bottom, bf);
   SetBkMode(hdc, TRANSPARENT);
   SetTextColor(hdc, RGB(255, 0, 0));       
   BitBlt(hdc, TextBoxRect.left, TextBoxRect.top, TextBoxRect.right, TextBoxRect.bottom, hdc, TextBoxRect.left, TextBoxRect.top, SRCCOPY);
   DrawText(hdc, str, -1, amp;TextBoxRect, DT_LEFT | DT_NOCLIP);