1

画面の 0x0 (左上) の位置から 500x500 のスクリーンショットを取得して、ウィンドウに配置しようとしています。

これが私のコードです(hwnd私のウィンドウハンドルです):

HDC appDc = GetDC(hwnd);
HDC dc = GetDC(NULL);
HBITMAP bitmap = CreateCompatibleBitmap(dc, 500, 500);
HDC memoryDc = CreateCompatibleDC(dc);
SelectObject(memoryDc, bitmap);
BitBlt(appDc, 0, 0, 500, 500, dc, 0, 0, SRCCOPY);
ShowWindow(hwnd, SW_SHOW);
SetWindowText(hwnd, _T("Window"));   

ここで何が欠けていますか?スクリーン キャプチャではなく、ウィンドウ内が黒くなります。

編集

以前はに変更memoryDcした後は機能 しますが、問題は SelectObject が機能していないことです。つまり、イメージを HBITMAP に配置していないということです。ただし、BitBlt はからコピーしていますdcBitBlt(appDc, 0, 0, 500, 500, memoryDc, 0, 0, SRCCOPY);dcappDc

4

2 に答える 2

1

まず、デバイス コンテキストに混乱があるようです。memoryDc から appDc にブリットしますが、memoryDc には何も含まれていません。dc と互換性があるように作成されていますが、コンテンツを共有しているわけではありません。また、例では DC を解放しません。

第二に、ShowWindow() への呼び出しは、ウィンドウが以前に表示されていなかったことを暗示しているようです。その場合、以前に「描画」されたものは実際には描画されておらず、ウィンドウに表示されません。画面の内容をビットマップにキャプチャし、WM_PAINT 中に表示します。

于 2011-03-31T11:34:58.297 に答える
0

ShowWindowコード ブロックの最後でアプリケーションのウィンドウを呼び出しているため、それ以前はウィンドウが表示されていないと想定します。

もしそうなら、それはあなたの問題です。なぜなら、非表示のウィンドウが再び表示されると、そのクライアント領域が常に再描画されるからです。これにより、背景がそのウィンドウのデフォルト ブラシ (この場合は明らかに黒いブラシ) で消去BitBltされ、デバイス コンテキスト (DC) に (関数を使用して) ペイントしたものはすべて失われます。

代わりに、スクリーン キャプチャを一時的なビットマップに描画することをお勧めします。次に、このビットマップのコピーを保持し、メッセージを受信するたびにウィンドウにペイントしWM_PAINTます。

于 2011-03-31T11:26:53.073 に答える