• ベストアンサー

ダイアログを継承したダイアログの作成について

お世話になります。 今回お聞きしたいことは、 オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか? ということです。 何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。 そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。 継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。 ご回答を宜しくお願い致します。 開発環境は Windows CE 6.0 Visual Studio 2005 です。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

私、CEの経験がないので厳密なところはわからないのですが、 一般的なMFCであれば、可能です。 ただし、条件により困難さが変わります 1)4つのダイアログが全て同じコントロールのみからなる場合   コントロールは同じだが、ラベルのキャプションが違うとか   リストボックスのデータが違うとかいう場合です。   非常に単純です。普通の派生と全く同じ感じです   OnInitDialog等適当な関数をオーバーライドするだけです。 2)共通のコントロール以外に独自のコントロールも持つ場合   多少困難です   いくつかアプローチが考えられます。   a) ダイアログ・テンプレートを個別に持つ方法     リソース内のダイアログ・テンプレートは(共通のコントロールも含め)     コピー&ペーストなどで独自に作成します(4つ作ります) それぞれを制御するクラスですが、     ウィザードのサポートを受けられない     (ウィザードではCDialog派生にされてしまう)     ので、既存のCDialog派生クラスを参照して     自力で希望のCDialog派生からさらに派生させるようにします     リソースIDとクラスの結びつけ方法などは既存のクラスを     参考にしてください   b)リソースも完全に共通化する     ちょっと難しいかもしれません。     OnInitDialog等で自力でコントロールをCreateします。     レイアウトが視覚的にできないので非常に困難ですが、     隣接するコントロールの位置情報をもとに計算するなどしてください。     ダイアログの大きさに余裕があり、     追加するコントロールも小さなもの     (1行のみのエディット等)であれば、     最初から場所をstaticコントロールで場所を確保しておき     非表示にしておいて、     派生クラスで、そのstaticの位置を取得するとかなり楽ができます。     派生クラスで、本格的にレイアウトが変わってしまう場合は、     レイアウトを頭に入れながら、Createし、試行錯誤で     完成させることになるでしょう。 以上の方法がCEでも通じるのかわかりませんが、 参考になれば幸いです。        

fujtomo
質問者

お礼

詳細な回答ありがとうございます。 現在の開発状況ですと、2)の状況に当てはまります。 ClassWizardですとリソースを別にして、作成してしまうので、自力でコードを入力してダイアログを作成していくわけですか。。 なかなか難しい作業が必要なんですね。 現在の仕事ではあまり時間がなく、勉強する暇がないのですが、今後手が空きましたら、勉強させていただきます。 ご回答ありがとうございました。

その他の回答 (1)

  • takoashi
  • ベストアンサー率39% (21/53)
回答No.1

MFCですか? リソースの指定があるのでそううまくはいきません。 無理でもありませんが、おすすめはしません。 共通の処理をオブジェクトコンポジションで実装してみはいかがですか? もしくは、その共通部分をダイアログにして、4つのダイアログに張り付けるというのはどうですか? タブを実装するときのような感じです。。

fujtomo
質問者

お礼

回答が遅くなり、申し訳ございません。 そうですよね、リソースの関係から簡単に出来るものではないと思っていましたが、やはりですか。 >共通の処理をオブジェクトコンポジションで実装してみはいかがですか? というのは各ダイアログの共通の処理を、あるクラス内のメンバ関数になりにしてそれぞれのダイアログで、その処理をメンバとするクラスのオブジェクトを呼ぶということですね? 処理の方法はそれでいこうと思っています。 >もしくは、その共通部分をダイアログにして、4つのダイアログに張り付けるというのはどうですか? タブを実装するときのような感じです。。 この方法ですと、一つの画面の表示にならないと思うので、あまり見栄えがよくないかなと思い、一度考えたのですが実装をしてみませんでした。 ご回答ありがとうございました。

