Проблема с пользовательским интерфейсом: способ отображения детей MDI на панели задач? - PullRequest
0 голосов
/ 29 мая 2011

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

Однако способ MS ExcelПодход к интерфейсу MDI также интересен и, благодаря тому, как работает наше приложение, может стать хорошим решением.Проблема в том, что это решение кажется более сложным по одной основной причине: отображение дочерних форм MDI на панели задач.

Итак, мой вопрос заключается в следующем: кто-нибудь может дать мне несколько советов о том, как получить MDIДети появляются в панели задач.Я почти уверен, что нет абсолютно никакого способа сделать это из .NET Framework.Я изучал способы взглянуть на соответствующий Windows API, но, похоже, я не вижу очевидного способа попробовать и получить то, что нам нужно.

Заранее спасибо.

РЕДАКТИРОВАТЬ

Я забыл упомянуть о целях приложений, главным образом, на платформе Win XP.

Ответы [ 3 ]

2 голосов
/ 29 мая 2011

Вы правы, что нет способа сделать это напрямую из C #, поскольку эта функциональность реализована не в .Net Fx, а в Windows API. К счастью, Microsoft предоставляет управляемую библиотеку для доступа к этим функциям в Windows 7 (и некоторых Windows Vista). Взгляните на Windows API Code Pack для Microsoft .Net Framework . Функциональность, которую вы ищете, называется Миниатюры с вкладками .

1 голос
/ 29 мая 2011

Это немного взломать, но работает в XP. В Windows 7 это выглядит не слишком хорошо, поэтому вместо этого вам нужно будет реализовать API миниатюр с вкладками.

По сути, он создает невидимую суррогатную форму для каждого дочернего элемента управления MDI, а когда суррогат получает фокус (когда вы выбираете его на панели задач), он передает его в соответствующее дочернее окно.

Предполагая MDI-контейнер с именем Form1, этот код будет делать это:

    private void Form1_Load(object sender, EventArgs e)
    {
        CreateWindow("child 1");
        CreateWindow("child 2");
    }

    private void CreateWindow(string name)
    {
        Form window = new Form();
        window.MdiParent = this;
        window.Text = name;
        window.Show();

        Form surrogate = new Form();
        surrogate.FormBorderStyle = FormBorderStyle.None;
        surrogate.Text = name;
        surrogate.Show(this);
        surrogate.Size = Size.Empty;
        surrogate.GotFocus += new EventHandler(surrogate_GotFocus);

        surrogate.Tag = window;
        window.Tag = surrogate;
    }

    void surrogate_GotFocus(object sender, EventArgs e)
    {
        Form surrogate = sender as Form;
        if (null != surrogate && null != surrogate.Tag)
        {
            Form target = surrogate.Tag as Form;
            target.Focus();
        }
    }

Опять же, я не думаю, что отклонение от дизайна - хорошая вещь здесь. Вам лучше придерживаться ограничений MDI и внедрять соответствующие API в новых установках ОС. Если вам действительно нужно, чтобы окна отображались на панели задач, то вы можете использовать такой хак, как этот.

1 голос
/ 29 мая 2011

По умолчанию дочерние элементы формы MDI не отображаются на панели задач.Лучше придерживаться этого принципа.

В Windows 7 вы можете добавить «миниатюру» для дочернего элемента MDI на панель задач, но эта функция недоступна непосредственно в .net.Вы можете проверить MSDN на наличие дополнительных API.

Однако существует обходной путь: при выборе формы вы можете отсоединить ее от родителя MDI.Вы должны убедиться, что он повторно присоединяется при выборе новой дочерней формы.Добавьте следующий код в форму контейнера MDI:

    private Form focusedChild;

    private void CreateWindow()
    {
        Form window = new Form();
        window.GotFocus += new EventHandler(Child_GotFocus);
        window.Show();
    }

    void Child_GotFocus(object sender, EventArgs e)
    {
        Form window = sender as Form;

        if (null != window)
        {
            if (focusedChild != null && window!=focusedChild)
            {
                focusedChild.SuspendLayout();
                focusedChild.MdiParent = null;
                focusedChild.WindowState = FormWindowState.Minimized;
                focusedChild.ResumeLayout();
            }


            window.SuspendLayout();
            window.MdiParent = this;
            window.WindowState = FormWindowState.Maximized;
            window.ResumeLayout();

            focusedChild = window;
        }
    }

Однако я бы не рекомендовал это.Придерживайтесь поведения по умолчанию или посмотрите на эскизы Windows 7, если ваше приложение будет работать в Windows 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...