VC++6.0 MFC使ってます。
CWnd::Create()の引数に
nID(子ウィンドウの ID を指定します。)
というのがありますが、
このIDは、アプリケーション内で重複してはいけない。
という認識でいます。
サンプル等では、適当(?)に123とかを使用しているのを
よく見かけるのですが、
実際、IDが重複しないようにするために、皆さんはどういう方法を
とっているのでしょうか?
未使用のIDを取得するような関数があるのでしょうか?
よろしくお願いします。
メインメニュー>表示>シンボルブラウザ で[新規]ボタンで重複しないIDを定義できるので
は?
>このIDは、アプリケーション内で重複してはいけない。
同じ親を持つ子ウィンドウ同士で重複しなければ大丈夫です。
zetaさん、いぷさんありがとうございます。
まず、何故こんな質問をしたかについて補足します。
MDIアプリケーションで、viewAを親とする
wndA(CWndクラスから派生)を生成するとします。
このとき、プログラムは
nID = 123;
wndA.Create(...., nID,... )
となりますが、
viewAが複数作られた場合、ID=123のwndAが複数できてしまうことが
NGなのだと思っていました。
しかし、いぷさんに
>>このIDは、アプリケーション内で重複してはいけない。
>
>同じ親を持つ子ウィンドウ同士で重複しなければ大丈夫です。
と教えていただいたので、NGではないことが分かりました。
どうもありがとうございました。
>>このIDは、アプリケーション内で重複してはいけない。
>同じ親を持つ子ウィンドウ同士で重複しなければ大丈夫です。
その通りですし、GetDlgItem()でIDからコントロールを探す
つもりが無いなら、重複しても構いません。
リソースエディタでのスタティックテキストの
デフォルトIDは全部ID_STATICですし。
dairygoodsさん、ありがとうございます。
解決後で申し訳ないんですが、ひとつ確認させてください。
たとえば、同じ親の子としてwndAを複数生成するとします。
UINT nID=100;
for (int i = 0; i<5; I++)
{
wndA.Create(...., nID,... );
}
↑これでOKということでしょうか?
私は、nIDが重複してはいけないと思っていて、
for (int i = 0; i<5; I++)
{
wndA.Create(...., nID+i,... );
}
としていましたが、これは必要ないということでしょうか?
> for (int i = 0; i<5; I++)
> {
> wndA.Create(...., nID,... );
> }
これでも問題はありません。
IDを使ってウィンドウを区別する場面はGetDlgItem()以外にもありましたね。
WM_COMMAND, WM_NOTIFYメッセージを振り分ける場合です。
OS自体がIDを使って何かすることは無いので、
結局自分で使うときに便利な番号を振っておけばよいわけです。
dairygoods さん、お世話になります。
>結局自分で使うときに便利な番号を振っておけばよいわけです。
わかりました。
どうもありがとうございました。