C# 自定义窗体的最大化、最小化和关闭按钮实现
在 C# 中实现自定义窗体的最大化、最小化和关闭按钮功能,以下是三种不同的方法:
第一种方法:通过编写窗体的 MouseDown
、MouseMove
和 MouseUp
事件处理程序来实现拖动无标题栏窗体的功能。
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);
}
303.55KB
文件大小:
评论区