设为首页 加入收藏

TOP

11.6.3 截图功能的设计与实现(1)
2013-10-07 14:35:44 来源: 作者: 【 】 浏览:46
Tags:11.6.3 截图 功能 设计 实现

11.6.3  截图功能的设计与实现(1)

在实现了复制桌面图像到窗体背景后,用户便可以在窗体上选取合适的区域进行截图。选取区域需要借助橡皮筋,因此截图功能首先需要实现的就是绘制橡皮筋框。

  1. 01  void CCatchDlg::OnPaint()   
  2. 02  {  
  3. 03      CPaintDC dc(this);  
  4. 04      if(m_bShowMsg&&m_bFirstDraw)  
  5. 05      {//显示截取矩形大小信息  
  6. 06          CRect rect;  
  7. 07          m_rectTracker.GetTrueRect(&rect);  
  8. 08          SetMessage(rect);  
  9. 09      }  
  10. 10      if(m_bFirstDraw)  
  11. 11      {//画出橡皮筋矩形  
  12. 12          m_rectTracker.Draw(&dc);  
  13. 13      }  
  14. 14  }  

【代码解析】

在窗体的OnPaint()函数的第12行实现了绘制橡皮筋框的功能。而在这个函数的第4~9行实现了显示橡皮筋框信息的功能。在第7行获取橡皮筋框的大小信息,然后在第8行将橡皮筋框的大小作为参数调用自定义函数SetMessage()。SetMessage()函数实现了在绘制、拖动、缩放橡皮筋框时,提示橡皮筋框的大小及位置的功能,实现如下:

  1. 01  void CCatchDlg::SetMessage(CRect dRect)  
  2. 02  {  
  3. 03      CClientDC dc(this);  
  4. 04      CPoint pt;   
  5. 05      GetCursorPos(&pt);                      //获取鼠标位置  
  6. 06      const int space=3;                      //截取矩形大小信息离鼠标间隔  
  7. 07      CPen pen(PS_SOLID,1,RGB(147,147,147));  
  8. 08      dc.SetTextColor(RGB(147,147,147));      //设置字体颜色大小  
  9. 09      CFont font;  
  10. 10      font.Create PointFont(90,"宋体");  
  11. 11      dc.SelectObject(&font);                 //将字体选入设备  
  12. 12      dc.SetBkMode(TRANSPARENT);  
  13. 13      TEXTMETRIC tm;  
  14. 14      int charHeight;  
  15. 15      CSize size;  
  16. 16      int lineLength;   
  17. 17      dc.GetTextMetrics(&tm);       
  18. 18      charHeight = tm.tmHeight+tm.tmExternalLeading;  //得到字体高度  
  19. 19      size=dc.GetTextExtent("顶点位置  ",strlen("顶点位置  "));  
  20. 20      lineLength=size.cx;  
  21. 21      //初始化矩形,以保证写下6行文字  
  22. 22      CRect rect(pt.x+space,pt.y-charHeight*6-space,pt.x+lineLength+   
  23.         space,pt.y-space);  
  24. 23      int x = GetDeviceCaps(dc, HORZRES);  
  25. 24      int y = GetDeviceCaps(dc, VERTRES);  
  26. 25      CRect rectTemp;  
  27. 26      //当矩形到达桌面边缘时调整方向和大小  
  28. 27      if((pt.x+rect.Width())>=x)              //桌面上方不能显示完整矩形  
  29. 28      {  
  30. 29          rectrectTemp=rect;  
  31. 30          rectrectTemp.left=rect.left-rect.Width()-space*2;  
  32. 31          rectrectTemp.right=rect.right-rect.Width()-space*2;;  
  33. 32          rect=rectTemp;  
  34. 33      }  
  35. 34      if((pt.y-rect.Height())<=0)             //桌面右方不能显示完整矩形  
  36. 35      {  
  37. 36          rectrectTemp=rect;  
  38. 37          rectrectTemp.top=rect.top+rect.Height()+space*2;;  
  39. 38          rectrectTemp.bottom=rect.bottom+rect.Height()+space*2;;  
  40. 39          rect=rectTemp;  
  41. 40      }  
  42. 41      dc.SelectObject((HBRUSH)GetStockObject(NULL_BRUSH));  
  43. 42      dc.Rectangle(rect);                     //创建空画刷画矩形  
  44. 43      rect.top+=2;  
  45. 44      CString string(" 顶点位置 ");  
  46. 45      dc.TextOut(rect.left,rect.top,string);  //在矩形中显示文字  
  47. 46      string.Format(" (%d,%d)",dRect.left,dRect.top);  
  48. 47      dc.TextOut(rect.left,rect.top+charHeight,string);   //显示顶点位置  
  49. 48      string=" 矩形大小 ";  
  50. 49      dc.TextOut(rect.left,rect.top+charHeight*2,string);  
  51. 50      string.Format(" (%d,%d)",dRect.Width(),dRect.Height());  
  52. 51      dc.TextOut(rect.left,rect.top+charHeight*3,string);       
  53.                                                 //显示橡皮筋大小  
  54. 52      string=" 光标坐标 ";  
  55. 53      dc.TextOut(rect.left,rect.top+charHeight*4,string);  
  56. 54      string.Format(" (%d,%d)",pt.x,pt.y);  
  57. 55      dc.TextOut(rect.left,rect.top+charHeight*5,string);   
  58.                                                 //显示当前光标位置  
  59. 56  }  

【代码解析】

第5、6行获取当前鼠标的位置。第9~11行设置当前设备环境字体大小及颜色。第12行将设备字体背景色设置为透明。第14~18行获取当前设备字体的高度及宽度。第22行定义一个矩形,在这个矩形中将要显示第6行信息,每行信息6个字符宽度。第23、24行获取屏幕的高度及宽度(像素)。在第27行判断当前橡皮筋框到屏幕左边之间的距离,是否满足显示信息的长度,当不能满足时,在第29~32行将信息框显示到橡皮筋框内部。同理,在第34行判断橡皮筋框及屏幕下边框之间的距离是否能够现实第6行信息数据,不能时,在第36~39行将信息显示到橡皮筋框的内部。第41、42行用空画刷绘制显示信息的矩形。第46、47行在矩形内显示橡皮筋框的顶点信息,第48~51行显示橡皮筋的大小信息,第52~55行显示当前鼠标光标的坐标(即橡皮筋框左下角顶点坐标)。

用户需要通过鼠标动作来实现绘制、拖动及缩放橡皮筋框,这3个动作都是通过鼠标左键来实现的,因此需要重载鼠标左键事件。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇11.6.3 截图功能的设计与实现(2) 下一篇11.6.3 截图功能的设计与实现(3)

评论

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