C# GDI繪制矩形框,鼠標左鍵拖動可移動矩形框,滾輪放大縮小矩形框


               最近工作需要,要做一個矩形框,並且 用鼠標左鍵拖動矩形框移動其位置。網上查了一些感覺他們做的挺復雜的。我自己研究一天,做了一個比較簡單的,發表出來供大家參考一下。如覺得簡單,可路過,謝謝。哈哈。

               先大概介紹一下原因,GDI畫矩形框就不說了,很簡單的。這里面最主要的就是滾輪放大和左鍵移動兩個事件,要計算矩形框的坐標位置。下面將代碼貼出如下:

    先是定義需要的變量,就四個變量。


        //矩形框坐標
        private Rectangle DrawRect = new Rectangle(0, 0, 100, 100);
        //鼠標按下時坐標
        private Point MouseDownP = new Point();
        //放大倍數
        private int zoom = 0;
        //鼠標移動矩形框次數,如果移動過矩形框則不從中心放大,以移動后的位置放大縮小,縮小為原大小,縮放數為0時,重置此數
        private int MoveCount = 0;

 

然后編寫鼠標事件

        private void this_MouseWheel(object sender, MouseEventArgs e)      

       {         

             if (e.Delta > 0)       

             {           

                   if (zoom < 80)// 最大放大80倍             

                         zoom++;          

              }        

              else     

              {         

                     if (zoom > 0)         

                             zoom--;         

                     if (zoom == 0) //放大倍數=0,不放大,鼠標拖動標記歸0      

                            MoveCount = 0;         

               }          

              //放大原理   

             //1、先獲取放大倍數  

             //2、根據放大倍數,計算矩形框高度,高度=控件高度-倍數×2;  

            //3、根據高度,提取矩形寬度,寬度=高度×(控件寬度/控件高度),為保證矩形和原控件縱橫比例,所以要乘以比例     

            //4、根據矩形框大小,和控件大小,計算矩形框在控件中的位置,即X,Y坐標           

            //1)如果沒有拖動過矩形,則按默認中間位置取值,X=(控件寬度-矩形寬度)/2,Y=(控件高度-矩形高度)/2      

            //2)如果拖動過矩形框,則原X,Y坐標不變化       

            //5、根據得到的新矩形框的坐標和范圍,判斷是否超界,判斷XY坐標

            //滾輪放大事件     

           //矩形區域高度=控件高度-放大縮小倍數*2        

             DrawRect.Height = this.Height - zoom * 2;         

           //按比例計算寬度   

           DrawRect.Width = (int)(Convert.ToSingle(DrawRect.Height) * (Convert.ToSingle(this.Width) / Convert.ToSingle(this.Height)));      

            if (MoveCount == 0)//沒有拖動過,滾動滾輪才按中間放大縮小    

           {                

            DrawRect.X = (this.Width - DrawRect.Width) / 2;     

            DrawRect.Y = (this.Height - DrawRect.Height) / 2;     

             }

            //===============判斷是否超界===============         

            //如果Right超過控件寬度          

           if (DrawRect.Right > this.Width)        

           {             

                    DrawRect.X = DrawRect.X - (DrawRect.Right - this.Width) - 1;        

                    DrawRect.X = DrawRect.X > 1 ? DrawRect.X : 1;      

           }      

           //如果Bottom超過控件高度      

          if (DrawRect.Bottom > this.Height)     

          {          

                   DrawRect.Y = DrawRect.Y - (DrawRect.Bottom - this.Height) - 1;     

                   DrawRect.Y = DrawRect.Y > 1 ? DrawRect.Y : 1;          

           }          

            DrawImg();        

    }

        private void this_MouseMove(object sender, MouseEventArgs e)      

       {           

           if (e.Button == MouseButtons.Left)            

          {           

              if (DrawRect.Contains(MouseDownP))//判斷鼠標按下的坐標是否在紅框中,確定是否拖動的紅框     

               {              

                     //拖動鼠標位置,矩形框新X=矩形框原X+(當前鼠標X-按下時X),原X+偏移量        

                    //Y軸一樣變化

                     DrawRect.X = DrawRect.X + (e.X - MouseDownP.X); //.Location = ClienP;        

                     DrawRect.Y = DrawRect.Y + (e.Y - MouseDownP.Y); // ClienP.Y;

                     //判斷是否超過左上角           

                    if (DrawRect.X < 0)        

                         DrawRect.X = 0;        

                    if (DrawRect.Y < 0)         

                         DrawRect.Y = 0;

                    //判斷是否超過右下 角     

                    if (DrawRect.X > (this.Width - DrawRect.Width - 1))         

                       DrawRect.X = this.Width - DrawRect.Width - 1;       

                   if (DrawRect.Y > (this.Height - DrawRect.Height - 1))     

                       DrawRect.Y = this.Height - DrawRect.Height - 1;        

                  //畫圖              

                  DrawImg();

                     //計算完坐標系,鼠標按下坐標轉換成當前鼠標坐標,以重新計算偏移           

                     MouseDownP.X = e.X;                  

                     MouseDownP.Y = e.Y;        

                     //拖動過鼠標,鼠標拖動標記累加         

                    MoveCount++;              

              }         

         }     

    }

        private void this_MouseDown(object sender, MouseEventArgs e)

        {         

           if (e.Button == MouseButtons.Left)              

           MouseDownP = new Point(e.X, e.Y);      

         }

        void DrawImg()
        {
            using (Graphics g = this.CreateGraphics())
            {
                //重繪背景
                g.FillRectangle(new SolidBrush(Color.LightGray), 0, 0, this.Width, this.Height);
                g.DrawString("滾輪放大,左鍵拖動矩形框" + zoom, new Font("黑體", 12f), new SolidBrush(Color.Green), 5, 5);
                g.DrawString("放大" + zoom, new Font("黑體", 12f), new SolidBrush(Color.Red), 5, 20);
                //重繪矩形
                g.DrawRectangle(new Pen(Color.Red), DrawRect);
            }
        }

       主要就是這么幾個事件。有需要的可以參考參考。

 

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM