【问题标题】:The confusion about windows GDI. Novice Programmer关于 windows GDI 的困惑。新手程序员
【发布时间】:2014-12-01 12:00:07
【问题描述】:

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

这是正常的:

 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 代码块,后者不能显示任何内容。我对后面代码中的错误在哪里感到困惑?

【问题讨论】:

    标签: winapi


    【解决方案1】:

    您最大的问题是您将源 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 ;
    

    【讨论】:

    • 哦,我颠倒了目的地和来源..非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多