Я создаю то, что должно быть очень простым приложением Win32 C ++, единственной целью которого является ТОЛЬКО отображение полупрозрачного PNG. Окно не должно иметь хрома, а всю непрозрачность нужно контролировать в самом PNG.
Моя проблема в том, что окно не перерисовывается при изменении содержимого под окном, поэтому прозрачные области PNG застревают на том, что было под окном при первоначальном запуске приложения.
Вот строка, в которой я настраиваю новое окно:
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
Для вызова RegisterClassEx у меня есть этот набор для фона:
wcex.hbrBackground = (HBRUSH)0;
Вот мой обработчик сообщения WM_PAINT:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(*m_pBitmap, 0, 0);
EndPaint(hWnd, &ps);
break;
}
Следует отметить, что приложение всегда закреплено слева от экрана и не перемещается. Но то, что находится под приложением, может измениться, когда пользователь открывает, закрывает или перемещает окна под ним.
При первом запуске приложение выглядит идеально. Прозрачные (и почти прозрачные) части PNG отлично просматриваются. НО, когда фон под приложением изменяется, фон НЕ обновляется, он просто остается таким же, как при первом запуске приложения. Фактически, WM_PAINT (или WM_ERASEBKGND не вызывается при изменении фона).
Я играл с этим довольно долго и был близок к тому, чтобы получить 100% правильное решение, но не совсем так. Например, я попытался установить фон на (HBRUSH) NULL_BRUSH, и я попытался обработать WM_ERASEBKGND.
Что можно сделать, чтобы окно перерисовывалось при изменении содержимого под ним?