CDialogの継承について質問させていただきます。
CDialogを継承したMyBaseDialogを作成して、
更にMyBaseDialogを継承したMyDialogを作成したいのですが、
VS上でクラスファイルは作成できるのですが、新たに作成したリソースと一致させることができません。
CDialogを継承した自作Dialogは継承するな!ということでしょうか?
どなたかご教授ください。
具体的にどういう操作をしてるのかわからないけど
Q1.
class CMyBaseDialog : public CDialog { ... };
class CMyDialog1 : public CMyBaseDialog { ... };
class CMyDialog2 : public CMyBaseDialog { ... };
なるコードを手書きしたら動作するか?しないか?
A1.する。まったく問題ない。
Q2.上記コードで ClassWizard/Resource Editor が使えるか?
A2.使えないと思う。リソースもソースも手書きすれば問題ない。
逆に Wizard を使いたいなら基底クラスは CDialog でないと無理。
Wizard で class CMyDialog1 : public CDialog {...}; なるコードを
ひとまず生成させておいて、一通りコンパイル通るようになったら
基底クラスを手書きで CMyBaseDialog にするってのはあるかも。
その後はもう Wizard は使わない、ってことで。
tetrapodさん
ご返信ありがとうございます。
複数の画面で同じ処理をコピーやギャラリ追加で対応するのが、個人的に嫌なので、ベースダイアログを用意し、継承すれば簡単かなと考えていました。
でも、派生ダイアログのリソースを手書きするしかないのであれば、
よりいっそう生産性が悪くなるので、今まで通りCDialogを継承したリソースやクラスファイルなどをコピーやギャラリ追加等で対応します。
出来るけど解決でいいのかな?
やりたいことが全然分からないんで、とりあえず一番簡単に継承をするための方法を↓
1. Dialogを適当に作成
2. そのダイアログについてクラス作成「CParent」
3. さらにDialogを適当に作成
4. そのダイアログについてクラス作成「CChild」
1. Parent.hの編集
・CParentのコンストラクタを
CParent(CWnd* pParent = NULL); から
CParent(UINT IDD, CWnd* pParent = NULL); に変更する
・ダイアログデータは不要(削除しなくてもいいけど)
enum { IDD = xxx };
2. Parent.cppの編集
・CParentのコンストラクタをヘッダの修正に合わせる
・CDialogへ渡す値を変更
CDialog(CParent::IDD, pParent) から
CDialog(IDD, pParent) に変更する
3. Child.hの編集
・Parent.hをインクルード
・継承元をCParentに変更
4. Child.cppの編集
・CDialogの記述を全てCParentに変更
これで、自作Dialogを継承できますよ
もちろん、ベースダイアログも派生ダイアログもClassWizard/リソースエディタは使えますよ(上の例ではベースダイアログはリソース使用しませんが)
自作Dialogを継承するのはいいのですが、どういう処理をやりたいのか分からないのでやりたいことを書いてください。
やりたいことによって、対応方法が変わってきます。
処理の内容によっては違う方法が考えられたりしますので
ysfactoryさん
ご返信ありがとうございます。
やりたいことは、単純にオーバーライドしなけりゃいけないものや、全ての画面で共通の処理を持つ、CDialogを継承したベースダイアログを作成しておいて、画面が増えるたびに派生させていくほうが開発効率が上がるかなと考えてました。
つまり、今請け負ってるプロジェクトで使用する共通の
ダイアログベースができたらな〜ぐらいに考えてました。
でも、リソースを手書きで対応するしかないとすると
より生産性が低下するのであきらめてました。
(質問内容とずれてしまうのですが、リソースの問題以外に仮に手書き、ysfactoryさんの方法問わず作成されたベースダイアログをどのように参照して継承するかも悩んでいます。)
リソースも継承したいのですね。
それなら、まず普通にダイアログを作成して実装完了し、それをベースダイアログとします。
その後は、そのベースダイアログのリソースをコピーして、そのダイアログを派生ダイアログとして、後は上記の操作をやると継承されます。
・・・という答えでは、VC++6.0さんの求めている回答になりませんが、これくらいしか出来ないと思います。
(ここからは質問の答えからは逸れます)
もし、ベースダイアログのリソースのレイアウトが決まっていて、そのレイアウトに対して追加したいだけというのであれば、継承する必要はないです。
ベースダイアログを親ダイアログとして、そのダイアログの中に子ダイアログとして貼り付けることでやりたいことが実現できるのではと思います。
レイアウトによってはリージョンを設定する必要があるかもしれませんね。
的外れな回答でしたらごめんなさい