【问题标题】:Maximising a form over 2 Screens在 2 个屏幕上最大化表单
【发布时间】:2010-02-01 17:00:01
【问题描述】:

我的客户希望我更改默认的最大化按钮功能,以在客户拥有的所有屏幕上最大化表单。我已经编写了一些代码来测量要放置表单的正确矩形,但是当我将其分配给表单的 MaximizedBounds 属性时,出现了一些问题: 屏幕(在我的 2 个屏幕测试中)表单不在在点击之前只得到一个油漆,如果你点击另一个屏幕上的表单,就像你点击了它的“下方”到下面的下一个窗口。

当然还有其他方法可以解决这个问题(比如Event when a window gets maximized/un-maximized),如果所描述的行为是一个错误,或者我的错误,我会很担心。在更改 MaximizedBounds 属性以使其工作之前有什么事情要做吗?

【问题讨论】:

    标签: winforms maximize


    【解决方案1】:

    我同意马特的观点。设置“MaximizedBounds”不是一个好主意。 正如Event when a window gets maximized/un-maximized 中所写,我将覆盖 WndProc 方法。在那里,您可以自行处理从窗口接收到的不同命令。

    要做的主要事情是为“SC_MAXIMIZE”-window 命令编写自己的代码(如上面引用的文章中所写)。在那里您可以手动设置表单的大小,例如在这种情况下,表单不会真正最大化。实际上它是否仍然处于正常的WindowState。为防止用户更改此状态,您需要“捕获”其他一些窗口命令。

    重写的 WndProc 方法可能是这样的:

        protected override void WndProc(ref Message m)
        {
            if(m.Msg == 0x0112) // WM_SYSCOMMAND
            {
                if(m.WParam == new IntPtr(0xF012)) //TITLE_CLICK_ONCE
                {
                    // catch, this command can occur, when form starts to move
                }
    
                if(m.WParam == new IntPtr(0xF001) // RESIZE_ON_EDGE
                || m.WParam == new IntPtr(0xF002)
                || m.WParam == new IntPtr(0xF003)
                || m.WParam == new IntPtr(0xF004)
                || m.WParam == new IntPtr(0xF005)
                || m.WParam == new IntPtr(0xF006)
                || m.WParam == new IntPtr(0xF007)
                || m.WParam == new IntPtr(0xF008))
                {
                    // catch the resizing
                }
    
                if(m.WParam == new IntPtr(0xF032)) // SECOND_CLICK_ON_TITLEBAR
                {
                    // catch. causes a maximization (or resuming to normal window-mode)
                }
    
                if(m.WParam == new IntPtr(0xF030)) //SC_MAXIMIZE
                {
                    // the actual point, where to enter your code
                    // this command occurs, when the "Maximize"-button is pressed
                }
            }
    
            // maybe abort calling of the base-method at specified window-commands,
            // when you want to make your own code by simply "return;"
            base.WndProc(ref m);
        }
    

    【讨论】:

    • Gk,猜猜这是要走的路。
    【解决方案2】:

    通过直接设置Size 属性而不是MaximisedBounds 值,我已经能够使表单填满整个屏幕。

    【讨论】:

    • 是的,我也认为这是有效的选项(这是我目前解决问题的方法),但它也是好的编码风格吗?我想知道如何正确使用 MaximizedBounds。
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多