WinForm中MouseEnter和MouseLeave混亂的問題


  MouseEnter+MouseLeave不行,我用了MouseMove+MouseLeave,效果一樣

  最近做個聊天的系統,仿照qq的界面設計,像qq聊天界面中字體、表情、截圖等圖片,鼠標放上去顯示邊框,所以很自然用到了enter和leave這兩個事件,因為是picturebox控件沒有over和out事件,但調了兩個小時就是不行,mouseleave事件不靈,經常不觸發,也不是速度太快造成的,因為有時快也能觸發,我慢慢經過反倒經常不觸發,頭疼,因為我這些圖片外面套的有兩層panel,網上查了些資料看了,說鼠標在控件上也算不在panel上,但和我的情況不符合呀,整了一下午不行,放棄(最后終於知道是因為Leave是在離開控件邊緣的一瞬間觸發,但我進入控件后加了邊框,所以鼠標離開控件邊緣時,是在后加上的邊框上,依然認為在控件里,導致慢慢經過邊緣不觸發,但Enter事件不能控制,所以還得用下面的);

  沒辦法開始嘗試用判斷鼠標是否在控件上這個方法,這里用到的是mousemove事件,這里也有坑,什么相對於屏幕的坐標和相對於窗口的,也是整的有點雲里霧里的。先看下最終實現的效果,:

  private void picBoxLog_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = flowLayoutPanel2.PointToClient(Control.MousePosition);//flowLayoutPanel2是picBoxLog的父容器
            int side = 1;//決定於邊框的寬度
            if (p.X > picBoxLog.Location.X + side && p.X < picBoxLog.Location.X + picBoxLog.Width - side && p.Y > picBoxLog.Location.Y + side && p.Y < picBoxLog.Location.Y + picBoxLog.Height - side)
            {
                picBoxLog.BorderStyle = BorderStyle.FixedSingle;
            }
            //else
            //    picBoxLog.BorderStyle = BorderStyle.None;
        }

開始只用move,但移出控件上就不觸發該事件,所以不會去掉邊框,嘗試鼠標進入控件過一段距離后加邊框,四周留一些邊距,觸發去掉邊框(看上面的代碼我加了side就知道了,所以大家就不用加side了),但如果移動過快也會造成去不掉的情況,雖然不容易發生,而且控件本來就30高度沒多大,我兩邊都留了8,還是會發生,再多點就沒了,靈光一閃,把去掉邊框的方法,又放到了Leave事件中,日了狗了,這兩個事件竟完美配合,想砸鍵盤的心都有了,所以記錄下來,獻給正在為此砸鍵盤或將來可能砸鍵盤的猿猿們。

貼一下用這個方法過程中查看的知識點:

1)PointToClient 將指定屏幕點的位置計算成工作區坐標。坐標原點為黃色區域左上角,X軸方向從左到右;Y軸方向從上到下;坐標單位為像素;

2)PointToScreen 將指定工作區點的位置計算成屏幕坐標。坐標原點在屏幕左上角,X軸方向從左到右;Y軸方向從上到下;坐標單位為像素;

獲取鼠標的位置的:

  很多時候我們需要用到鼠標在相對於窗體上的坐標,或者相對於屏幕的坐標,這里就把我的經驗記錄下。

  用Control.MousePosition獲得當前鼠標的坐標CurrentPoint,使用Control.PointToClient方法,前面獲得的CurrentPoint作為其參數,返回的Point類型的對象即為鼠標相對於某個控件的坐標。

現在以鼠標相對於窗體的坐標做為例子,如下:   

          Point screenPoint = Control.MousePosition;//鼠標相對於屏幕左上角的坐標           

   Point formPoint = this.PointToClient(Control.MousePosition);//鼠標相對於窗體左上角的坐標

同理:

            Point button1Point= button1Point.PointToClient(Control.MousePosition); //鼠標相對於button1左上角的坐標

還有Control.PointToScreen方法,返回的是相對於屏幕的坐標。

    大概就這些吧,中間還試了Rectangle相關的,沒成功,不知道是不是哪寫錯了,哪位大神知道了,可以指點下

    //Rectangle rec = picBoxLog.RectangleToClient(this.ClientRectangle);
            //Point p = flowLayoutPanel2.PointToClient(Control.MousePosition);  flowLayoutPanel2是picBoxLog的父容器,改成this也試了不行
            //if (rec.Contains(p))
            //{
            //    picBoxLog.BorderStyle = BorderStyle.FixedSingle;
            //}
            //else
            //    picBoxLog.BorderStyle = BorderStyle.None; 

 


免責聲明!

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



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