✨ VS常用功能添加
一、图形按钮-PictureBox
1. 在窗体再拖一个 PictureBox,默认名称:pictureBox2
2. 准备第二组按钮图片
项目 → 属性 → 资源,再导入两张新图片,命名举例:
btn2_normal、btn2_hover
3. 新增一套对应的事件方法,粘贴进窗体类
// ========== 第二个按钮 pictureBox2 事件 ==========
private void pictureBox2_MouseEnter(object sender, EventArgs e)
{
pictureBox2.Image = Properties.Resources.btn2_hover;
}
private void pictureBox2_MouseLeave(object sender, EventArgs e)
{
pictureBox2.Image = Properties.Resources.btn2_normal;
}
private void pictureBox2_Click(object sender, EventArgs e)
{
MessageBox.Show("第二个按钮点击成功");
//这里写第二个按钮要执行的逻辑
}4. 绑定事件(关键)
选中窗体上的 pictureBox2
右侧点开闪电⚡事件面板
MouseEnter 绑定:pictureBox2_MouseEnter
MouseLeave 绑定:pictureBox2_MouseLeave
Click 绑定:pictureBox2_Click
打开网址
private void pictureBox2_Click(object sender, EventArgs e)
{
// 调用系统默认浏览器打开网址
System.Diagnostics.Process.Start("https://abc.com");
}兼容 Win10/Win11 新版写法(防止报错,推荐用这个)
using System.Diagnostics;
using System.Runtime.InteropServices;
private void pictureBox2_Click(object sender, EventArgs e)
{
string url = "https://abc.com";
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Process.Start(new ProcessStartInfo(url) { UseShellExecute = true });
}
}最简完整可用代码
private void pictureBox2_Click(object sender, EventArgs e)
{
Process.Start("https://abc.com");
}启动程序
private void pictureBox1_Click(object sender, EventArgs e)
{
//启动同目录下的 A.exe
System.Diagnostics.Process.Start("A.exe");
}指定完整路径启动(例如 D 盘)
private void pictureBox1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(@"D:\软件\A.exe");
}关闭程序
关闭窗口
private void picClose_Click(object sender, EventArgs e)
{
// 触发窗体关闭事件,会执行收尾逻辑、释放资源,和原生关闭按钮行为一模一样
this.Close();
}关闭程序 (强制直接退出整个程序)
private void picClose_Click(object sender, EventArgs e)
{
Application.Exit();
}最小化窗口
代码(效果等同于原生标题栏最小化按钮「-」)
private void picMin_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}任意拖动窗口
步骤 1:打开 Form1.cs 代码界面
双击解决方案里的 Form1.cs,进入代码编辑页面。
在 public partial class Form1 : Form 类内部最上方,粘贴两个全局变量:
// 鼠标坐标
private Point mousePos;
// 是否正在拖动
private bool drag = false;public partial class Form1 : Form
{
//新增这两行
private Point mousePos;
private bool drag = false;
//新增这两行
public Form1()
{
InitializeComponent();
}
}步骤 2:粘贴三个拖动方法
把下面三段方法写在构造函数下方:
//鼠标按下开始拖拽
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
drag = true;
mousePos = e.Location;
}
}
//鼠标移动拖动窗口
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (drag)
{
Point newPoint = this.PointToScreen(e.Location);
this.Location = new Point(newPoint.X - mousePos.X, newPoint.Y - mousePos.Y);
}
}
//松开鼠标停止拖拽
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
drag = false;
}步骤 3:绑定窗体事件(关键,不然代码不会生效)
切换回 Form1 设计界面,点击窗体空白地方,选中整个窗口。
右边属性面板,点击上方 ⚡闪电图标(事件)。
找到下面 3 个事件,分别绑定:
MouseDown → 选择 Form1_MouseDown
MouseMove → 选择 Form1_MouseMove
MouseUp → 选择 Form1_MouseUp
绑定完成后,事件列表会自动关联刚才写好的方法。
加载网络图片
完整实现:程序启动,图形按钮(PictureBox)自动加载网络图片
特点:异步加载,不会卡住窗口;加载前先用本地图片占位;加载失败可 fallback 本地图。
步骤 1:头部引入所需命名空间
打开 Form1.cs,在文件最上方 using 区域追加:
using System;
using System.Drawing;
using System.Net;
using System.IO;
using System.Threading.Tasks;步骤 2:窗体构造函数(初始化默认本地占位图)
public Form1()
{
InitializeComponent();
// 按钮先显示本地默认图片,避免空白
pictureBox1.Image = Properties.Resources.btn_normal;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}pictureBox1 换成你按钮的控件名称。
步骤 3:窗体 Load 事件,后台下载网络图并替换按钮图片
选中窗体,绑定 Load 事件,写入代码:
private void Form1_Load(object sender, EventArgs e)
{
// 开启子线程下载网络图片,不阻塞界面
Task.Run(() =>
{
string imgUrl = "https://你的图片地址";
try
{
using (WebClient client = new WebClient())
{
byte[] data = client.DownloadData(imgUrl);
using (MemoryStream ms = new MemoryStream(data))
{
Image netImg = Image.FromStream(ms);
// 跨线程更新UI必须 Invoke
pictureBox1.Invoke(new Action(() =>
{
pictureBox1.Image = netImg;
}));
}
}
}
catch (Exception ex)
{
// 网络错误、图片失效,保持原本本地图片不变,也可以弹窗提示
pictureBox1.Invoke(new Action(() =>
{
// MessageBox.Show("图片加载失败:" + ex.Message);
}));
}
});
}步骤 4:替换配置
pictureBox1:改成你用来做按钮的图片框名字;
imgUrl = "https://你的图片地址":替换成真实图片链接;
Properties.Resources.btn_normal:你资源里的默认占位图。
运行逻辑
窗口打开瞬间,按钮立刻显示本地 btn_normal,不会空白;
后台悄悄下载网络图片,界面全程流畅不卡顿;
下载成功自动替换按钮图片;网络异常则维持本地图片。
禁止重复运行
在解决方案资源管理器,打开 Program.cs
删除里面原本所有代码
把下面完整代码粘贴进去,把 你的项目名称 替换成你项目的命名空间即可
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace 你的项目命名空间
{
static class Program
{
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_RESTORE = 9; // 还原最小化的窗口
[STAThread]
static void Main()
{
Process curProc = Process.GetCurrentProcess();
Process existProc = Process.GetProcessesByName(curProc.ProcessName).FirstOrDefault(p => p.Id != curProc.Id);
if (existProc != null)
{
IntPtr hwnd = existProc.MainWindowHandle;
// 如果窗口最小化,先还原
ShowWindow(hwnd, SW_RESTORE);
// 置顶前置
SetForegroundWindow(hwnd);
MessageBox.Show("程序已启动,已调出窗口", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}