设为首页 加入收藏

TOP

5.3.3 使用BitBlt()函数动态显示图像(2)
2013-10-07 13:02:31 来源: 作者: 【 】 浏览:52
Tags:5.3.3 使用 BitBlt 函数 动态 显示 图像

5.3.3  使用BitBlt()函数动态显示图像(2)

(4)上面实现了图片加载,并调整对话框中的图像控件大小以适应图像。现在就差绘制图像的过程。在这里需要打开类向导,重载WM_PAINT消息。重载得到对应函数OnPaint(),修改其实现如代码5.6所示。

代码5.6  OnPaint()函数的实现

  1. 01  void CDynamicPicDemoDlg::OnPaint()  
  2. 02  {  
  3. 03      if (IsIconic())  
  4. 04      {  
  5. 05          CPaintDC dc(this);  //得到设置DC  
  6. 06  
  7. 07          SendMessage(WM_ICONERASEBKGND, (WPARAM)
    dc.GetSafeHdc(), 0);  
  8. 08  
  9. 09          int cxIcon = GetSystemMetrics(SM_CXICON);
    //得到图标的x坐标  
  10. 10          int cyIcon = GetSystemMetrics(SM_CYICON);
    //得到图标的y坐标  
  11. 11          CRect rect;         //定义矩形区域对象  
  12. 12          GetClientRect(&rect);//得到客户区域  
  13. 13          int x = (rect.Width() - cxIcon + 1) / 2;  
  14. 14          int y = (rect.Height() - cyIcon + 1) / 2;  
  15. 15          dc.DrawIcon(x, y, m_hIcon);                 //画图标  
  16. 16      }  
  17. 17      else  
  18. 18      {   //得到picture控件的DC,图像将被绘制在控件上  
  19. 19          CPaintDC dc(GetDlgItem(IDC_PIC));  
  20. 20  
  21. 21          CRect rcclient; //得到客户区域  
  22. 22          //通过控件句柄得到控件区域  
  23. 23          GetDlgItem(IDC_PIC)->GetClientRect(&rcclient);  
  24. 24  
  25. 25          CDC memdc;      //内存DC  
  26. 26  
  27. 27          memdc.CreateCompatibleDC(&dc);        
    //从控件DC生成内存DC  
  28. 28          CBitmap bitmap; //定义图像对象  
  29. 29          /从内存DC创建bitmap  
  30. 30          bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(),  
  31.             rcclient.Height());  
  32. 31  
  33. 32          memdc.SelectObject( &bitmap );          //设置对象  
  34. 33          //调用默认OnPaint  
  35. 34          CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);  
  36. 35          CDC maskdc;  
  37. 36          maskdc.CreateCompatibleDC(&dc);  
  38. 37          CBitmap maskbitmap;//定义图像对象  
  39. 38  //创建bitmap  
  40. 39          maskbitmap.CreateBitmap(rcclient.Width(), 
    rcclient.Height(),  
  41.             1, 1, NULL);  
  42. 40  
  43. 41          maskdc.SelectObject( &maskbitmap ); //设置对象  
  44. 42          maskdc.BitBlt( 0, 0, rcclient.Width(),
    rcclient.Height(),  
  45.             &memdc,         //绘制图像到控件区域  
  46. 43              rcclient.left, rcclient.top, SRCCOPY);  
  47. 44  
  48. 45          CBrush brush;   //定义笔刷变量  
  49. 46  
  50. 47          brush.CreatePatternBrush(&m_bmp);       //创建笔刷  
  51. 48          dc.FillRect(rcclient, &brush);          //填充客户区域  
  52. 49          //开始绘制真实的图像  
  53. 50          dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(),  
  54.             rcclient.Height(),  
  55.                 &memdc, rcclient.left, rcclient.top,SRCPAINT);  
  56. 51          brush.DeleteObject();                   //删除笔刷对象  
  57. 52      }  
  58. 53  } 

(5)程序编译并运行,其效果如图5.11所示。

 
(点击查看大图)图5.11  DynamicPicDemo运行效果

从最后的执行效果上看,和图5.6相似。不过读者在这里需要注意,使用BitBIt()函数时,图片资源是从文件中得到的,而不是作为程序资源,在生成程序时已经存在。这样做的好处是使程序变得小巧、灵活,图片也可以随时替换。

技巧:BitBlt函数可以在对话框的任何位置画图,但要记住显示屏的X坐标是从左到右增加,Y坐标是从上向下增加。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.3.3 使用BitBlt()函数动态显示.. 下一篇5.3.2 通过对话框背景显示图像

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: