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 の子ではない)フォーム) は「基本フォーム」から継承します。MDI にしたいフォームで IsMdiContainer プロパティが設定されていること、および MDI フォームに追加する子ウィンドウが TopLevel ではなく、親が MDI フォームに設定されていることを確認してください。

問題は、有効にしたキーの組み合わせによってトリガーされるイベントをどこで処理するかということです...ベースフォームのトラップされたキーの組み合わせによってトリガーされるメソッドを定義すると...継承する各フォームベースフォームから、それらを独自のコンテキストで実行します。

トラップされたキーの組み合わせをアプリケーション全体で処理する場合は、静的メソッドとして定義されたキーの組み合わせハンドラーを使用して静的パブリック クラスを実装します。または、発行された特別なキーの組み合わせがどのフォームから発行されたかを知りたい場合は、呼び出しフォームへのポインターを静的ハンドラーに渡すだけです。

したがって、ベース フォームの 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
            }
        }
    }
}

上記のコードでわかるように、呼び出し元の Form の ActiveControl プロパティを使用して、特定の種類の Form のどのコントロールがキーの組み合わせを取得したかを知ることができます。

もちろん、このようにキーの組み合わせを「グローバルに」処理したくない場合は、必要に応じて ProcessCmdKey オーバーライドを他のフォームに挿入し、ベース フォームから継承させないようにします。

「アプリケーション全体」で重要なイベントを処理することは、特定のソリューションにとって最適な戦略である場合とそうでない場合がありますが、実行可能な戦略です。一番、

于 2009-11-10T04:10:45.013 に答える