威尼斯人官网以免止数据的遮盖,通过数组的下标来支配鼠标双击时的多都尉存到另一个数组中

境遇的标题:

遇见的难题:

  1. 鼠标点击会截断鼠标双击的事件,不可以保存椭圆的数码。也就是说双击执行的长河是OnLButtonDown,OnLButtonUp,OnLButtonDblClk,OnLButtonUp。并不是想象中的直接实施OnLButtonDblClk,那么一旦在OnLButtonDown中定义初阶点,OnLButtonUp中定义终点,椭圆可以一直画出,可是双击时,会先执行OnLButtonDown,OnLButtonUp那么起源和终端就会被再次覆盖,且覆盖后的点的坐标都平等,然后才实施OnLButtonDblClk,此时,起源和终极相同,就无奈再画椭圆,而且最终还会再举行五遍OnLButtonUp。
  1. 鼠标点击会截断鼠标双击的风浪,不可以保存椭圆的数据。也就是说双击执行的历程是OnLButtonDown,OnLButtonUp,OnLButtonDblClk,OnLButtonUp。并不是想象中的直接实施OnLButtonDblClk,那么只要在OnLButtonDown中定义早先点,OnLButtonUp中定义终点,椭圆可以一贯画出,然而双击时,会先执行OnLButtonDown,OnLButtonUp那么起点和终极就会被重新覆盖,且覆盖后的点的坐标都一样,然后才实施OnLButtonDblClk,此时,起源和终端相同,就无奈再画椭圆,而且最后还会再实施两次OnLButtonUp。

    那么哪些缓解难题?

    那么什么样化解难点?

   
刚先河百度意识他们是通过判断鼠标一回点击的时间差是否低于系统定义的时刻差500,鼠标双击会先举办一回OnLButtonDown然后在其次次的OnLButtonDown来判定是否鼠标在双击,然则那种方法依旧会将本来数据覆盖,无法保存这条线的数码。

   
刚初叶百度发现她们是因此判断鼠标五回点击的时间差是不是低于系统定义的时刻差500,鼠标双击会先实施一遍OnLButtonDown然后在第二次的OnLButtonDown来判断是还是不是鼠标在双击,可是那种办法依旧会将原来数据覆盖,无法保存那条线的数据。

   
后来我在睡眠前突然想到可以透过数组来保存原有数据,通过数组的下标来决定鼠标双击时的数据保存到另一个数组中,以幸免数据的遮盖,于是写出地点的顺序。

   
后来本身在睡眠前突然想到可以因而数组来保存原有数据,通过数组的下标来决定鼠标双击时的数码保存到另一个数组中,以幸免数据的遮盖,于是写出地点的次第。

  1. MFC中数量的查阅
  1. MFC中数据的查看

   
MFC中哪些查看数据,刚起先打算直接行使TextOut来间接出口执行进度中的数据,不过,它只协助CString类型,蒙受int型还要sprintf转格式,太劳顿,而且也无法实时刷新,显示的范围还有限。

   
MFC中怎么样查看数据,刚起头打算直接利用TextOut来平素出口执行进度中的数据,不过,它只帮忙CString类型,碰到int型还要sprintf转格式,太勤奋,而且也不能够实时刷新,展现的限定还有限。

    使用控制台出口,不过MFC执行时 ,连控制台的界面都没见。

    使用控制台出口,不过MFC执行时 ,连控制台的界面都没见。

        只好拔取文件流来输出新闻。

        只可以使用文件流来输出音信。

兑现思路:

落到实处思路:

1经过两点画椭圆

1因此两点画椭圆

2.以那将那两点组合到一头,也就是能够用作一条线决定了一个椭圆。每画一个椭圆就往线的数组里记录四次。

2.以那将那两点组合到一同,也就是可以看作一条线决定了一个椭圆。每画一个椭圆就往线的数组里记录四遍。

3.获取鼠标双击的坐标,并认清那一点是不是在椭圆内部,假设在里面,则重画椭圆(带填充)并将线的数组清空,如若不在,则持续双击时,线的数组的下标不增加,重新覆盖数据,然后再判断那几个点是还是不是在椭圆内。

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 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 }
  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:

单击OnLButtonDown:

l:0

l:0

p1:(270,94)

