Максимизация формы на 2 экрана

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

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


person Stimpatch    schedule 01.02.2010    source источник


Ответы (2)


Я бы согласился с Мэттом. Установка «MaximizedBounds» не является хорошей идеей. Как написано в Событие, когда окно максимизируется/не максимизируется, я бы переопределил метод WndProc. Там вы можете самостоятельно обрабатывать различные полученные команды из вашего окна.

Главное, что нужно сделать, это написать свой собственный код для команды окна "SC_MAXIMIZE" (как написано в статье, на которую есть ссылка выше). Там вы можете вручную установить размер формы, например. В этом случае форма не будет действительно максимизирована. На самом деле это все еще в обычном 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);
    }
person Community    schedule 02.02.2010
comment
Gk, думаю, это путь тогда. - person Stimpatch; 03.02.2010

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

person Matt Warren    schedule 01.02.2010
comment
да, я также рассматривал это как допустимый вариант (и это мое текущее решение проблемы), но хороший ли это стиль кодирования? Интересно, как правильно использовать MaximisedBounds. - person Stimpatch; 02.02.2010