gpt4 book ai didi

c# - 如何在 Windows 窗体应用程序中设计自定义关闭、最小化和最大化按钮?

转载 作者:行者123 更新时间:2023-11-30 13:09:03 24 4
gpt4 key购买 nike

我正在创建一个 Windows 窗体应用程序项目,其中我想要一个自定义边框和三个我自己设计的按钮(关闭、最小化和最大化)。我不知道该怎么做,我什至不确定是否可行。但如果可能的话,请告诉我解决方案。谢谢

最佳答案

是的,没有额外的库是可能的。

首先,隐藏窗口的原始边框。

public Form1()
{
InitializeComponent();

FormBorderStyle = FormBorderStyle.None;
}

接下来,使用三个按钮创建一个面板,或者您真正想要的任何东西(我知道这很丑,为了演示目的):

enter image description here

然后,使用 WindowState 为它们中的每一个分配正确的操作:

private void minimizeButton_Click(object sender, System.EventArgs e)
{
WindowState = FormWindowState.Minimized;
}

private void maximizeButton_Click(object sender, System.EventArgs e)
{
WindowState = FormWindowState.Maximized;
}

private void closeButton_Click(object sender, System.EventArgs e)
{
Close();
}

最后,使用我们的面板使表单可拖动。在类级别添加:

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HTCAPTION = 0x2;
[DllImport("User32.dll")]
public static extern bool ReleaseCapture();
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

并将它们插入面板的 MouseDown 事件中:

private void OnMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}

现在您有了一个可拖动的表单,顶部有您自己的栏。

如果您希望它可以调整大小,正如@PhilWright 提到的,您可以从 WndProc 捕获 WM_NCHITTEST 消息并返回 HTBOTTOMRIGHT 以触发调整大小:

protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84)
{
const int resizeArea = 10;
Point cursorPosition = PointToClient(new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16));
if (cursorPosition.X >= ClientSize.Width - resizeArea && cursorPosition.Y >= ClientSize.Height - resizeArea )
{
m.Result = (IntPtr)17;
return;
}
}

base.WndProc(ref m);
}

正如@BenVoigt 提到的,您可以在按钮/面板上使用 DockAnchor 属性,以便它们可以正确调整大小。如果您不这样做,他们将不会按照调整大小的形式进行操作。

关于c# - 如何在 Windows 窗体应用程序中设计自定义关闭、最小化和最大化按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29024910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com