1

私は GDI プログラミングを行ったことがなく、暗闇の中で何回か写真を撮り、ドキュメントを検索しても、ある DC の内容を別の DC にコピーする正しい方法が見つかりませんでした。

現時点で持っているコードは以下です。なぜ機能しないのかわかりません (ウィンドウは作成後も空白のままです)。

SIZE srcSize;
// ... Get size of source DC

HDC destDC = ...;   // from GetDC(myWindow), myWindow was
                    // sized before this to properly contain source
HDC sourceDC = ...;

HBITMAP buffer = CreateCompatibleBitmap(sourceDC, srcSize.cx, srcSize.cy);
HGDIOBJ oldObj = SelectObject(destDC, buffer);
BitBlt(destDC, 0, 0, srcSize.cx, srcSize.cy, sourceDC, 0, 0, SRCCOPY);
SelectObject(destDC, oldObj);
DeleteObject(buffer);

//... ReleaseDC()s here

これが行われる適切な方法は何ですか?

4

2 に答える 2

2

ある DC から別の DC にコピーするために必要なのは、BitBlt. 動作するコードは以下です。

SIZE srcSize;
// ... Get size of source DC

HDC destDC = ...;   // from GetDC(myWindow), myWindow was
                    // sized before this to properly contain source
HDC sourceDC = ...;

BitBlt(destDC, 0, 0, srcSize.cx, srcSize.cy, sourceDC, 0, 0, SRCCOPY);
//... ReleaseDC()s here
于 2012-05-03T01:23:00.500 に答える
0

あなたが何をしようとしているのか、私にはよくわかりません。最初に、なぜ新しいビットマップを作成し、それをウィンドウ (申し訳ありませんが、「クライアント領域」) DC に選択するのですか? 必要なのは、ウィンドウをペイント/描画することだけですよね? その場合、これは必要ありません。destDC は、まさにウィンドウのクライアント領域の表面です。

sourceDC には本当に何かが含まれていますか? たとえば、ビットマップが選択されていますか?

もちろん、WM_PAINT を処理する必要があります。このメッセージを処理すると、ウィンドウが検証されます。明示的に検証する必要はありません。GetDC()/ReleaseDC() を使用することは、「描画」ではなく「描画」と呼ばれます。過去に作成したアプリケーションでは、サイズ変更に対応するためのペイント (WM_PAINT の処理)、最小化された状態からの終了、ウィンドウを前面に移動する (以前に別のウィンドウに隠れていた場合)、および特定の変更をすぐに行うための描画の両方の方法を使用する必要がありました。 (ウィンドウを無効にして、アプリケーションが最初にアイドル状態にほぼ入るのを待つ代わりに、WM_PAINT は優先度の低いメッセージであることに注意してください)。

お役に立てれば

于 2012-05-03T16:23:26.800 に答える