11.6.3 截图功能的设计与实现(3)
【代码解析】
第3行判断是否已经绘制橡皮筋框,如是则在第5行根据当前鼠标坐标设置橡皮筋框的大小,并重绘界面。在第9行更新消息编辑框中鼠标所在点RGB值的信息。
(3)当以上鼠标动作完成后,需要处理鼠标左键抬起动作,以完成用户对橡皮筋框的操作。
- 01 void CCatchDlg::OnLButtonUp(UINT nFlags, CPoint point)
- 02 {
- 03 m_bShowMsg=FALSE;
- 04 m_bDraw=FALSE;
- 05 SetTip();
- 06 UpdateWindow();
- 07 CDialog::OnLButtonUp(nFlags, point);
- 08 }
【代码解析】
当鼠标左键抬起后,关闭橡皮筋信息提示框,并更新信息编辑框的内容,刷新界面。
(4)为了使用户操作更加明了,在绘制、拖动及缩放编辑框时,应为鼠标更换不同的光标。
- 01 BOOL CCatchDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
- 02 {
- 03 //设置改变截取矩形大小时的光标
- 04 if (pWnd == this && m_rectTracker.SetCursor(this, nHitTest))
- 06 return TRUE;
- 07 else
- 08 {//设置彩色光标
- 09 SetCursor(AfxGetApp()->LoadCursor(IDC_COLOR));
- 10 return TRUE;
- 11 }
- 12 return CDialog::OnSetCursor(pWnd, nHitTest, message);
- 13 }
【代码解析】
当鼠标在橡皮筋框中或橡皮筋框内时,调用橡皮筋类的光标。当光标在橡皮筋框外时,载入自定义的鼠标光标IDC_COLOR。
(5)在完成截图区域选择后,可以双击鼠标左键,将截取的图片保存到剪切板上,以实现截图的功能。
- 01 void CCatchDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
- 02 {
- 03 int nHitTest;
- 04 m_rectTracker.m_rect.NormalizeRect(); //使矩形规范化
- 05 nHitTest=m_rectTracker.HitTest(point); //鼠标与橡皮筋框位置关系
- 06 if(nHitTest==8)
- 07 {//在区域内处理
- 08 CopyScreenToBitmap(m_rectTracker.m_rect,TRUE);
- //将图像保存到剪切板
- 09 PostQuitMessage(0); //退出程序
- 10 }
- 11 CDialog::OnLButtonDblClk(nFlags, point);
- 12 }
【代码解析】
第4行将橡皮筋选择框所选的矩形规范化,使其高度和宽度均为正值。第5行获取鼠标位置与橡皮筋框之间的关系。第6行判断鼠标是否在橡皮筋框内,如是则在第8行调用CopyScreenToBitmap()函数将用户截取的图像保存到剪切板。在第9行退出程序。
(6)有时用户对所选区域不满意,又不想通过调整橡皮筋框来实现。这时就需要用户重新绘制橡皮筋框,而重绘之前需要右击鼠标,以取消上次绘制的橡皮筋框。
- 01 void CCatchDlg::OnRButtonDown(UINT nFlags, CPoint point)
- 02 {
- 03 //如果已经截取矩形则清除截取的矩形
- 04 m_bFirstDraw=FALSE;
- 05 m_rectTracker.m_rect.SetRect(-1,-1,-1,-1);
- 06 SetTip();
- 07 UpdateWindow();
- 08 CDialog::OnRButtonDown(nFlags, point);
- 09 }