2017-09-25 1 views
0

私のアプリケーションで開いているすべてのフォームで1つのMainMenuStripを使用したいと思っています。私はすべてのフォームに同じMainMenuを表示したくないのではなく、MainMenuをMainFormにのみ表示し、他のすべてのフォームからアクセスできるようにする必要があります。すべてのフォーム間で同じメインメニュー - winforms .net

目的の動作はVisual Studio 2013と同じです(他のバージョンでも同じように動作します)。 1つのドキュメントがフローティングで、ALTボタンまたは任意の組み合わせを押すと、 ALT + Fを押すとMainWindowが前面に表示され、MainMenuが表示されますが、MainWindowはアクティブにならないようです。もう一度ALTボタンを押すと、フローティングウィンドウにフォーカスが戻されます。

メニューキーが押されたが、メインフォームがメッセージを処理するためにフォアグラウンドウィンドウである必要があるとき、兄弟フォームからメインフォームにメッセージを転送しようとしました。 https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ToolStripManager.cs,1680

私はMDIを使用したくありません。私はMDIと同じメニュー動作をしたいと思っています。

誰かがこれを達成するための提案があれば、私は非常に感謝します。

+0

メニューホットキーを押すと、フォームを覚えて、メインフォームをアクティブにし、メニューを表示します。メニューが閉じている場合 - 前のフォームをアクティブにします。それとも、私は何かが恋しいですか? – Sinatr

+0

この質問はコマンドラインインターフェイスと何が関係していますか?そのタグは無関係のようです。 –

+0

タグはC++/cliのようにcliとされていました – santa

答えて

1

VSの動作を模倣したい場合、ここには方法があります。

static class Program 
{ 
    static Form _main; 
    static Form _previous; 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     // simulate some environment here 
     _main = new Form1(); 
     _main.FormClosed += (s, e) => Application.Exit(); 
     _main.Show(); 
     new Form2 { Text = "1" }.Show(); 
     new Form2 { Text = "2" }.Show(); 
     new Form2 { Text = "3" }.Show(); 
     Application.Run(); 
    } 

    public static void MenuOpen(Form form) 
    { 
     _main.Activate(); 
     _previous = form; 
     _main.MainMenuStrip.MenuDeactivate += MainMenuStrip_MenuDeactivate; 
     _main.MainMenuStrip.Show(); 
    } 

    static void MainMenuStrip_MenuDeactivate(object sender, EventArgs e) 
    { 
     _main.MainMenuStrip.MenuDeactivate -= MainMenuStrip_MenuDeactivate; 
     _previous.Activate(); 
     _previous.Focus(); 
    } 
} 

Form1フォームが閉じ、アプリケーションが終了するとき、定義されたMainMenuStrip(別名メインフォーム)と任意の形態です。 Form2あなたが必要とするすべてで

は、メニューキーの押下を処理するためにある、一つの可能​​性は - プレビューキーダウンイベントハンドラがある(KeyPreview=trueを設定することを忘れないでください):

void Form2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.Alt) 
     Program.MenuOpen(this); 
} 

デモ:

+0

これはかなりうまくいきます。他のコントロールではPreviewKeyDownイベントが発生するため、VK_MENUでProcessCmdKeyを使用する必要があります。どうもありがとう! – santa

関連する問題