c++利用MFC实现绘制两个矩形,并标识出重叠的部…
2018-06-17 22:34:57来源:未知 阅读 ()
1.问题描述
利用c++实现用鼠标点击任意位置,在此位置绘制矩形。并且给两个矩形重叠部分,涂上颜色加以区分。具体效果如下图所示:
2.关键代码
此程序关键之处在于对鼠标行为的捕获,至于怎么求出两个矩形的重叠部分就更简单了。MFC框架有一个CRect类,这个类有一个IntersectRect()函数可以很容易的求出,两个矩形重叠部分,IntersectRect()具体用法见IntersectRect百度百科。
1 BOOL CMFCApplication2Dlg::PreTranslateMessage(MSG * pMsg) 2 { 3 if (pMsg->message == WM_LBUTTONDOWN)//左键按下 4 { 5 if (Rect_count == 2) 6 { 7 Invalidate(); 8 Rect_count = 0; 9 } 10 startRect = true; 11 CPoint pt; 12 GetCursorPos(&pt); 13 points[0] = pt; 14 points[1] = pt; 15 } 16 else if (pMsg->message == WM_LBUTTONUP)//左键抬起 17 { 18 CBrush brush(RGB(5, 25, 255)); 19 CClientDC dc(this); 20 21 Rect_count += 1; 22 startRect = false; 23 CRect mRect; 24 GetClientRect(&mRect); 25 ClientToScreen(&mRect); 26 27 CPoint pt; 28 GetCursorPos(&pt); 29 points[1] = pt; 30 31 dc.Rectangle(points[0].x-mRect.left, points[0].y - mRect.top, points[1].x - mRect.left, points[1].y - mRect.top); 32 33 if (Rect_count == 1) 34 { 35 Rect1 = CRect(points[0], points[1]); 36 } 37 if (Rect_count == 2) 38 { 39 Rect2 = CRect(points[0], points[1]); 40 if (IntersectRect(interRect, Rect1, Rect2)) 41 { 42 interRect.SetRect(interRect.TopLeft().x - mRect.left, interRect.TopLeft().y - mRect.top, interRect.BottomRight().x - mRect.left, interRect.BottomRight().y - mRect.top); 43 dc.FillRect(interRect, &brush); 44 } 45 } 46 } 47 else if (pMsg->message == WM_MOUSEMOVE) //光标移动 48 { 49 CRect mRect; 50 GetClientRect(&mRect); 51 ClientToScreen(&mRect); 52 CClientDC dc(this); 53 dc.SetROP2(R2_NOT); //此为关键!!! 54 dc.SelectStockObject(NULL_BRUSH); //不使用画刷 55 CPoint pt; 56 GetCursorPos(&pt); 57 if (true == startRect) 58 { 59 dc.Rectangle(points[0].x - mRect.left, points[0].y - mRect.top, points[1].x - mRect.left, points[1].y - mRect.top); 60 dc.Rectangle(points[0].x - mRect.left, points[0].y - mRect.top, pt.x - mRect.left, pt.y - mRect.top); 61 points[1] = pt; 62 } 63 } 64 return CDialog::PreTranslateMessage(pMsg); 65 }
以上代码的个别变量的声明如下(是在.h的头文件里面声明的):
1 //变量 2 CPoint points[2];//这俩个点分别代表矩形主对角线的两个端点 3 bool startRect=false;//指示是否按下鼠标左键 4 int Rect_count = 0;//记录画了几个矩形了 5 CRect Rect1,Rect2, interRect;//我们只画两个矩形,Rect1代表第一次画的矩形,Rect2代表第二次画的矩形,interRect代表两个矩形相交的矩形
整个项目源代码GitHub地址:https://github.com/wbi12138/DrawRectangle
另外避免出错请用vs2015以上的版本打开项目。
2017-05-19 15:16:06 by 旱奇
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Discrete Logging
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash