加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winapi – 关于Windows GDI的困惑.新手程序员

发布时间:2020-12-14 03:53:16 所属栏目:Windows 来源:网络整理
导读:我是一名中国学生,这是我在国外论坛上提出的第一个问题. 我写了两个程序,一个可以正常运行,但另一个程序失败了. 这是正常的: case WM_PAINT: hdc = BeginPaint (hwnd,ps) ; if(fIsTime) ShowTime(hdc,st); else ShowDate(hdc,st); EndPaint (hwnd,ps) ; ret
我是一名中国学生,这是我在国外论坛上提出的第一个问题.
我写了两个程序,一个可以正常运行,但另一个程序失败了.

这是正常的:

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,cyClient,hdc,SRCCOPY);

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

两个代码之间的唯一区别是WM_Paint代码块,后者无法显示任何内容.我对后一个代码中的错误位置感到困惑?

解决方法

您最大的问题是您为BitBlt调用交换了源和目标DC.第一个参数应该是目标,而不是源.

此外,将位图设置为DC时,必须记住返回给您的旧值,并在完成后将其还原.

请尝试以下方法:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读