首頁 >後端開發 >C#.Net教程 >FormDragger在C#中實作窗體拖曳器的方法詳解

FormDragger在C#中實作窗體拖曳器的方法詳解

Y2J
Y2J原創
2017-04-22 10:33:381643瀏覽

這篇文章主要為大家詳細介紹了C#組件FormDragger窗體拖曳器,具有一定的參考價值,有興趣的小夥伴們可以參考一下

##適用: .net2.0+ winform專案

介紹:

#類似QQ、迅雷等講究UI體驗的軟體,都支援在視窗內多處地方拖動窗口,而不必老實巴交的去頂部標題欄拖,這個組件就是讓winform也能這樣隨性拖拽,隨性度或更甚。先看效果:

FormDragger在C#中實作窗體拖曳器的方法詳解

可拖曳的地方包含不限於:

  • 視窗、Panel、GroupBox、TabControl等容器控制項的空白區;

  • 選單列、工具列、狀態列等bar的空白區,以及無效項目;

  • Label、PictureBox 、ProgressBar等通常不與滑鼠互動的控制項;

  • 一切無效控制項(Enabled為false);


  • ##基本上就是你覺得應該可以拖的地方都可以拖。

用法:


先看公開成員:

//拖拽器开关
bool Enabled { get; set; }
//排除列表。可向其中添加或移除控件实例,处于列表中的控件不接受拖拽
List<Control> ExcludeControls { get; }
//事件:准备拖拽时发生,可用e.Cancel = true取消拖拽,e还携带其它信息
event EventHandler<FormDraggingCancelEventArgs> Dragging;
//事件:拖拽器开关状态改变后
event EventHandler EnabledChanged;

使用挺簡單,隨時隨地

FormDragger.Enabled = true/false就能開閉拖曳功能,例如在Main函數中就可以開好,完了程式內的所有自建窗體就可以愉快的拖曳了,但是,像訊息框MessageBox、各種對話框(如開啟檔案對話框)等由系統提供的窗體不能拖,拖這些需要勾子,犯不著(其實方案裡已經實現了一個DialogDragger.cs,就是用來拖系統對話框的,但已知顏色選擇對話框ColorDialog有問題,所以暫時沒集成,後面感覺有必要且解決了再更新,建議Watch)。關於訊息框,也可以選用這個,由於是自製,所以可以拖。

對於適用拖曳規則的控件,滑鼠左鍵點擊訊息(如MouseDown)是到不了它的,因為被攔截了,所以註冊了這類別事件也不會觸發,若希望某個可拖控制不被拖到,例如某個圖片框,你希望它具備「超鏈」的功能,點上去時執行註冊好的MouseDown事件處理方法,那麼有兩種方式可以實作例外:1、將該控制項加入例外清單:FormDragger.ExcludeControls.Add(pictureBox1);//注意這裡接受的是控制項實例,而不是控制項類型;

2 、註冊FormDragger.Dragging事件,在事件處理方法中,傳入的e有一個Control屬性,表示點到的控件,所以可以判斷e.Control是否你要例外的控件,若是,令e.Cancel = true即可;此外e還攜帶別的訊息,如滑鼠位置、座標類型等供輔助判斷;

以上場景在原始碼中都有範例,供你參考。

原則:


利用Application.AddMessageFilter向程式加入訊息過濾器,攔截並處理發送到程式窗體的滑鼠左鍵點擊訊息,若滿足邏輯,則攔下該訊息,並往控制項所在的窗體發送點擊標題列的訊息,達到點擊該控制項時系統認為是點到窗體標題列的效果。若想了解處理細節,請前往下面的地址查看。

方案所在:

github.com/ahdung/FormDraggerDemo【優先】


coding.net/u/ahdung/p/FormDraggerDemo/git

git.oschina .net/ahdung/FormDraggerDemo

方案中已寫入測試器,就是截圖那個樣子,歡迎下載體驗。

以上是FormDragger在C#中實作窗體拖曳器的方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn