雖然現(xiàn)在都在說(shuō)winform窗體太丑了,但是我也能盡量讓桌面應(yīng)用程序漂亮那么一點(diǎn)點(diǎn)。
話不多說(shuō),先上圖:
重繪標(biāo)題欄
先將原生窗體設(shè)置成無(wú)邊框,F(xiàn)ormBoderStyle設(shè)置成None,然后添加一個(gè)panpel控件設(shè)置成窗體的的標(biāo)題欄:
然后添加四個(gè)Label控件充當(dāng)標(biāo)題和最小化最大化關(guān)閉按鈕。
此時(shí)界面的原型就出來(lái)了。
完善窗體
當(dāng)然原型出來(lái)了,肯定會(huì)讓其它窗體繼承這個(gè)窗體,難點(diǎn)就在于怎么讓子窗體標(biāo)題實(shí)時(shí)更新標(biāo)題,我是這樣做的,重寫(override)j基類窗體的Text:
public override string Text
{
get => base.Text;
set
{
base.Text = value;
if (Title != null)
{
Title.Text = value;
}
}
}
這樣繼承的時(shí)候就可以動(dòng)態(tài)更新標(biāo)題了,然后將最大化最小化關(guān)閉事件寫一下就好了。自己添加了關(guān)閉最小化和最大化按鈕的屬性,代碼如下:
private bool mvalueMin = true;
[Description("是否關(guān)閉最小化窗體"), Category("控制")]
public bool CloseMinButton
{
get { return mvalueMin; }
set
{
mvalueMin = value;
MinClose.Visible = mvalueMin;
}
}
private bool mvalueMax = true;
[Description("是否關(guān)閉最大化窗體"), Category("控制")]
public bool CloseMaxButton
{
get { return mvalueMax; }
set
{
mvalueMax = value;
MaxClose.Visible = mvalueMax;
}
}
但是無(wú)邊框的窗體有一個(gè)界面無(wú)法拖動(dòng)的老大難問題,這里借鑒的是網(wǎng)友的 就沒有自己寫了,具體是看的那篇博客忘記了,如有冒犯,請(qǐng)聯(lián)系我刪除:
[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;//定義鼠標(biāo)左鍵按下
private const int HTCAPTION = 2;
private void BaseForm_MouseDown(object sender, MouseEventArgs e)
{
//為當(dāng)前應(yīng)用程序釋放鼠標(biāo)捕獲
ReleaseCapture();
//發(fā)送消息 讓系統(tǒng)誤以為在標(biāo)題欄上按下鼠標(biāo)
SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
//為當(dāng)前應(yīng)用程序釋放鼠標(biāo)捕獲
ReleaseCapture();
//發(fā)送消息 讓系統(tǒng)誤以為在標(biāo)題欄上按下鼠標(biāo)
SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
}
#endregion
該文章在 2021/1/29 18:37:54 編輯過(guò)