我正在用 C# 开发一个 Windows 窗体应用程序,其中我有一个窗体,它必须以最大化状态启动,并且不允许用户还原或调整它的大小。我已经将表单配置为以最大化模式启动,禁用还原和最大化按钮并锁定表单的边框,但是当双击标题栏时,表单会恢复到出乎意料的较小尺寸。以下是我为实现所需行为而设置的属性:
FormBorderStyle = FixedSingle
MaximizeBox = False
WindowState = Maximized
有人可以帮我解决这个问题并解释解决方案吗?
提前谢谢。
您必须记住,您的表单以一些默认大小值开头,双击只是在 2 种状态之间切换。
在您的正常状态下,表单将检索它的最后一个(在您的情况下默认(大小,您可以覆盖它:
Width = Screen.PrimaryScreen.Bounds.Width;
Height = Screen.PrimaryScreen.Bounds.Height;
另一件事是,您的应用程序具有称为开始位置的东西,该位置(据我所知(默认位于屏幕中央,您可以使用以下方法进行更改:
Form.StartPosition = new Point(0, 0); // top-left corner
现在,您在应用程序中所要做的就是检查窗口状态之间的切换。最简单的方法是使用 WndProc
并等待此 msdn 页面中列出的消息:
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_MAXIMIZE = 0xF030;
const int SC_RESTORE = 0xF120;
if (m.Msg == WM_SYSCOMMAND)
{
switch((int)m.WParam)
{
case SC_RESTORE:
// your window was restored ( double clicked on the command bar )
// set it's window state back to maximize or do whatever
break;
case SC_MAXIMIZE:
// your window was maximized .. no actions needed, just for debugging purpose
break;
}
}
base.WndProc(ref m);
}
这可以通过捕获事件并覆盖它来实现:
private void Form_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.WindowState = FormWindowState.Maximized;
this.MaximizeBox = false;
this.MinimumSize = Screen.GetWorkingArea(this.Location).Size;
}
private const int WM_NCLBUTTONDBLCLK = 0x00A3;
//double click on a title bar
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCLBUTTONDBLCLK)
{
m.Result = IntPtr.Zero;
return;
}
base.WndProc(ref m);
}