MFC鼠标单击截获鼠标双击事件,且没法记录单击的数据的解决方案

遇到的问题:ios

  1. 鼠标点击会截断鼠标双击的事件,没法保存椭圆的数据。也就是说双击执行的过程是OnLButtonDown,OnLButtonUp,OnLButtonDblClk,OnLButtonUp。并非想象中的直接执行OnLButtonDblClk,那么若是在OnLButtonDown中定义起始点,OnLButtonUp中定义终点,椭圆能够直接画出,可是双击时,会先执行OnLButtonDown,OnLButtonUp那么起点和终点就会被从新覆盖,且覆盖后的点的坐标都同样,而后才执行OnLButtonDblClk,此时,起点和终点相同,就无法再画椭圆,并且最后还会再执行一次OnLButtonUp。

    那么如何解决问题?数组

    刚开始百度发现他们是经过判断鼠标两次点击的时间差是否小于系统定义的时间差500,鼠标双击会先执行一次OnLButtonDown而后在第二次的OnLButtonDown来判断是否是鼠标在双击,然而这种方法仍是会将原始数据覆盖,没法保存那条线的数据。app

    后来我在睡觉前忽然想到能够经过数组来保存原始数据,经过数组的下标来控制鼠标双击时的数据保存到另外一个数组中,以免数据的覆盖,因而写出上面的程序。this

  1. MFC中数据的查看

    MFC中如何查看数据,刚开始打算直接使用TextOut来直接输出执行过程当中的数据,可是,它只支持CString类型,遇到int型还要sprintf转格式,太麻烦,并且也不能实时刷新,显示的范围还有限。spa

    使用控制台输出,但是MFC执行时 ,连控制台的界面都没见。code

        只能使用文件流来输出信息。blog

实现思路:事件

1经过两点画椭圆ip

2.以这将这两点组合到一块儿,也就是能够看作一条线决定了一个椭圆。每画一个椭圆就往线的数组里记录一次。数据分析

3.获取鼠标双击的坐标,并判断这点是否在椭圆内部,若是在内部,则重画椭圆(带填充)并将线的数组清空,若是不在,则继续双击时,线的数组的下标不增长,从新覆盖数据,而后再判断这个点是否在椭圆内。

程序:

全局变量
 1 CPoint start_p,end_p;
 2 bool flag=true;//双击时的点是否在椭圆内
 3 ofstream myfile;
 4 int i=0;//用来计数线的数组
 5 
 6 class Line{
 7 public :
 8     CPoint p1,p2;
 9     Line(){
10         p1.SetPoint(0,0);
11         p2.SetPoint(0,0);
12     }
13     void set_p1( CPoint a1){
14         p1.SetPoint(a1.x,a1.y);
15     }
16     void set_p2( CPoint a2){
17         p2.SetPoint(a2.x,a2.y);
18     }
19 
20 };
21 
22 Line l[30];

 





