Я создаю то, что должно быть очень простым приложением 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.
Что можно сделать, чтобы окно перекрасилось при изменении содержимого под ним?