ウィンドウをCreateする時のIDの指定

[戻る]
もも 2002/12/20(金) 10:58:52
VC++6.0 MFC使ってます。

CWnd::Create()の引数に
nID(子ウィンドウの ID を指定します。)
というのがありますが、
このIDは、アプリケーション内で重複してはいけない。
という認識でいます。

サンプル等では、適当(?)に"123"とかを使用しているのを
よく見かけるのですが、
実際、IDが重複しないようにするために、皆さんはどういう方法を
とっているのでしょうか?
未使用のIDを取得するような関数があるのでしょうか?

よろしくお願いします。

zeta 2002/12/20(金) 11:10:27
メインメニュー>表示>シンボルブラウザ で[新規]ボタンで重複しないIDを定義できるので
は?

いぷ 2002/12/20(金) 11:23:49
>このIDは、アプリケーション内で重複してはいけない。

同じ親を持つ子ウィンドウ同士で重複しなければ大丈夫です。

もも 2002/12/20(金) 11:57:54
[[解決]]
zetaさん、いぷさんありがとうございます。

まず、何故こんな質問をしたかについて補足します。
MDIアプリケーションで、viewAを親とする
wndA(CWndクラスから派生)を生成するとします。

このとき、プログラムは
nID = 123;
wndA.Create(...., nID,... )
となりますが、

viewAが複数作られた場合、ID=123のwndAが複数できてしまうことが
NGなのだと思っていました。

しかし、いぷさんに

>>このIDは、アプリケーション内で重複してはいけない。
>
>同じ親を持つ子ウィンドウ同士で重複しなければ大丈夫です。

と教えていただいたので、NGではないことが分かりました。

どうもありがとうございました。

dairygoods 2002/12/20(金) 12:00:25
>>このIDは、アプリケーション内で重複してはいけない。

>同じ親を持つ子ウィンドウ同士で重複しなければ大丈夫です。

その通りですし、GetDlgItem()でIDからコントロールを探す
つもりが無いなら、重複しても構いません。
リソースエディタでのスタティックテキストの
デフォルトIDは全部ID_STATICですし。

もも 2002/12/20(金) 12:22:25
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,... );
}
としていましたが、これは必要ないということでしょうか?

dairygoods 2002/12/20(金) 12:41:40
> for (int i = 0; i<5; I++)
> {
>     wndA.Create(...., nID,... );
> }

これでも問題はありません。

IDを使ってウィンドウを区別する場面はGetDlgItem()以外にもありましたね。
WM_COMMAND, WM_NOTIFYメッセージを振り分ける場合です。

OS自体がIDを使って何かすることは無いので、
結局自分で使うときに便利な番号を振っておけばよいわけです。

もも 2002/12/20(金) 12:45:01
dairygoods さん、お世話になります。

>結局自分で使うときに便利な番号を振っておけばよいわけです。

わかりました。
どうもありがとうございました。

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