C# Winform 窗體美化(十、自定義窗體)
阿新 • • 發佈:2019-01-04
十、自定義窗體
寫在前面
最近在做 winform 應用程式,需要自定義一種視窗的樣式,所以就隨便搞了一個簡單的視窗。
效果圖
有兩種樣式,介面如下:
無標題:
有標題:
關鍵詞
1、黑色描邊邊框
對於視窗去掉原生的邊框這個操作很簡單【設定FormBorderStyle為None】,但是去掉邊框之後略顯生硬,所以就考慮如何做一個描邊。
方案a:用畫筆畫出來,但是畫出來的描邊會被控制元件擋住,所以作廢;
方案b:使用4個label,設定長寬和顏色,設定為最頂層,分別擺放在上下左右四個邊緣位置,現在來看效果還不錯,因為是控制元件是最頂層的原因,所以也不會被擋住,【如果你看到此處有什麼好主意一定告知一下,先謝過了 ^_^ 】
2、拖動視窗移動
由於設定FormBorderStyle為None的原因,所以原來視窗標題的拖動功能也一併去除了,所以需要重新來手動實現原來標題的移動功能,重寫OnMouseMove方法即可,程式碼如下:
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left)
{
//這裡一定要判斷滑鼠左鍵按下狀態,否則會出現一個很奇葩的BUG,不信邪可以試一下~~
ReleaseCapture();
SendMessage(Handle, 0x00A1 , 2, 0);
}
}
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
3、關於視窗屬性的新增
因為我做了描邊的功能,所以相對應的,應該會有一個描邊粗細的設定,當然放到屬性面板裡最好,這裡貼一下如何在屬性面板裡新增新專案:
private int _Border = 1 ;
[Category("Style")]
[Description("窗體邊框粗細")]
[DefaultValue(typeof(int), "1")]
public int Border
{
get { return _Border; }
set
{
if (_Border != value)
{
_Border = value;
SetBorder();
}
}
}
具體解釋可以再VS看到,都很詳細。