#defineの質問

[戻る]
yama 2005/06/27(月) 11:55:51
#define ID(n) IDC_BUTTON##n
#define BASE  1
CWnd *wnd[5];

wnd[0] = GetDlgItem(ID(BASE+0));
wnd[1] = GetDlgItem(ID(BASE+1));
wnd[2] = GetDlgItem(ID(BASE+2));
wnd[3] = GetDlgItem(ID(BASE+3));
wnd[4] = GetDlgItem(ID(BASE+4));

こんな感じでBASEを変えるとIDも変わるようにしたいけど
できません。
他の方法で実現可能でしょうか?

tib 2005/06/27(月) 12:46:54
IDが連続していることが保証されているなら、

wnd[0] = GetDlgItem(ID(BASE)+0);

ではどうでしょう?

yama 2005/06/27(月) 13:05:37
>IDが連続していることが保証されているなら、
VCが作ってるので保証されてるかどうかわかりません。
こういう場合は無理でしょうか?

RAPT 2005/06/27(月) 13:29:33
> #define ID(n) IDC_BUTTON##n
> #define BASE  1

・上記の順番を逆にするか、
#define BASE  1
#define ID(n) IDC_BUTTON##n

・BASE を変数にしてみては?
static const int BASE = 1;

yama 2005/06/27(月) 13:46:41
[[解決]]
ダメですね。
マクロでは無理か…

tib 2005/06/27(月) 14:27:08
>>IDが連続していることが保証されているなら、
>VCが作ってるので保証されてるかどうかわかりません。
そんなの、resource.hをテキストエディタで編集しちゃえばいいんですよ。
# _APS_NEXT_xxx_VALUE の値だけは気をつける必要あり。

PATIO 2005/06/28(火) 10:15:41
tibさんの案に一票。

私も良くやりますよ。コントロールの配列で処理するときとかに。
ON_NOTIFY_RANGE等を使う時は連続している必要がありますしね。

_APS_NEXT_xxx_VALUEは、リソースエディタがresource.hに新しい値を挿入する時に
使用する値を記録している部分ですね。
修正した結果、該当する部分の値よりも使用している値が大きいときは
使用した値の次の値を入れといてやら無いとリソースエディタでコントロールを追加した時に
同じ値を使われてしまうので要注意ですね。

まずは、resource.hの中身を見てみる事をお勧めします。
見てみれば大体の見当は付くと思いますし。
余裕があれば、xxx.rcの中も見てみると良いと思いますね。
リソースエディタが無かった頃はこれらをテキストエディタで
直接編集していたんですけどねぇ。

ku 2005/06/28(火) 11:31:56
VC6ならリソースエディタでコントロールのプロパティを表示して
IDをIDC_BUTTON1=1234とすると1234にすることができます
IDOKのようなものは読み取り専用で書き換えられないとか言われます
あと、別のダイアログを作ったときにIDが重ならないようにした方が良いかな
シンボルブラウザで値を確認できます

tib 2005/06/28(火) 16:47:44
> IDをIDC_BUTTON1=1234とすると1234にすることができます
へぇ、知らなかった!! と思って試してみたところ、これでは _APS_NEXT_xxx_VALUE の値
は更新されないんですね。この技を使うことが却ってIDの重複を招く可能性につながるこ
とを考えると、あまり勧められないと思いました。

古いスレッドには追加発言できません。