4

我是一名中国学生,这是我在外国论坛上提出的第一个问题。我写了两个程序,一个可以正常运行,另一个失败。

这是正常的:

 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 ;

两个代码之间唯一的区别是WM_Paint代码块,后一个不能显示任何东西。我对后一个代码中的错误在哪里感到困惑?

4

1 回答 1

5

您最大的问题是您为BitBlt呼叫交换了源 DC 和目标 DC。第一个参数应该是目的地,而不是来源。

此外,当您将位图设置为 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 回答