C# 自定义窗体的最大化、最小化和关闭按钮实现

在 C# 中实现自定义窗体的最大化、最小化和关闭按钮功能,以下是三种不同的方法:

第一种方法:通过编写窗体的 MouseDownMouseMoveMouseUp 事件处理程序来实现拖动无标题栏窗体的功能。

private Point mouseOffset;
private bool isMouseDown = false;

private void Form1_MouseDown(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        mouseOffset = new Point(-e.X, -e.Y);
        isMouseDown = true;
    }
}

private void Form1_MouseMove(object sender, MouseEventArgs e) {
    if (isMouseDown) {
        Point mousePos = Control.MousePosition;
        mousePos.Offset(mouseOffset.X, mouseOffset.Y);
        Location = mousePos;
    }
}

private void Form1_MouseUp(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
        isMouseDown = false;
    }
}

第二种方法:调用 Windows 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);

public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;

private void Form1_MouseDown(object sender, MouseEventArgs e) {
    ReleaseCapture();
    SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}

第三种方法:在 WndProc 方法中处理系统命令和窗口消息。

private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MAXIMIZE = 0xF030;
private const int SC_MINIMIZE = 0xF020;
private const int WM_NCHITTEST = 0x84;
private const int HTCAPTION = 0x0002;
private const int HTCLIENT = 0x1;

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
        case WM_SYSCOMMAND:
            if (m.WParam == (IntPtr)SC_MAXIMIZE) {
                m.WParam = (IntPtr)SC_MINIMIZE;
            }
            break;
        case WM_NCHITTEST:
            if (m.Result == (IntPtr)HTCLIENT) {
                m.Result = (IntPtr)HTCAPTION;
                return;
            }
            break;
    }
    base.WndProc(ref m);
}

自定义标题栏菜单项:在窗体的标题栏菜单中添加自定义菜单项。

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32.dll")]
public static extern bool InsertMenu(IntPtr hMenu, uint uPosition, uint uFlags, uint uIDNewItem, string lpNewItem);

public const int MF_STRING = 0x0000;
private const uint SC_ABOUT = 0x0001;

private void Form1_Load(object sender, EventArgs e) {
    IntPtr vMenuHandle = GetSystemMenu(Handle, false);
    InsertMenu(vMenuHandle, 255, MF_STRING, SC_ABOUT, "About...");
}

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
        case WM_SYSCOMMAND:
            if ((uint)m.WParam == SC_ABOUT) {
                MessageBox.Show("About...");
            }
            break;
    }
    base.WndProc(ref m);
}
rar 文件大小:303.55KB