関連するQ&A

  • 3つのスタティックに共通の動作をさせる手法

    お世話になります、fujitomoです。 現在、Visual Studio 2005にてVisual C++のMFCを使ったダイアログベースの プログラムを作成しております。 そこで行き詰ってしまった箇所があった為、今回質問させて頂きました。 アプリケーションの内容としては オリジナルのCStatic継承のクラスを作成し、そのインスタンスを3つ、メインダイアログ内のメンバ変数として定義します。 これらのインスタンスの動作としては、1秒毎に乱数を計算し、それをダイアログ上に表示させる、といったことをします。 ここで質問したいことなのですが、 これら3つのCStaticにはある範囲をもたせており、乱数がその範囲外になるとCStaticの数値、背景の色を変更させたいと思っています。 そこで、これら3つのうち、1つでもその乱数が範囲外になった場合に、3つとも全てのCStaticの数値、背景の色を変化させるにはどのようにすればいいでしょうか? イメージとしては、3つのCStaticがある1つの親からの継承で、その親側で色の変化のコードを作成すれば、それが子のクラスのCStaticクラスにも影響を与えるのかな?と思っています。 なにかご意見がありましたら、宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。 ご回答をお待ちしております。

  • ダイアログ間のメッセージの送信について

    いつもお世話になっております。 現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。 現在のアプリケーションの全体像なのですが、 ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。 そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。 それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。 質問させて頂きたいことは メインダイアログへダイアログ1,2からメッセージ送信をする場合には ::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0); でメッセージ送信をすることは出来ました。 しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに void C****1Dlg::OnBnClicked(){ C****2Dlg m_dlg2; ::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。 上述のコードで何か間違えている箇所があるでしょうか? メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。 ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • メインダイアログからの各ダイアログの呼び出し時に発生するエラーについて

    お世話になっています、fujitomoと申します。 現在、Visual C++のダイアログベースプログラムを作成しており、 メインダイアログから、各ダイアログ(計7つほど)にメッセージを送信したり、DoModal()で表示するために、メインダイアログのメンバ変数に各ダイアログのインスタンスを定義しました。 Ex) CSampleAClass A; CSampleBClass B; このように、定義し、いざメインダイアログからダイアログを呼び出そうとしたときに以下のようなメッセージのエラーが表示されました。 Unhandled exception at 0x40042c10 in Sample.exe: 0xC00000FD: Stack overflow. これはWindows CEのみのメッセージかもしれないのですが、たぶん言いたいことはスタックオーバーしてるよ、ということだと思います。 そこで、計7つのダイアログの定義を少なくして、6つにしたところ、上のエラーメッセージはでず、正常にダイアログが表示されました。 次にメンバ変数で各ダイアログのインスタンスを定義するのではなく、そのポインタを定義するようにプログラムを変更してみました。 Ex) CSampleAClass* A; CSampleBClass* B; このようにすると、計7つのダイアログをメンバ変数に定義してもエラーが発生せずに、正常にダイアログを表示させることが出来ました。 この理由はなぜでしょうか? C言語を始めて時間はたっているのですが、いまだにいまいちインスタンスのオブジェクトとそのポインタでの定義における違いがよく分かっていません。今回のことから、クラスをメンバ変数に定義するときはポインタで定義したほうがいいということなのでしょうか? ご参考となる意見がございましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。 宜しくお願い致します。

  • メインダイアログが最背面に表示されてしまいます。

    お世話になります、fujitomoです。 C++のダイアログベースのプログラムを作成しているのですが、ご質問 させていただきたい件がありまして、こちらへ書かせて頂きました。 質問させて頂きたい内容は、メインダイアログにて、他ダイアログをAfxBeginThread()を用いて別スレッドでモーダル表示させた時、その他ダイアログを他ダイアログ内でEndDialog(IDOK)で閉じた際に、メインダイアログが最背面になってしまうのですが、この原因として考えられることはありませんでしょうか? ちなみに、他ダイアログを別スレッドではなく、メインダイアログ内にてモーダル表示をし、EndDialog(IDOK)で閉じた際には、メインダイアログが最背面になることはありませんでした。 参考となるご意見がありましたら、よろしくお願い致します。 開発環境は Visual Studio 2005です。

  • ダイアログの非表示が遅い

    ダイアログの非表示が遅い Windows CE上で動作するソフトを作成中で、約2cm×2cmほどのボタンだけのダイアログが1つ(メインのダイアログ)、約2cm×1cmほどのボタンだけのダイアログが3つあります。(ダイアログの大きさは、それぞれのボタンと同じサイズで、メイン以外はモーダレスです。) その中の1つを押すと、別の全画面サイズのダイアログを表示し、そのダイアログ上のボタンを押すと、元のボタンだけになるようにしています。 全て、メインのダイアログのOnInitDiarog()で生成しておき、ShowWindow(SW_SHOW)で表示し、ShowWindow(SW_HIDE)で非表示にしているのですが、全画面サイズのダイアログを非表示にする際、表示が消える前に、ボタンのダイアログが表示されてしまい、見た目がかなり悪いのです。 Windows CEは遅いと聞いた事はあるのですが、どうにか対処する方法はないのでしょうか? どなたか助言をお願い致します。 環境は以下の通りです。 ・Windows CE 5.0 ・Visual C++ 2005 ・MFCスマートデバイス 以上、よろしくお願いします。

  • ダイアログ間のデータ渡し

    開発環境:vista Visual Studio 2012 C言語 メインのダイアログから、他のダイアログにデータを渡したい場合(もしくはその逆)は、どうすればよいのでしょうか。 受け渡しするものを、すべてグローバルにする方法は思いつくのですが、これ以外の方法ではどのようにすればよいのでしょうか。 参考になるサイトやAPIなどを教えてください。 例えば、 アプリケーションで、設定のメニューバーを押すと、ダイアログが出てきて設定をするというイメージです。この場合、ユーザが設定した値をメインのダイアログに渡しているということですよね。

  • 子ダイアログのコントロールにフォーカス(VC++2005)

    お世話になります。 Visual Studio 2005でVC++の開発をしております。 ダイアログを2つ用意して、一つはstyleを「ポップアップ」に、 もう一つは「子」にしてます。 親ダイアログ内にタブをセットし、その上に子を乗せる処理を行っていて 親のダイアログのボタンイベントから子のダイアログのコントロールにフォーカスを 当てたいのですが、どのようにしたらよろしいのでしょうか? 親ダイアログ内では、 (子ダイアログ).Create(子ダイアログクラス, this); で生成して MoveWindowやShowWindowで位置・表示の設定を行っています。 親から子ダイアログ内のコントロールの入力チェックを行おうと思い、 未入力判定まではできたのですが どうしてもSetFocus()でフォーカスが当たりません。 どなたかご教授していただけますでしょうか?

  • ダイアログ上コントロールの動作について

    MFCでダイアログにて動作するアプリケーションを作成しています。 表示されたダイアログの枠をドラッグすると、ダイアログの大きさが変わりますが、 中にあるコントロールの大きさ・位置は変わりません。 ダイアログの大きさ変更に伴い、コントロールの大きさも変更するには、 どのような実装の仕方をすれば良いのでしょうか? 解決法をご存知の方おられましたら、ご教授お願い致します。 開発環境はVC++2005です。

  • リソースのダイアログについて

    質問させてください。 現在私はvisual C++6.0のリソース機能を用いてダイアログを作成しております。 そのダイアログに、コントロールの機能をたくさん追加していたのですが、ある数を超えたところで追加できなくなりました。 ひとつのダイアログで使えるコントロールの数は限りがあるのでしょうか?? (MFCの機能は使っておりません。)

  • Windows Mobile6.1でのダイアログアプリケーション開発について (VC++)

    開発環境:Visual Studio 2008 SP1 OS:Windows XP SP3 Windows Mobile(以下WM)向けのダイアログアプリケーションの開発をはじめたのですが、 ダイアログ表示時のスクロール処理について不明な点がございます。 WM上では基本的にフルスクリーンでダイアログが表示されるようですが、配置するコントロールの 種類や数によっては、フルスクリーンのサイズでは納まらず、ダイアログを縦長にデザインしたい などといった状況が多々あります。 単純に上記のようなダイアログを作成して実行してみましたが、OS側がダイアログ上にスクロールバーを 表示してくれて、それを使うことでスクロール表示が行えるというわけではないようでした。 (たとえばダイアログ下部にボタンコントロールを配置してあっても、画面上に表示できない状態) ダイアログのプロパティに「Vertical Scrollbar」や「Horizontal Scrollbar」という項目があり、これを 有効にした上でイベントを使用すればスクロールされている位置情報などが取得できることまでは調べたのですが、 目的である「画面表示外となっている部分を表示する方法」がわかりませんでした。 そもそもWMの開発方法として考え方が誤っているのかもしれませんが、 このような状況に対応する方法をご存知の方がいらっしゃいましたらご教示頂けませんでしょうか?

専門家に質問してみよう