4

私は中国人学生で、外国のフォーラムで初めて質問しました。2 つのプログラムを作成しました。1 つは正常に実行できますが、もう 1 つは失敗しました。

これが通常のものです:

 case WM_PAINT:
      hdc = BeginPaint (hwnd, &ps) ;

      if(fIsTime)
          ShowTime(hdc, &st);
      else
          ShowDate(hdc, &st);

      EndPaint (hwnd, &ps) ;
      return 0 ;

失敗したものは次のとおりです。

 case WM_PAINT:
      hdc = BeginPaint (hwnd, &ps) ;
      hdcMem = ::CreateCompatibleDC(hdc);
      hBitmap = ::CreateCompatibleBitmap(hdc, cxClient, cyClient);
      ::SelectObject(hdcMem, hBitmap);

      if(fIsTime)
          ShowTime(hdcMem, &st);
      else
          ShowDate(hdcMem, &st);
      ::BitBlt(hdcMem, 0, 0, cxClient, cyClient, hdc, 0, 0, SRCCOPY);

      ::DeleteObject(hBitmap);
      ::DeleteDC(hdcMem);
      EndPaint (hwnd, &ps) ;
      return 0 ;

2 つのコードの唯一の違いはWM_Paintコード ブロックです。後者は何も表示できません。エラーが後者のコードのどこにあるのか混乱していますか?

4

1 に答える 1

5

最大の問題は、発信元 DC と宛先 DC がBitBlt呼び出しのために交換されていることです。最初のパラメーターは、ソースではなく宛先にする必要があります。

また、ビットマップを DC に設定する場合は、返された古い値を記憶し、終了時に復元する必要があります。

次のことを試してください。

  hdc = BeginPaint (hwnd, &ps) ;
  hdcMem = ::CreateCompatibleDC(hdc);
  hBitmap = ::CreateCompatibleBitmap(hdc, cxClient, cyClient);
  hbmpOld = ::SelectObject(hdcMem, hBitmap);

  if(fIsTime)
      ShowTime(hdcMem, &st);
  else
      ShowDate(hdcMem, &st);
  ::BitBlt(hdc, 0, 0, cxClient, cyClient, hdcMem, 0, 0, SRCCOPY);

  ::SelectObject(hdcMem, hbmpOld);
  ::DeleteObject(hBitmap);
  ::DeleteDC(hdcMem);
  EndPaint (hwnd, &ps) ;
  return 0 ;
于 2013-01-21T04:37:13.227 に答える