2

好的,这是我的问题。我有一个表单,当它没有被最大化时,它的最大尺寸必须是表单内组件的总高度。为了实现这一点,我使用这个:

    private void resize_form(object sender, EventArgs e)
    {
        this.MaximumSize = new System.Drawing.Size(1000, this.panel4.Height + this.label2.Height + this.HeightMin);
    }

这会触发表单的 Resize 事件。因为组件大小总是在变化,所以在调整大小事件上这样做是有意义的。但是,如果我想最大化表单,表单只会进入 this.MaximumSize 中定义的最高设置。所以我想知道是否有一种方法可以判断何时最大化表单并将其最大尺寸设置为表单最大化之前的屏幕边界。

如果有更好的方法可以在没有调整大小事件的情况下更改最大尺寸值,那也很棒:)

4

5 回答 5

9

您仍然需要使用 resize 事件,但请检查WindowState

if (this.WindowState == FormWindowState.Maximized)
{
    // Do your stuff
}

正如 yshuditelu 指出的那样,您也可以设置表单的最小尺寸属性 - 这应该与明智地使用锚值相结合,意味着它永远不会缩小太多,并且当它确实增长时,组件将移动和/或增长为必需的。

于 2009-06-02T16:39:18.003 回答
3

我找到了非常适合我的答案。一个 lil WndProc 覆盖:D(我现在喜欢 WndProc)

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MAXIMIZE = 0xF030; 

    switch (message.Msg)
    {
        case WM_SYSCOMMAND:
            int command = message.WParam.ToInt32() & 0xfff0;
            if (command == SC_MAXIMIZE) 
            {
                this.maximize = true;
                this.MaximumSize = new System.Drawing.Size(0, 0);
            }
            break;
    }

    base.WndProc(ref message);
}

private void resize_form(object sender, EventArgs e)
{
    if (!maximize)
    {
        this.MaximumSize = new System.Drawing.Size(1000, this.panel4.Height + this.label2.Height + this.HeightMin);
    }
}

基本上它在收到 SC_MAXIMIZE 消息时将 this.maximize 设置为 true。如果 this.maximize 设置为 false,resize 事件只会设置一个新的 MaximumSize。漂亮的 xD

于 2009-06-02T17:14:42.203 回答
2

您确定不想设置MinimumSize属性吗?如果将 MinimumSize 设置为所有标签的大小,则表单永远不会小于该大小。但它仍然可以增长到用户想要的任何大小,只要它大于最小值。

于 2009-06-02T16:41:17.830 回答
0

查看System.Windows.Forms.Screen类。从相关点获取屏幕(以处理多监视器情况),然后获取其分辨率。

这应该与有关检查 FormWindowState.Maximized 的其他评论结合使用。

于 2009-06-02T16:41:55.817 回答
0

如果用户点击上栏,他们可以调整窗口大小,所以我使用这个:

private void Form1_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Normal)
    {
        this.WindowState = FormWindowState.Maximized;
    }
}
于 2017-10-17T21:33:04.290 回答