- ベストアンサー
ダイアログを継承したダイアログの作成について
お世話になります。 今回お聞きしたいことは、 オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか? ということです。 何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。 そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。 継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。 ご回答を宜しくお願い致します。 開発環境は Windows CE 6.0 Visual Studio 2005 です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
私、CEの経験がないので厳密なところはわからないのですが、 一般的なMFCであれば、可能です。 ただし、条件により困難さが変わります 1)4つのダイアログが全て同じコントロールのみからなる場合 コントロールは同じだが、ラベルのキャプションが違うとか リストボックスのデータが違うとかいう場合です。 非常に単純です。普通の派生と全く同じ感じです OnInitDialog等適当な関数をオーバーライドするだけです。 2)共通のコントロール以外に独自のコントロールも持つ場合 多少困難です いくつかアプローチが考えられます。 a) ダイアログ・テンプレートを個別に持つ方法 リソース内のダイアログ・テンプレートは(共通のコントロールも含め) コピー&ペーストなどで独自に作成します(4つ作ります) それぞれを制御するクラスですが、 ウィザードのサポートを受けられない (ウィザードではCDialog派生にされてしまう) ので、既存のCDialog派生クラスを参照して 自力で希望のCDialog派生からさらに派生させるようにします リソースIDとクラスの結びつけ方法などは既存のクラスを 参考にしてください b)リソースも完全に共通化する ちょっと難しいかもしれません。 OnInitDialog等で自力でコントロールをCreateします。 レイアウトが視覚的にできないので非常に困難ですが、 隣接するコントロールの位置情報をもとに計算するなどしてください。 ダイアログの大きさに余裕があり、 追加するコントロールも小さなもの (1行のみのエディット等)であれば、 最初から場所をstaticコントロールで場所を確保しておき 非表示にしておいて、 派生クラスで、そのstaticの位置を取得するとかなり楽ができます。 派生クラスで、本格的にレイアウトが変わってしまう場合は、 レイアウトを頭に入れながら、Createし、試行錯誤で 完成させることになるでしょう。 以上の方法がCEでも通じるのかわかりませんが、 参考になれば幸いです。
その他の回答 (1)
- takoashi
- ベストアンサー率39% (21/53)
MFCですか? リソースの指定があるのでそううまくはいきません。 無理でもありませんが、おすすめはしません。 共通の処理をオブジェクトコンポジションで実装してみはいかがですか? もしくは、その共通部分をダイアログにして、4つのダイアログに張り付けるというのはどうですか? タブを実装するときのような感じです。。
お礼
回答が遅くなり、申し訳ございません。 そうですよね、リソースの関係から簡単に出来るものではないと思っていましたが、やはりですか。 >共通の処理をオブジェクトコンポジションで実装してみはいかがですか? というのは各ダイアログの共通の処理を、あるクラス内のメンバ関数になりにしてそれぞれのダイアログで、その処理をメンバとするクラスのオブジェクトを呼ぶということですね? 処理の方法はそれでいこうと思っています。 >もしくは、その共通部分をダイアログにして、4つのダイアログに張り付けるというのはどうですか? タブを実装するときのような感じです。。 この方法ですと、一つの画面の表示にならないと思うので、あまり見栄えがよくないかなと思い、一度考えたのですが実装をしてみませんでした。 ご回答ありがとうございました。
お礼
詳細な回答ありがとうございます。 現在の開発状況ですと、2)の状況に当てはまります。 ClassWizardですとリソースを別にして、作成してしまうので、自力でコードを入力してダイアログを作成していくわけですか。。 なかなか難しい作業が必要なんですね。 現在の仕事ではあまり時間がなく、勉強する暇がないのですが、今後手が空きましたら、勉強させていただきます。 ご回答ありがとうございました。