搜索结果

×

搜索结果将在这里显示。

✨ 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());
        }
    }
}


发布时间: