0

インターネットで多くの例を読みましたが、まだ立ち往生しています。アプリケーションに送信された WM_PAINT メッセージを処理しようとしています。

私のアプリケーションでは、常に という名前の同じ DC を描画しg_hDCます。それは完全に機能します。を受け取ると、 my の内容を から返された DC にWM_PAINT描画しようとします。私が描いた最後のビットマップが含まれていると思います。だから私はそれを元に戻したいだけです。g_hDCBeginPaintg_hDC

case WM_PAINT:
 PAINTSTRUCT ps;

 int ret;
 HDC compatDC;
 HDC currentDC;
 HDC paintDC;
 HBITMAP compatBitmap;
 HGDIOBJ oldBitmap;

 paintDC   = BeginPaint(g_hWnd, &ps);

 currentDC = GetDC(g_hWnd);
 compatDC  = CreateCompatibleDC(paintDC);
 compatBitmap=CreateCompatibleBitmap(paintDC, CONFIG_WINDOW_WIDTH, CONFIG_WINDOW_HEIGHT);
 oldBitmap=SelectObject(compatDC, compatBitmap);

 ret = BitBlt(compatDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              ps.rcPaint.right - ps.rcPaint.left,
              ps.rcPaint.bottom - ps.rcPaint.top,
              currentDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              SRCCOPY);

 ret = BitBlt(paintDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              ps.rcPaint.right - ps.rcPaint.left,
              ps.rcPaint.bottom - ps.rcPaint.top,
              compatDC,
              ps.rcPaint.left,
              ps.rcPaint.top,
              SRCCOPY);

  DeleteObject(SelectObject(compatDC, oldBitmap));
  DeleteDC(compatDC);
 DeleteDC(currentDC);

 EndPaint(g_hWnd, &ps);

壊す;

しかし、それは白い長方形を描くだけです...私は多くの可能性を試しましたが、何もうまくいきません。手伝ってくれませんか?

4

2 に答える 2

1

あなたが間違っていることはたくさんあります。

まず、保存g_hDCは実装の詳細に依存しています。ポインターが同じであることに気づき、ポインターを保存します。これは、GDI 側の最適化に関連するさまざまな理由 (たとえば、 DC キャッシュがあるなど) で短期的には機能する可能性がありますが、最終的には機能しなくなります。または、DC を持っていないときに DC ポインターを使用したくなるかもしれません。また、何か他のものに落書きしてしまうかもしれません (または、GDI オブジェクト スレッドのアフィニティが原因でそうしませんでした)。

外部のウィンドウの DC にアクセスする正しい方法WM_PAINTは、 を呼び出すことGetDC(hwnd)です。

CreateCompatibleDC()と互換性のあるメモリ内 DC を作成しhdcます。に描画するcompatDCだけでは十分ではありませんhdchdcに引き込んだ後、 に引き戻す必要がありますcompatDC。あなたの場合、2 つのBitBlt()呼び出しが必要になります。compatDC2 つ目はから に戻りますhdc詳細については、このサンプル コードを参照してください。

DeleteObject()DC に選択している間は、ビットマップを作成できません。あなたのSelectObject(compatDC, oldBitmap)電話はの DeleteObject(compatBitmap)に来る必要があります。(これは、i486 が彼の回答で得ようとしていたものです。)

(この回答は誤解を招くか、不完全であると確信しています。そうである場合はお知らせください。)

于 2014-12-16T13:06:57.090 に答える
0

これを使用してビットマットを削除します: DeleteObject( SelectObject(compatDC,oldBitmap) );- 前の行の DeleteBitmap なし。SelectObject現在の(古い)選択を戻り値として返します-そしてそれを削除します。あなたの場合、まだ選択されているビットマップを削除しようとしています。

PS: わかりませんCreateCompatibleDC- どこで compatDC を作成していますか? compatDC = CreateCompatibleDC( hdc );の前に追加しCreateCompatibleBitmapます。

于 2014-12-16T10:26:18.513 に答える