我正在创建一个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所提到的,您可以使用按钮/面板上的Dock和Anchor属性,以便它们可以正确调整大小.如果不这样做,他们将不会按照调整大小的形式.
只是为了完成@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)
| 归档时间: |
|
| 查看次数: |
23615 次 |
| 最近记录: |