Двойная буферизация для моего меню

Я реализовал двойную буферизацию в моем приложении, используя код ниже.
После защиты я обнаружил, что мои дочерние окна (то есть, кнопки) не анимировались как обычно, поэтому я добавил WS_EX_COMPOSITED в мое родительское окно, и дочерние окна теперь анимируются правильно. Однако после добавления WS_EX_COMPOSITED мое меню, созданное из моего ресурса, становится черным и не отображается должным образом.

Итак, как добавить двойную буферизацию в мое главное меню?

MainWinHwnd = CreateWindowEx(WS_EX_COMPOSITED, MainWinClassName, MainWinTitle,
WS_VISIBLE|WS_BORDER|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SIZEBOX|WS_CLIPCHILDREN,
NULL, NULL, 609, 440, NULL, NULL, hInstance, NULL);
if (!MainWinHwnd) return FALSE;

case WM_PAINT:
{
RECT WinRt;
RECT TxtRt;
HFONT TxtFont = NULL;
SIZE TxtSize;

HDC WinDC = GetDC(hWnd);
GetClientRect(hWnd, &WinRt);
HDC WinBuffer = CreateCompatibleDC(WinDC);
HBITMAP BitBuffer = CreateCompatibleBitmap(WinDC, WinRt.right, WinRt.bottom);
SelectObject(WinBuffer, BitBuffer);

FillRect(WinBuffer, &WinRt, (HBRUSH) (COLOR_BTNFACE + 1));

SetBkColor(WinBuffer, GetSysColor((COLOR_BTNFACE)));

DrawThemeBackground(ButtonThemeData, WinBuffer, BP_GROUPBOX, GBS_NORMAL, &GroupOptionBox, NULL);
DrawThemeBackground(DragDropThemeData, WinBuffer, RP_GRIPPER, 0, &DragDropItem, NULL);

for (DWORD I = 0; I < sizeof(MainWinLabels) / sizeof(CustomLabel); I++)
{
if (MainWinLabels[I].Font == NULL)
{
TxtFont = CreateFontA(MainWinLabels[I].cFontHeight, NULL, NULL, NULL, FW_DONTCARE,
MainWinLabels[I].cFontItalic, MainWinLabels[I].cFontUnderline,
MainWinLabels[I].cFontStrikeOut, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
MainWinLabels[I].cFontQuality, DEFAULT_PITCH, MainWinLabels[I].cFontFaceName);
if (TxtFont == NULL) continue;
SelectObject(WinBuffer, TxtFont);
}
else SelectObject(WinBuffer, *MainWinLabels[I].Font);

SetTextColor(WinBuffer, MainWinLabels[I].Color);

TxtRt.left = MainWinLabels[I].X;
TxtRt.top = MainWinLabels[I].Y;

DrawTextA(WinBuffer, MainWinLabels[I].Text, strlen(MainWinLabels[I].Text), &TxtRt,
DT_LEFT|DT_SINGLELINE|DT_NOCLIP);

GetTextExtentPoint32A(WinBuffer, MainWinLabels[I].Text, strlen(MainWinLabels[I].Text), &TxtSize);
MainWinLabels[I].Width = TxtSize.cx;
MainWinLabels[I].Height = TxtSize.cy;

if (TxtFont != NULL) DeleteObject(TxtFont);
}

BitBlt(WinDC, 0, 0, WinRt.right, WinRt.bottom, WinBuffer, 0, 0, SRCCOPY);

ReleaseDC(hWnd, WinDC);
DeleteObject(BitBuffer);
DeleteDC(WinBuffer);

break;
}

1

Решение

Решение:

  1. Не используйте WS_EX_COMPOSITED.
  2. Вместо использования GetDC (hWnd) используйте BeginPaint (hwnd, &ps) и EndPaint (hwnd, &пс)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]