3

我在 MDI 父窗体类中覆盖 ProcessCmdKey() 并在同一类中有一些键盘快捷键调用方法。但我希望使这些热键以父/子形式和其他形式工作。现在的情况是当关注其他表单(常规表单,而不是 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
    {
        ...
    }
}
4

1 回答 1

1

您可以使用实现的 ProcessCmdKey 处理程序定义一个“基本”表单,然后制作所有其他表单:MDI 父级、MDI 父级的子窗口以及您创建的任何“独立”表单(即,不是 MDI 的子级) Form) 继承自“基本 Form”。只需确保在您希望成为 MDI 的窗体上设置了 IsMdiContainer 属性,并且您添加到 MDI 窗体的子窗口不是 TopLevel 并且将它们的父窗口设置为 MDI 窗体。

那么问题是,你想在哪里处理由你启用的组合键触发的事件,因为......如果你定义了由基本表单中的捕获组合键触发的方法......每个继承的表单来自基本表单的将在他们自己的上下文中执行它们。

如果您想在应用程序范围内处理捕获的组合键,请实现一个静态公共类,其中键组合处理程序定义为静态方法。或者,由于您可能想知道从哪个表单发出的特殊组合键,只需将一个指向调用 Form 的指针传递给静态处理程序。

因此,基本表单中 ProcessCmdKey 覆盖中 control + Tab 的处理程序可能如下所示:

    // 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
            }
        }
    }
}

正如您在上面的代码中看到的,您可以使用调用 Form 的 ActiveControl 属性来了解给定类型的 Form 上的哪个控件获得了组合键。

当然,如果您不想像这样“全局”处理组合键,只需根据需要在其他表单中插入您的 ProcessCmdKey 覆盖,并且不要让它们从基本表单继承。

处理“应用程序范围”的关键事件可能是,也可能不是您的特定解决方案的最佳策略,但它是一个可行的策略。最好的,

于 2009-11-10T04:10:45.013 回答