1
// CMy91View 消息处理程序
 2 
 3 
 4 void CMy91View::OnLButtonDown(UINT nFlags, CPoint point)  5 {  6     // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ
 7 
 8  CView::OnLButtonDown(nFlags, point);  9 
 10     
 11     //单击
 12         start_p=point;  13  l[i].set_p1(point);  14 
 15         myfile.open("1.txt",ios::app);  16         myfile<<"单击OnLButtonDown:"<<endl;  17         myfile<<"l:"<<i<<endl;  18         myfile<<"p1:("<<l[i].p1.x<<","<<l[i].p1.y<<")"<<endl;  19         myfile<<"p2:("<<l[i].p2.x<<","<<l[i].p2.y<<")"<<endl;  20         myfile<<endl<<endl;  21  myfile.close();  22     
 23 }  24 
 25 
 26 void CMy91View::OnLButtonUp(UINT nFlags, CPoint point)  27 {  28     // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ
 29 
 30  CView::OnLButtonUp(nFlags, point);  31 
 32     if(1){  33         end_p=point;  34  l[i].set_p2(point);  35 
 36         CClientDC dc(this);  37  dc.Ellipse(start_p.x,start_p.y,end_p.x,end_p.y);  38         
 39         myfile.open("1.txt",ios::app);  40         myfile<<"单击OnLButtonUp:"<<endl;  41         myfile<<"l:"<<i<<endl;  42         myfile<<"p1:("<<l[i].p1.x<<","<<l[i].p1.y<<")"<<endl;  43         myfile<<"p2:("<<l[i].p2.x<<","<<l[i].p2.y<<")"<<endl;  44         myfile<<endl<<endl;  45  myfile.close();  46 
 47         //判断是否是双击,双击后会让下一个坐标的p2点不为0,但p1点为0;
 48         if(l[i].p1.x!=0&&l[i].p1.y!=0){  49             i++;//增长椭圆
 50         }else{  51             if(i>0&&!flag){  52                 i--;//不在圆内双击,计数减1,,从新计数
 53  }  54 
 55  }  56 
 57  }  58 }  59 
 60 //判断一个点是否在椭圆内部
 61 bool in_Elliplse(CPoint p1,CPoint p2,CPoint p3){  62     CPoint center((p1.x+p2.x)/2,(p1.y+p2.y)/2);  63     CPoint  r(abs(p1.x-p2.x)/2,abs(p1.y-p2.y));  64     CPoint p3_0(p3.x-center.x,p3.y-center.y);  65 
 66     if(r.x>r.y){  67         double x=pow((double)p3_0.x,2)/pow((double)r.x,2);  68         double y=pow((double)p3_0.y,2)/pow((double)r.y,2);  69         if(x+y<=1){  70             return true;  71         }else{  72             return false;  73  }  74     }else{  75         double x=pow((double)p3_0.y,2)/pow((double)r.x,2);  76         double y=pow((double)p3_0.x,2)/pow((double)r.y,2);  77         if(x+y<=1){  78             return true;  79         }else{  80             return false;  81  }  82  }  83     
 84 }  85 
 86 void CMy91View::OnLButtonDblClk(UINT nFlags, CPoint point)  87 {  88     // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ
 89 
 90  CView::OnLButtonDblClk(nFlags, point);  91         
 92         myfile.open("1.txt",ios::app);  93         myfile<<"双击"<<endl<<"OnLButtonDblClk:"<<endl;  94         myfile<<"l:"<<i<<endl;  95         myfile<<"p1:("<<l[i].p1.x<<","<<l[i].p1.y<<")"<<endl;  96         myfile<<"p2:("<<l[i].p2.x<<","<<l[i].p2.y<<")"<<endl;  97         myfile<<"l-1:"<<i-1<<endl;  98         myfile<<"p1:("<<l[i-1].p1.x<<","<<l[i-1].p1.y<<")"<<endl;  99         myfile<<"p2:("<<l[i-1].p2.x<<","<<l[i-1].p2.y<<")"<<endl; 100         myfile<<"l-2:"<<i-2<<endl; 101         myfile<<"p1:("<<l[i-2].p1.x<<","<<l[i-2].p1.y<<")"<<endl; 102         myfile<<"p2:("<<l[i-2].p2.x<<","<<l[i-2].p2.y<<")"<<endl; 103         myfile<<endl<<endl; 104  myfile.close(); 105         
106         //填充
107         if(in_Elliplse(l[i-2].p1,l[i-2].p2,l[i-1].p1)){ 108             CBrush brush(RGB(0,255,0)); 109             CClientDC dc(this); 110             dc.SelectObject(&brush); 111             dc.Ellipse(l[i-2].p1.x,l[i-2].p1.y,l[i-2].p2.x,l[i-2].p2.y); 112 
113             //从新计数
114             i=0; 115             
116             //清空椭圆
117             for(int a=0;a<30;a++){ 118                 CPoint p(0,0); 119  l[i].set_p1(p); 120  l[i].set_p2(p); 121  } 122             flag=true; 123         }else{ 124             flag=false; 125  } 126         
127         
128 }

数据分析:

使用文件流来输出信息,以下:

    在第一次鼠标按下再抬起时画椭圆,而后椭圆内双击填充时的数据信息:

单击OnLButtonDown:

l:0

p1:(270,94)

p2:(0,0)

 

 

单击OnLButtonUp:

l:0

p1:(270,94)

p2:(488,222)

 

 

单击OnLButtonDown:

l:1

p1:(391,176)

p2:(0,0)

 

 

单击OnLButtonUp:

l:1

p1:(391,176)

p2:(391,176)

 

 

双击

OnLButtonDblClk:

l:2

p1:(0,0)

p2:(0,0)

l-1:1

p1:(391,176)

p2:(391,176)

l-2:0

p1:(270,94)

p2:(488,222)

 

 

单击OnLButtonUp:

l:0

p1:(0,0)

    p2:(391,176)

    在第一次鼠标按下再抬起时画椭圆,而后椭圆外双击(能够任意次)这里就一次,而后在椭圆内双击填充时的数据信息:

单击OnLButtonDown:

l:0

p1:(335,85)

p2:(0,0)

 

 

单击OnLButtonUp:

l:0

p1:(335,85)

p2:(601,197)

 

 

单击OnLButtonDown:

l:1

p1:(397,284)

p2:(0,0)

 

 

单击OnLButtonUp:

l:1

p1:(397,284)

p2:(397,284)

 

 

双击

OnLButtonDblClk:

l:2

p1:(0,0)

p2:(0,0)

l-1:1

p1:(397,284)

p2:(397,284)

l-2:0

p1:(335,85)

p2:(601,197)

 

 

单击OnLButtonUp:

l:2

p1:(0,0)

p2:(397,284)

 

 

单击OnLButtonDown:

l:1

p1:(423,141)

p2:(397,284)

 

 

单击OnLButtonUp:

l:1

p1:(423,141)

p2:(423,140)

 

 

双击

OnLButtonDblClk:

l:2

p1:(0,0)

p2:(397,284)

l-1:1

p1:(423,141)

p2:(423,140)

l-2:0

p1:(335,85)

p2:(601,197)

 

 

单击OnLButtonUp:

l:0

p1:(0,0)

p2:(423,140)

实验结果:

 

程序的不足:

    在程序只有双击填充时,线的数组才会清空,下标再次重0开始,若是用户不双击,一直在画椭圆,那么最多画30个椭圆(这个数值能够任意修改),但这个数值不是无穷的。或许能够经过动态创建数组或者使用线性列表来解决。(若是有谁解决了,@我,你们一块儿进步)

相关文章
相关标签/搜索