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

Kar*_*sil 3 c# winforms

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

Pie*_*ult 22

是的,没有额外的库可以.

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

public Form1()
{
    InitializeComponent();

    FormBorderStyle = FormBorderStyle.None;
}
Run Code Online (Sandbox Code Playgroud)

接下来,使用您的三个按钮创建一个面板,或任何您想要的面板(我知道它很难看,用于演示目的):

在此输入图像描述

然后,使用以下命令为每个操作分配正确的操作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();
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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

现在你有一个可拖动的形式,顶部有你自己的酒吧.

如果你希望它可以调整大小,正如@PhilWright所提到的那样,你可以捕获WM_NCHITTEST消息WndProc并返回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);
}
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*iko 5

只是为了完成@Pierre-Luc的有用解决方案。当窗口最大化时,如果我们再次单击最大化按钮,如何将其大小调整到正常位置。这是代码:

private static bool MAXIMIZED = false;
private void maximizeButton_Click(object sender, System.EventArgs e)
{
    if(MAXIMIZED)
    {
        WindowState = FormWindowState.Normal;
        MAXIMIZED = false;
    }
    else
    {
        WindowState = FormWindowState.Maximized;
        MAXIMIZED = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如@LarsTech 在评论中所建议的

private void maximizeButton_Click(object sender, System.EventArgs e)
{
    if (this.WindowState != FormWindowState.Maximized)
        this.WindowState = FormWindowState.Maximized;
    else
        this.WindowState = FormWindowState.Normal;
}
Run Code Online (Sandbox Code Playgroud)

  • `if (this.WindowState == FormWindowState.Maximized)` 不会已经给你这些信息了吗?不需要额外的变量。 (3认同)