c#winform自定義窗體,重繪標題欄,自定義控件學習


c#winform自定義窗體,重繪標題欄

雖然現在都在說winform窗體太丑了,但是我也能盡量讓桌面應用程序漂亮那么一點點
話不多說,先上圖

 

 


重繪標題欄
先將原生窗體設置成無邊框,FormBoderStyle設置成None
然后添加一個panpel控件設置成窗體的的標題欄

 

 

然后添加四個Label控件充當標題和最小化最大化關閉按鈕。
此時界面的原型就出來了。

完善窗體
當然原型出來了,肯定會讓其它窗體繼承這個窗體,難點就在於怎么讓子窗體標題實時更新標題,我是這樣做的
重寫(override)j基類窗體的Text

public override string Text
{
get => base.Text;
set
{
base.Text = value;
if (Title != null)
{
Title.Text = value;
}
}
}

這樣繼承的時候就可以動態更新標題了
然后將最大化最小化關閉事件寫一下就好了
自己添加了 關閉最小化和最大化按鈕的屬性
代碼如下:


private bool mvalueMin = true;
[Description("是否關閉最小化窗體"), Category("控制")]
public bool CloseMinButton
{
get { return mvalueMin; }
set
{
mvalueMin = value;
MinClose.Visible = mvalueMin;
}
}
private bool mvalueMax = true;
[Description("是否關閉最大化窗體"), Category("控制")]
public bool CloseMaxButton
{
get { return mvalueMax; }
set
{
mvalueMax = value;
MaxClose.Visible = mvalueMax;
}
}

但是無邊框的窗體有一個界面無法拖動的老大難問題
這里借鑒的是網友的 就沒有自己寫了 ,具體是看的那篇博客忘記了,如有冒犯,請聯系我刪除

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int VM_NCLBUTTONDOWN = 0XA1;//定義鼠標左鍵按下
private const int HTCAPTION = 2;
private void BaseForm_MouseDown(object sender, MouseEventArgs e)
{
//為當前應用程序釋放鼠標捕獲
ReleaseCapture();
//發送消息 讓系統誤以為在標題欄上按下鼠標
SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
//為當前應用程序釋放鼠標捕獲
ReleaseCapture();
//發送消息 讓系統誤以為在標題欄上按下鼠標
SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
}
#endregion

 

 


測試效果如下

下一篇博客將講自定義控件的制作。

希望winform死的慢一點,才喜歡上。


免責聲明!

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



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