p1:(270,94)

p2:(0,0)

p2:(0,0)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:0

l:0

p1:(270,94)

p1:(270,94)

p2:(488,222)

p2:(488,222)

 

 

 

 

单击OnLButtonDown:

单击OnLButtonDown:

l:1

l:1

p1:(391,176)

p1:(391,176)

p2:(0,0)

p2:(0,0)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:1

l:1

p1:(391,176)

p1:(391,176)

p2:(391,176)

p2:(391,176)

 

 

 

 

双击

双击

OnLButtonDblClk:

OnLButtonDblClk:

l:2

l:2

p1:(0,0)

p1:(0,0)

p2:(0,0)

p2:(0,0)

l-1:1

l-1:1

p1:(391,176)

p1:(391,176)

p2:(391,176)

p2:(391,176)

l-2:0

l-2:0

p1:(270,94)

p1:(270,94)

p2:(488,222)

p2:(488,222)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:0

l:0

p1:(0,0)

p1:(0,0)

    p2:(391,176)

    p2:(391,176)

   
在第四遍鼠标按下再抬起时画椭圆,然后椭圆外双击(可以任意次)那里就一遍,然后在椭圆内双击填充时的多少新闻:

   
在第四遍鼠标按下再抬起时画椭圆,然后椭圆外双击(能够任意次)那里就四遍,然后在椭圆内双击填充时的数额音讯:

单击OnLButtonDown:

单击OnLButtonDown:

l:0

l:0

p1:(335,85)

p1:(335,85)

p2:(0,0)

p2:(0,0)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:0

l:0

p1:(335,85)

p1:(335,85)

p2:(601,197)

p2:(601,197)

 

 

 

 

单击OnLButtonDown:

单击OnLButtonDown:

l:1

l:1

p1:(397,284)

p1:(397,284)

p2:(0,0)

p2:(0,0)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:1

l:1

p1:(397,284)

p1:(397,284)

p2:(397,284)

p2:(397,284)

 

 

 

 

双击

双击

OnLButtonDblClk:

OnLButtonDblClk:

l:2

l:2

p1:(0,0)

p1:(0,0)

p2:(0,0)

p2:(0,0)

l-1:1

l-1:1

p1:(397,284)

p1:(397,284)

p2:(397,284)

p2:(397,284)

l-2:0

l-2:0

p1:(335,85)

p1:(335,85)

p2:(601,197)

p2:(601,197)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:2

l:2

p1:(0,0)

p1:(0,0)

p2:(397,284)

p2:(397,284)

 

 

 

 

单击OnLButtonDown:

单击OnLButtonDown:

l:1

l:1

p1:(423,141)

p1:(423,141)

p2:(397,284)

p2:(397,284)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:1

l:1

p1:(423,141)

p1:(423,141)

p2:(423,140)

p2:(423,140)

 

 

 

 

双击

双击

OnLButtonDblClk:

OnLButtonDblClk:

l:2

l:2

p1:(0,0)

p1:(0,0)

p2:(397,284)

p2:(397,284)

l-1:1

l-1:1

p1:(423,141)

p1:(423,141)

p2:(423,140)

p2:(423,140)

l-2:0

l-2:0

p1:(335,85)

p1:(335,85)

p2:(601,197)

p2:(601,197)

 

 

 

 

单击OnLButtonUp:

单击OnLButtonUp:

l:0

l:0

p1:(0,0)

p1:(0,0)

p2:(423,140)

p2:(423,140)

试行结果:

试验结果:

威尼斯人官网 1

威尼斯人官网 2

 

 

程序的供不应求:

次第的不足:

   
在先后唯有双击填充时,线的数组才会清空,下标再度重0开首,假诺用户不双击,一直在画椭圆,那么最多画30个椭圆(这些数值可以肆意修改),但以此数值不是连连。或许能够通过动态建立数组或者选取线性列表来化解。(借使有什么人解决了,@我,大家齐声前行)

   
在程序唯有双击填充时,线的数组才会清空,下标再度重0起始,借使用户不双击,平昔在画椭圆,那么最多画30个椭圆(那几个数值可以轻易修改),但以此数值不是无休止。或许可以通过动态建立数组或者应用线性列表来化解。(固然有什么人解决了,@我,大家一道前行)