拒绝废话!
vs 2022 community win10 64位。
系统托盘使用例子
效果:2秒后进入右下角系统托盘
namespace xxx
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// 这个函数是手写的
protected override async void OnShown(EventArgs e)
{
base.OnShown(e);
for (int i = 2; i >= 0; i--)
{
// 更新UI,必须在UI线程上执行
label1.Text = i + " :秒后自动最小化到任务栏...";
// 等待一秒,不阻塞UI线程 不能使用thread.sleep
await Task.Delay(1000);
}
Hide(); // 隐藏窗体
//如果没有上面for循环,这句不用写。写这句之前要求将notifyIcon1属性的visable设置为false
//如果没有上面for循环而不写这句,将会在窗口出现的时候,系统托盘出现图标。
notifyIcon1.Visible = true;
}
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Show(); // 显示窗体
this.WindowState = FormWindowState.Normal; // 恢复窗体正常大小
this.notifyIcon1.Visible = false; // 隐藏托盘图标
}
private void 显示窗体ToolStripMenuItem_Click(object sender, EventArgs e)
{
Show();
this.WindowState = FormWindowState.Normal;
this.notifyIcon1.Visible = false;
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit(); //退出程序
}
}
}
系统托盘----UI设计器步骤:
1.新建项目winform .net窗体应用c#语言的。
2.工具栏拖入一个label (如果没有工具栏,按ctrl+alt+x调出)
3.工具栏拖入一个notifyicon在窗体内任意位置,会自动跑到窗体下面
4.工具栏拖入一个contextMenueStrip在窗体内任意位置,会自动跑到窗体下面
5.鼠标右击窗体下面的notifyicon,点击属性 -->选择之前下载好的icon格式图标 -->继续在属性栏找到contextMenueStrip选项,选择刚才拖入的那个contextMenueStrip (根据上面代码,考虑是否要继续在属性栏找到icon的visable选择)
6.左键点击窗体下面的contextMenueStrip,发现窗体内有需要编辑的菜单栏(即最小化后右键的菜单选项),在“请在此处键入”点击并写入菜单名字(比如:显示窗体),依次写入需要的菜单名字用于定义接下来的事件。
7.依次右键点击(比如第6步的显示窗体),选择属性,然后点击下图“闪电图标”,并点击其中的click右边的选项框,选择需要的(比如显示窗体....),然后按回车键进入事件函数...,完成剩余的菜单事件编辑....代码如上。
界面启用高DPI方法(消灭界面模糊)
1.按下图新建配置文件(截图自Winform 支持高DPI的几种方式-CSDN博客)
2.找到manifest文件,把下面这段注释掉的代码取消注释即可 。
无边框form实现可以移动
方法源自:c# winform 无边框窗体 移动办法_winform边框拖动不了了-CSDN博客
当form1的formborderstyle属性设置成none时无法移动窗体,解决方法是:
namespace xxx
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//当formborderstyle设置成none无法移动窗体时使用这个方法
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left)
{
//这里一定要判断鼠标左键按下状态,否则会出现一个很奇葩的BUG,不信邪可以试一下~~
ReleaseCapture();
SendMessage(Handle, 0x00A1, 2, 0);
}
}
}
}
补全titleIcon图标,max,min,close按钮
拖动panel控件(panel控件默认没有边框)作为标题栏底色控件,设置颜色,尺寸。
拖动3个按钮到form设计器内,摆放好位置并设置他们的imagine,anchor(影响当界面最大化后控件四周是否启用“锚定”父控件四周,即是否跟随移动或拉伸),BackColor设置为同panel颜色,FlatApperance的BorderSize设置为0,FlatStyle设置为Flat,其他属性....;继续定义对应事件即可。如果label看不见了(鼠标移动到原label位置能看到border),设置其ForeColor属性(影响字体颜色)即可。
事件代码参考:
private void closeBtn_Click_1(object sender, EventArgs e)
{
Application.Exit();
}
private void maxSizeBtn_Click(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Maximized)
{
WindowState = FormWindowState.Normal;
}
else
{
WindowState = FormWindowState.Maximized;
}
}
private void miniSizeBtn_Click(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
}
运行样式参考:
此时拖动panel控件是无法移动窗体的,解决方案:
namespace xxx
{
public partial class Form1 : Form
{
private Point dragCursorPoint;
private Point dragFormOffset;
public Form1()
{
InitializeComponent();
}
//任意位置追加这一段代码,思路是:
//按下鼠标时记录光标和光标相对form的左上角的位置,因为this.Location默认是窗体的左上角坐标。
//当panel1_MouseMove事件发生时,更新窗体的位置。
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
dragCursorPoint = Cursor.Position;
dragFormOffset = this.Location;
dragFormOffset.Offset(-dragCursorPoint.X, -dragCursorPoint.Y);
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// 计算新的窗体位置
Point newLocation = Cursor.Position;
newLocation.Offset(dragFormOffset.X, dragFormOffset.Y);
// 更新窗体的位置
this.Location = newLocation;
}
}
}
}
此时无法实现鼠标拖动窗体边缘调整窗体大小,解决方案:暂无!!!
一些特效或布局
一个非常简单的特效 :
//效果是:当鼠标进入这个控件,控件向上凸起,离开后复位。
private void panel3_MouseEnter(object sender, EventArgs e)
{
origenalLocation = panel3.Location; //保存原始位置
panel3.BackColor = Color.Red;
panel3.Location = new Point(panel3.Location.X, panel3.Location.Y - 20); //新位置
}
private void panel3_MouseLeave(object sender, EventArgs e)
{
panel3.BackColor = Color.White;
panel3.Location = origenalLocation;
}