none
MDIにパネルを配置すると子フォームがひとつだけ表示の場合にフォーカスが移動できなくなる。 RRS feed

  • 質問

  • Visual Studio Express 2012でMDI親フォームを使用したWindowsフォームアプリケーションの開発を行っていますが、下記の問題が発生しておりいます。回避方法に関してアドバイスよろしくお願いします。

    MDIにパネル(Dock=Left)、パネル上にボタンを2つ配置しています。子フォームを表示した直後は、子フォームでマウスウィールに反応しますが、パネル上のボタンをクリックし、再度、子フォームをクリックしてもその後マウスウィールに反応しません。

    また、子フォームがない状態では、Tabキー操作により、パネル上の2つのボタンが交互にフォーカスを取得しますが、子フォームがひとつ表示されている状態では、2つ目のボタンにフォーカスが移動した後、Tabキー操作でフォーカスの移動ができなくなります。ただし、子フォームが2つになるとTabキーでフォーカス移動が

    パネル上のボタン1→パネル上のボタン2→子フォーム1→子フォーム2→パネル上tのボタン1...

    フォーカス移動が行われます。


    2015年4月19日 10:44

回答

  • こんにちは。

    これはおそらく仕様ではないですよね…。
    MDI子ウインドウ以外にフォーカスがある場合に、アクティブっぽい表示になっているMDI子ウインドウが
    WndProcを処理してくれないようでした。

    ただ、MDI親ウインドウの管理上はアクティブと判断されているので
    親側でActiveMdiChildを一度取得して、非アクティブ→アクティブ化としてやればマウスホイールについては無理やりですが何とかなりそうでした。

    たぶんタブ遷移についてもメッセージを処理してくれないからだとは思いますが、
    回避策あるのでしょうか…。

    #MDI初めて触ったもので、もし見当違いの方向で回答していたらご指摘ください…。

    • 回答としてマーク ymf744b 2015年4月19日 13:22
    2015年4月19日 12:17
    モデレータ

すべての返信

  • こんにちは。

    これはおそらく仕様ではないですよね…。
    MDI子ウインドウ以外にフォーカスがある場合に、アクティブっぽい表示になっているMDI子ウインドウが
    WndProcを処理してくれないようでした。

    ただ、MDI親ウインドウの管理上はアクティブと判断されているので
    親側でActiveMdiChildを一度取得して、非アクティブ→アクティブ化としてやればマウスホイールについては無理やりですが何とかなりそうでした。

    たぶんタブ遷移についてもメッセージを処理してくれないからだとは思いますが、
    回避策あるのでしょうか…。

    #MDI初めて触ったもので、もし見当違いの方向で回答していたらご指摘ください…。

    • 回答としてマーク ymf744b 2015年4月19日 13:22
    2015年4月19日 12:17
    モデレータ
  • 早速のご連絡ありがとうございます。

    >これはおそらく仕様ではないですよね…。

    ですよね…

    アクティブっぽい表示になっているMDI子フォームのクリック時にHide/Showして、非アクティブ→アクティブでマウスウィールは無理やりできることは確認してはいるのですが、複数子フォームがある場合にちらつきなど副作用が発生してしまいます。

    パネルがフォーカス取得したタイミングで、子フォームを非アクティブにできれば、Tabキーによる操作も対応できるのではと考えていますが、非アクティブの方法がわかりません。対応方法ご存知でしょうか?
    2015年4月19日 12:43
  • 非アクティブの方法がわかりません。対応方法ご存知でしょうか?

    MDI親フォーム側で、

    this.ActivateMdiChild(null);
    としてやれば、MDI子フォーム側でDeactivateが走りますね。
    2015年4月19日 12:58
    モデレータ
  • ありがとうございます。

    確かに子フォームでDeactivateが走りますが、MDIでMdiChildActivateが走ってActivateMdiChildが再設定されてしまっているようです。なぜか子フォームでActivateは走りませんが…

    小手先の対応は難しそうですね…、お付き合いいただきありがとうございしまた。

    2015年4月19日 13:21