Максимизация формы на 2 экранах - PullRequest
0 голосов
/ 01 февраля 2010

Мой клиент хочет, чтобы я изменил функциональность кнопок максимизации по умолчанию, чтобы максимизировать форму на всех экранах, которые есть у клиента. Я уже написал некоторый код, чтобы измерить правильный прямоугольник для размещения формы, но когда я назначаю его атрибуту MaximisedBounds формы, возникают некоторые проблемы: Экран (в моих двух тестах экрана), на котором форма не была включена до того, как щелкнуть, получите только одну краску, и если вы щелкнете по форме на другом экране, это будет похоже на то, что вы щелкнули «под» в следующем окне ниже.

Конечно, есть и другие способы решения этой проблемы (например, в Событие, когда окно максимизируется / не максимизируется ), я думаю, если описанное поведение является ошибкой или моей ошибкой. Что-то нужно сделать перед тем, как изменить атрибут MaximisedBounds, чтобы он работал?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2010

Я бы согласился с Мэттом.Установка MaximizedBounds не очень хорошая идея.Как написано в Событии, когда окно становится максимизированным / не максимизированным , я бы переопределил 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);
    }
0 голосов
/ 01 февраля 2010

Мне удалось заставить формы заполнять 2 целых экрана, установив непосредственно свойство Size, а не значение MaximisedBounds.

...