C# winform窗體UI美化后實現(xiàn)最大化、最小化、還原、關(guān)閉、窗體移動等等
在做winform窗體UI美化時,一般都需要將窗體的FormBorderStyle屬性設(shè)為None,之后窗體就會沒有最上面的標題欄,然后按照UI進行界面的設(shè)計。美化的代價就是窗體本來標題欄的相關(guān)操作,例如雙擊自動最大化,再次雙擊又恢復(fù)正常大小,以及上窗體關(guān)閉、最小化等功能就都需要自己實現(xiàn)對應(yīng)的功能。
以自己做得項目為例,窗體的最上面一塊就是類似或者需要實現(xiàn)標題欄功能的,用panel劃定一個范圍。之后所有的操作都是重寫panel里面的方法。
實現(xiàn)最大化和還原
如果UI設(shè)計的是有按鈕,那就最好。
/// <summary>
/// 窗體 最大化,正常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Max_Click(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
Image maxbackImage = Resources.最大化;//這里圖片調(diào)用UI設(shè)計的圖片
btn_Max.BackgroundImage = maxbackImage;
}
else
{
this.WindowState = FormWindowState.Maximized;
Image normalbackImage = Resources.正常;
btn_Max.BackgroundImage = normalbackImage ;
}
}
如果為了美觀UI連按鈕也沒有設(shè)計,那就模仿標題欄自帶的功能,重寫panel的MouseDoubleClick方法
/// <summary>
/// 窗體 最大化,正常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panel_top_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (this.WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
}
else
{
this.WindowState = FormWindowState.Maximized;
}
}
最大化過程中可能遇到的問題
最大化了之后把屏幕下方的任務(wù)欄遮擋了
這個需要在窗體load的進行一些設(shè)置,vs自帶的會對一些屬性進行文字說明,看過之后就知道這么設(shè)置的目的了。
private void FormMain_Load(object sender, EventArgs e)
{
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
}
需要注意的是,vs還自帶了屬性窗口,如果你在窗體的屬性窗口中已經(jīng)設(shè)置它的WindowState為Maximized的話,那么再用上面的代碼來設(shè)置就會失效。所以,使用上面的代碼時,要把窗體屬性中的WindowState設(shè)置為Normal才行。
到這里就應(yīng)該可以解決絕大多數(shù)的需求了,但是在項目中,又遇到了拓展顯示屏的情況(就是需要屏幕1一個窗體,同時屏幕2也需要生成一個窗體)。這個實現(xiàn)也可以記錄一下。
//第二個窗體
_Form2 = new Form2();
Screen[] screens = Screen.AllScreens;
if (screens.Length > 1)
{
_Form2 .Location = new Point(screens[1].Bounds.Left, screens[1].Bounds.Top);
}
_Form2 .Show();
需要注意的是,如果屏幕2運行軟件的話,按照上面的load設(shè)置,軟件生成的2個窗體會同時生成在屏幕2,在屏幕1運行軟件的話,則會正常生成1個屏幕1個窗體
最小化
同理上面最大化,有按鈕設(shè)計最好,沒有按鈕設(shè)計的話,那就依據(jù)需求,自己判斷以什么方式觸發(fā)。
/// <summary>
/// 窗體 最小化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Min_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
關(guān)閉
這沒啥好說的,肯定會有設(shè)計的。這里設(shè)計是一個圖片。文章來源:http://www.zghlxwxcb.cn/news/detail-478821.html
/// <summary>
/// 退出程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox_quit_Click(object sender, EventArgs e)
{
DialogResult rst = MessageBox.Show(this, "確認系統(tǒng)?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (rst == DialogResult.Yes)
{
Application.ExitThread();
Application.Exit();
}
}
窗體移動
這里可以利用window的api函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-478821.html
//調(diào)用API函數(shù) 需要添加引用using System.Runtime.InteropServices;
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
/// <summary>
/// 窗體移動
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panel_top_MouseDown(object sender, MouseEventArgs e)
{
if (e.Clicks == 1)
{
//窗體移動默認鼠標左鍵
if (e.Button == MouseButtons.Left)
{
ReleaseCapture(); //釋放鼠標捕捉
SendMessage(this.Handle, 0xA1, 0x02, 0);//發(fā)送左鍵點擊的消息至該窗體(標題欄)
}
}
}
到了這里,關(guān)于C# winform窗體UI美化后實現(xiàn)最大化、最小化、還原、關(guān)閉、窗體移動等等-2023/1/11的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!