Visual C++ 2008 MFCです。
2008に限らず、昔からの疑問があるのですが、
ダイアログクラスのヘッダにデフォルトで書かれる「IDD」のenum定数って、
どのような使いかたのために用意されているものなのでしょうか?
モーダルで作成する際には、コンストラクタ内で自身が参照していますが、
「IDD」ではなく「IDD_***_DIALOG」と書けばよいことですし、
モードレスの際には、外部からIDを指定させることの無いように
Create()を独自に用意したほうがよいでしょうし、
そうなるとこの「IDD」はなんのため宣言しているんだと疑問に感じました。
このダイアログを使用する側が「resource.h」を事前にインクルードしている
というのが暗黙の前提になっていますし、
拡張DLLからダイアログクラスをエクスポートする際にも
このヘッダでのIDDの宣言が弊害になってしまいます
(拡張DLLを使うアプリケーション側のresource.hには無い定数)。
存在理由をご存じのかたがいらっしゃれば、教えていただけたらと思います。
そのクラス内で記述する分にはIDDで良いというくらいの意味しか
思いつかないですね。(少なくともソースを見ている限りでは)
確かにモードレスダイアログの実装をする時にCreate関数を独自で
用意するときには使ってました。
return(CDialog::Create(IDD, pParent));
この一文で済んでいたので若干は楽でした。
他のクラスに持って行く時もそのままコピーで済んでましたし。
拡張DLLからダイアログクラスをエクスポートする使い方に関しては
頻繁にそういう使い方をすると言う意識がなくてそういう事になって
いるんじゃないかなぁ。
と言うわけで存在理由と言うほどの話は知らないですね。
一般にはたいした使い道はありませんが、
基本クラスで使えるダイアログテンプレートを
規定できるという面があるかもしれません。
class DLG_BASE : public CDialogEx
{
public:
typedef enum ID_DLG_BASE{ // 以下のテンプレートをサポート
IDD_0 = IDD_OPTION_0,
IDD_1 = IDD_OPTION_1,
IDD_2 = IDD_OPTION_2,
}ID_DLG_BASE;
DLG_BASE( ID_DLG_BASE type, CWnd*Parennt):CDialogEx( type, Parent)
{}
};
良く似てはいるが微妙に異なる複数のDLGテンプレートの共通部分だけを
サポートする基本クラスを設計するときにはやや便利かもしれません。
enumにしたのは、常数としての面と、演算可能な整数の面の両方で
使えるように配慮されているのかもしれません。
常数×
定数○ とほほっ
> そうなるとこの「IDD」はなんのため宣言しているんだと疑問に感じました。
俺ら側の為のモノじゃ無く IDE(VC++) の為のモノじゃないの、と俺は思う。
class CDialogXXXX : public CDialog {};
がどのダイアログリソースに対応したモノかという情報が無いと IDE も手伝う事(配置
された子コントロールのイベントハンドラ定型を CDialogXXXX に追加する等)が出来な
いだろうしね。
PATIOさん、仲澤@失業者さん、gakさん、ご意見ありがとうございます。
たしかに、VC6の頃のソースを読み返してみたところ、
ClassWizardが解釈できる位置に「IDD」は書かれていました。
VS2008などでは、ClassWizard用の「//{{」~「}}//」の記述は無くなっていますが、
ヘッダ内の「IDD」を削除し、コンストラクタの記述を直してみたところ、
VSが情報を見失っているようで、プロパティのペインが正しく表示されなかったり、
ダイアログエディタ上でイベントハンドラを追加しようとするたびに
ダイアログクラスの新規作成画面が表示されるようになっていました。
ClassWizardやIntelliSenseが使っていたのですね。
できればヘッダではなく、ソース内で完結するようにしてもらいたかったです。
ありがとうございました。