Попробуйте реализовать глобальное сочетание клавиш в родительской / дочерней форме MDI и другой форме с помощью ProcessCmdKey - PullRequest
2 голосов
/ 10 ноября 2009

Я переопределяю ProcessCmdKey () в своем классе родительской формы MDI, и у меня есть несколько методов вызова сочетаний клавиш в том же классе. Но я хочу, чтобы эти горячие клавиши работали в родительской / дочерней форме и в другой форме. Теперь случай, когда фокус на другой форме (обычная форма, а не MDI), ProcessCmdKey () больше не захватывает клавиатуру. В какой класс я должен поместить ProcessCmdKey () и что-нибудь, чтобы он работал? Спасибо!

namespace myNamespace
{
    public class MDIParent : System.Windows.Forms.Form
    {

        public bool NextTab(){...}
        public bool PreviousTab(){...}

        protected override bool ProcessCmdKey(ref Message message, Keys keys)
        {
            switch (keys)
            {
                case Keys.Control | Keys.Tab:
                    NextTab();
                    return true;

                case Keys.Control | Keys.Shift | Keys.Tab:
                    PreviousTab();
                    return true;
            }
            return base.ProcessCmdKey(ref message, keys);
        }
    }

    public class mySecondForm : System.Windows.Forms.Form
    {
        ...
    }
}

1 Ответ

1 голос
/ 10 ноября 2009

Вы можете определить «базовую» форму с помощью реализованного обработчика ProcessCmdKey, а затем создать все остальные формы: родительский MDI, дочерний Windows родительского MDI и любые созданные вами «независимые» формы (т. Е. Не дочерние) формы MDI) наследуются от «базовой формы». Просто убедитесь, что свойство IsMdiContainer установлено в форме, которую вы хотите использовать в качестве MDI, и что дочерние окна, которые вы добавляете в форму MDI, не являются TopLevel и их родительский элемент установлен в форму MDI.

Тогда возникает вопрос, где вы хотите обрабатывать события, запускаемые комбинациями клавиш, которые вы включили, потому что ... если вы определяете методы, которые должны запускаться комбинациями клавиш, попадающими в ловушку, в базовой форме ... каждый Форма, которая наследуется от базовой формы, будет выполнять их в своем собственном контексте.

Если вы хотите обрабатывать захваченные комбинации клавиш на уровне приложения, то реализуйте статический открытый класс с обработчиками комбинаций клавиш, определенными как статические методы. Или, так как вы можете захотеть узнать, из какой формы выдается специальная комбинация клавиш, просто передайте указатель на вызывающую форму в статический обработчик.

Итак, ваш обработчик для элемента управления + Tab в переопределении ProcessCmdKey в базовой форме может выглядеть следующим образом:

    // in ProcessCmdKey override in base Form
    case Keys.Control | Keys.Tab:
        KeyHandler.NextTabHandler(this);
        return true;

Ваш статический класс может выглядеть примерно так:

public static class KeyHandler
{
    public static void NextTabHandler(Form theCallingForm)
    {
        Console.WriteLine("called from : " + theCallingForm.Text + " : ActiveControl : " + theCallingForm.ActiveControl.Name);

        if (theCallingForm is MDIForm)
        {
            // handle Next Tab on MDIForm control
        }
        else if (theCallingForm is childForm)
        {
            // handle Next Tab on ChildForm control
        }
        else
        {
            if(theCallingForm is independentForm)
            {
                // handle Next Tab on "independent Form" control
            }
        }
    }
}

Как видно из приведенного выше кода, вы можете использовать свойство ActiveControl вызывающей формы, чтобы узнать, какой элемент управления в данном типе формы получил комбинацию клавиш.

Конечно, если вы не хотите обрабатывать комбинации клавиш «глобально», как это, просто вставьте переопределения ProcessCmdKey, как это необходимо в других формах, и не позволяйте им наследовать от базовой формы .

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

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