半透明のPNGのみを表示することを唯一の目的とする非常に単純なWin32C++アプリを作成しています。ウィンドウにはクロムが含まれていてはならず、すべての不透明度は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;
}
注意すべき点の1つは、アプリケーションは常に画面の左側にドッキングされており、移動しないことです。ただし、ユーザーがアプリケーションの下にあるウィンドウを開いたり、閉じたり、移動したりすると、アプリケーションの下にあるものが変わる可能性があります。
アプリケーションが最初に起動したとき、それは完璧に見えます。PNGの透明な(そして同様に透明な)部分は完全に透けて見えます。ただし、アプリケーションの下の背景が変更されても、背景は更新されません。アプリケーションが最初に起動されたときと同じままです。実際、WM_PAINT(またはバックグラウンドが変更されたときにWM_ERASEBKGNDは呼び出されません)。
私はこれでかなり長い間遊んでいて、100%正しくなることに近づいていますが、完全にはそこにありません。たとえば、背景を(HBRUSH)NULL_BRUSHに設定し、WM_ERASEBKGNDを処理しようとしました。
ウィンドウの下の内容が変更されたときにウィンドウを再描画するにはどうすればよいですか?