c++利用MFC实现绘制两个矩形,并标识出重叠的部分

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 旱奇

 

posted @ 2017-05-19 15:18  旱奇  阅读(2340)  评论(0编辑  收藏  举报