Я создаю то, что должно быть очень простым приложением Win32 С++, единственной целью которого является ТОЛЬКО отображать полупрозрачный 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.
Что можно сделать, чтобы окно перерисовывало, когда содержимое под ним изменяется?