

■ 質問内容  
以下のプログラムで、ブラウザのデバイスコンテキストをデスクトップの左上に貼り付けると  
最初は表示されますが、ブラウザを一度最小化して元のサイズに戻してからプログラムを実行すると、  
Firefoxの場合は空白、Edgeの場合は黒箱が表示されます。  
なぜウインドウの内容が表示されないのでしょうか？  
また、表示されるようにするにはどうしたら良いでしょうか？

■ ソースコード  
**bitbtl01.c**

[code]

    #include <windows.h>
    
    #pragma comment(lib, "user32")
    #pragma comment(lib, "gdi32")
    
    int main()
    {
        HWND hwnddesk = GetDesktopWindow();
        HWND hwndsrc = GetForegroundWindow();
        HDC hdcdest = GetDC(hwnddesk);
        HDC hdcsrc = GetDC(hwndsrc);
    
        BitBlt(hdcdest, 0, 0, 300, 300, hdcsrc, 0, 0, SRCCOPY|CAPTUREBLT);
    
        ReleaseDC(hwnddesk, hdcdest);
        ReleaseDC(hwndsrc, hdcsrc);
    
        return 0;
    }
    
[/code]

■ 再現方法  
cl /EHsc bitblt01.c  
sleep 3; .\bitblt01.exe  
ブラウザをマウスでクリック

■ 環境  
OS: Windows 10 professional 64bit  
ブラウザ: Firefox 105.0.1 or Microsoft Edge 106.0.1370.34 (公式ビルド) (64 ビット)


CC BY-SA 4.0
2022-10-07T00:54:03.610
91473
2022-10-07T11:12:23.290
2022-10-07T01:21:13.033
54326
54326
question
windows winapi visual-c++
ブラウザを最小化して元のサイズに戻すとデバイスコンテキストが空白ですがなぜでしょうか？


描いたらそこで終わりではなく、その状態を維持するには描画要求に対して再描画する必要があります。  
まずは、Windows デスクトップアプリケーションの作成方法について学ばれるとよろしいかと。  
「モジュール 1 初めての Windows プログラム」  
<https://learn.microsoft.com/ja-jp/windows/win32/learnwin32/your-first-
windows-program>

私が実装するなら、  
(1)
ブラウザのキャプチャを保存する領域を作成する(CreateCompatibleDC/CreateCompatibleBitmap/SelectObject)  
(2) ウインドウを作成し、SetParent でデスクトップに張り付ける  
(3) ウィンドウが WM_PAINT メッセージを受け取ったら(1) から画像を転送する  
という感じにすると思います。


CC BY-SA 4.0
2022-10-07T11:12:23.290
91486
2022-10-07T11:12:23.290
50741
91473
answer