C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等
在做winform窗体UI美化时,一般都需要将窗体的FormBorderStyle属性设为None,之后窗体就会没有最上面的标题栏,然后按照UI进行界面的设计。美化的代价就是窗体本来标题栏的相关操作,例如双击自动最大化,再次双击又恢复正常大小,以及上窗体关闭、最小化等功能就都需要自己实现对应的功能。
以自己做得项目为例,窗体的最上面一块就是类似或者需要实现标题栏功能的,用panel划定一个范围。之后所有的操作都是重写panel里面的方法。
实现最大化和还原
如果UI设计的是有按钮,那就最好。
/// <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.最大化;//这里图片调用UI设计的图片
btn_Max.BackgroundImage = maxbackImage;
}
else
{
this.WindowState = FormWindowState.Maximized;
Image normalbackImage = Resources.正常;
btn_Max.BackgroundImage = normalbackImage ;
}
}
如果为了美观UI连按钮也没有设计,那就模仿标题栏自带的功能,重写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;
}
}
最大化过程中可能遇到的问题
最大化了之后把屏幕下方的任务栏遮挡了
这个需要在窗体load的进行一些设置,vs自带的会对一些属性进行文字说明,看过之后就知道这么设置的目的了。
private void FormMain_Load(object sender, EventArgs e)
{
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
}
需要注意的是,vs还自带了属性窗口,如果你在窗体的属性窗口中已经设置它的WindowState为Maximized的话,那么再用上面的代码来设置就会失效。所以,使用上面的代码时,要把窗体属性中的WindowState设置为Normal才行。
到这里就应该可以解决绝大多数的需求了,但是在项目中,又遇到了拓展显示屏的情况(就是需要屏幕1一个窗体,同时屏幕2也需要生成一个窗体)。这个实现也可以记录一下。
//第二个窗体
_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设置,软件生成的2个窗体会同时生成在屏幕2,在屏幕1运行软件的话,则会正常生成1个屏幕1个窗体
最小化
同理上面最大化,有按钮设计最好,没有按钮设计的话,那就依据需求,自己判断以什么方式触发。
/// <summary>
/// 窗体 最小化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Min_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
关闭
这没啥好说的,肯定会有设计的。这里设计是一个图片。文章来源:https://www.toymoban.com/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, "确认系统?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (rst == DialogResult.Yes)
{
Application.ExitThread();
Application.Exit();
}
}
窗体移动
这里可以利用window的api函数文章来源地址https://www.toymoban.com/news/detail-478821.html
//调用API函数 需要添加引用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);//发送左键点击的消息至该窗体(标题栏)
}
}
}
到了这里,关于C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等-2023/1/11的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!