none
皆さんならどう実装されますか?(MDIでツールバーマージ) RRS feed

  • 質問

  • 昨日質問させていただいたC#初心者です。

    実装の問題にぶちあたりましたので、皆さんの意見・アドバイスをいただければと思います。

     

    環境:VC#2008

    したいこと:C#のWindowsFormアプリケーションで、MDI形式。子ウィンドウが開くと子ウィンドウがもつ、

           ツールバーとメニューを親のそれにマージしたい。

           ただし、子ウィンドウは1つ以上あれば常に同じツールストリップ・メニューで、その設定が

           開かれているすべての子ウィンドウに対して有効、といった状態。

           すべての子ウィンドウが閉じた場合に限り、子ウィンドウが保持していたツールストリップ・メニューを

           Revertする。

    問題:   単純に手動Mergeすると、インスタンスの数だけマージされるので子ウィンドウの生成・消滅のときに

           子ウィンドウの数を見てMerge/RevertMergeを調整した。しかも、上記のとおり、ツールストリップ。メニューは

           開いている子ウィンドウすべてに対して有効なため、メニューをインスタンス化するとNG.

           そこでメニュー・ツールストリップをprivate → public staticに変更。あわせて、thisをクラス名に変更。

           もともとはデザイナで吐き出されたコードなので、デザイナで見るとクリアされてしまうため、

           自作のコードのInitializeを作成し、そちらに退避。

           しかし、ルーツバーアイコンがリソースを介して読み込んだものなのでロードされない。

     

    考え:   自作の側でアイコンロードしてもいいが、最終的にメンテナンス性が悪くなる。

          (デザイナとは独立して操作しないといけない、なんて見栄えが悪い。。)

           かといって親側で子のメニュー・ツールストリップをもつとオブジェクト指向からずれたものになる。

          (親側で子用のメニュー・ツールストリップ、そのハンドラも持つことになる!おまけに処理が煩雑。。)

     

    一般的にこんなときはこうする、といったアイデア・提案などあればよろしくお願いします。

    2008年12月9日 15:14

すべての返信

  • こんにちは!(^^)!ふ~です。

     

    C#で、MDI型Windowsアプリケーションを作成するのは面白そうです。

    「エンジニア」さんはさすがに、凝っています。

    まあ、私も、「エンジニア」さんと、似たような事になると思います。

     

    >ツールバーとメニューを親のそれにマージしたい。

     

    そもそも、この仕様が、オブジェクト指向に不向ではと私は思います。子ウインドウにも、メニューは作れる分けで

    すから、同じメニューを親が持つのは、処理の分割から言えば良くない話です。特に、メニューのイベント処理が

    混乱します。また、操作でも、親と子に同じメニューはまぎらわしいですね。

     

    ◇ご参考資料

    第1回 MDI型Windowsアプリケーションの基礎開発

    http://www.atmarkit.co.jp/fdotnet/winexp/winexp01/winexp01_02.html

    2008年12月16日 6:01