none
Win32 ネイティブ : ウィンドウ ID 等の数値に付いてのドキュメントは存在しますか? RRS feed

  • 質問

  • お世話になります。

    今まで MFC を使ってプログラムを作成することが大半で、Win32 ネイティブでのプログラム経験はほとんどありません。

    勉強もかねて、アプリケーションを開発し始めたところですが、ウィンドウ ID、コントロール ID 等の数値として使っていい範囲を記したドキュメントは何処かに存在するのでしょうか?
    ご存知の方、よろしくお願いします。

    2011年4月9日 21:47

回答

  • MFCだけど

    http://msdn.microsoft.com/ja-jp/library/t2zechd4(v=VS.100).aspx

    これの一番下の方はどうかな?

     >1 ~ 7 のコントロール ID は、IDOK や IDCANCEL などの標準コントロールのために予約されています。
    などが書かれています

    • 回答としてマーク ミッヒー 2011年4月10日 13:26
    2011年4月10日 7:33
  • ダイアログボックス自体のリソース ID、ダイアログボックスにおけるコントロール ID のことでしょうか?

    言及したドキュメントそのものは見つけていませんが、これらの ID は short の範囲か unsigned short の範囲かのいずれかの制約があるものと推測されます。
    根拠としては、WM_COMMAND の wParam の仕様にある、HIWORD が control identifier であるとされているところです。
    HIWORD で伝えるという仕様がある以上、少なくとも WORD(unsigned short) の範囲を超えたものを指定するのはすべきでないと読み取れます。
    http://msdn.microsoft.com/en-us/library/ms647591(v=VS.85).aspx

    また、IDOK, IDCANCEL といったすでに意味を持たせた数値がいくつか存在します。
    別の意味を持たせたいのであれば、これらの ID は避けた方がよいでしょうね。(数値はヘッダーファイルを参照してください)

    # 昔からある ID やハンドルの類は、16bit Windows 時代からの名残で short の範囲しか扱わないものがいくつかあるように思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月9日 23:17
    モデレータ
  • >私が探しているようなドキュメントは存在せず
    ないですね。
    情報は分散していますが、関係するMSDNのGUIのカテゴリから情報を集めて考察する形になるでしょう。

    これらのIDはResourceの仕組みに影響を受けているのではないか、と考えています。
    Menu Item IDに注目してみます。
    APIでMenu Item IDを取得する場合GetMenuItemID()を利用でき、また、戻り値はUINTになっています。

    そのため、このAPIだけみるとUINTの範囲でIDを定義できそうに思えますが、
    Menu Item ResourceのMENUITEMTEMPLATEをみると、WORDになっています。
    また、MENUITEMINFOをみると「Application-defined 16-bit value that identifies the menu item.」と記述されています。

    上記よりWORDの範囲で表現するのが良いと考えられます。
    これに加え、GetMenuItemID()では「 If the menu item identifier is NULL or if the specified item opens a submenu, the return value is -1. 」と記述されているため、
    0と-1は避けたほうが良いと判断できます。

    従って、1以上のshortの範囲でIDを定義するのが良いのではないか、と判断することができます。
    -1未満の負の値については特に記述が見当たりませんが、1以上のshortの範囲でIDの個数としては十分でしょう。

    >windows.h 等を確認するしか方法はないのでしょうか?
    Predefined IDは以下の各APIを参考にするとよいでしょう。
    [Finding and Loading Resources]
      http://msdn.microsoft.com/en-us/library/ms648006(VS.85).aspx

    IDOKなどのControl IDは以下が参考になります。
    [MessageBox Function]
      http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx

    [About Dialog Boxes]
      http://msdn.microsoft.com/en-us/library/ms644994(v=VS.85).aspx

    Resource IDは以下が参考になります。
    [MAKEINTRESOURCE Macro]
      http://msdn.microsoft.com/en-us/library/ms648029(VS.85).aspx

    詳細は各々確認していただくとして、IDを定義する範囲は1 ~ short max にしておけば安全かと思います。
    identifierで検索すると早く見つけられますよ。

    • 編集済み kozz 2011年4月10日 9:51 補足
    • 回答としてマーク ミッヒー 2011年4月10日 13:26
    2011年4月10日 9:37
  • お示しのページ、読んでみたんですけどもっと直接的な答が書いてありますね。(4年半の間に内容がアップデートされたのかもしれませんが)

    コントロールIDの有効範囲は8 - 0xDFFFと明記されています。

    • 回答としてマーク ミッヒー 2015年12月10日 20:11
    2015年11月24日 2:19

すべての返信

  • ダイアログボックス自体のリソース ID、ダイアログボックスにおけるコントロール ID のことでしょうか?

    言及したドキュメントそのものは見つけていませんが、これらの ID は short の範囲か unsigned short の範囲かのいずれかの制約があるものと推測されます。
    根拠としては、WM_COMMAND の wParam の仕様にある、HIWORD が control identifier であるとされているところです。
    HIWORD で伝えるという仕様がある以上、少なくとも WORD(unsigned short) の範囲を超えたものを指定するのはすべきでないと読み取れます。
    http://msdn.microsoft.com/en-us/library/ms647591(v=VS.85).aspx

    また、IDOK, IDCANCEL といったすでに意味を持たせた数値がいくつか存在します。
    別の意味を持たせたいのであれば、これらの ID は避けた方がよいでしょうね。(数値はヘッダーファイルを参照してください)

    # 昔からある ID やハンドルの類は、16bit Windows 時代からの名残で short の範囲しか扱わないものがいくつかあるように思います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月9日 23:17
    モデレータ
  • Azulean さん、たびたびお世話になっております。

    ダイアログではなく、もっと全般的な数値の範囲が記載されたものがないのか、という質問でした。
    わかりにくい質問文で申し訳ありません。

    ウィンドウを作る時のウィンドウ ID、メニューに設定する ID等のプログラム側から設定しなければならない数値に付いて質問させて頂きました。

    例えばですが、ウィンドウ ID は 0x0E00 から 0x0FFF の範囲でなくてはならない、とかメニュー ID は Windows 定義のウィンドウメッセージ値と被らない様に、かつ最大値は 0x00FFFFFF まででなくてはならない、等といったドキュメントが存在しないものかと思った次第です。
    無論、Azulean さんご指摘のダイアログ リソース ID、コントロール ID も同様です。

    長らく MFC を使っていた為、ウィンドウ ID は AFX_IDW_PANE_FIRST ( 0xE900 ) から始めなくてはならず、0x0001 等という値は認められないのではないかと思っています。

    言及したドキュメントそのものは見つけていませんが、これらの ID は short の範囲か unsigned short の範囲かのいずれかの制約があるものと推測されます。
    根拠としては、WM_COMMAND の wParam の仕様にある、HIWORD が control identifier であるとされているところです。
    HIWORD で伝えるという仕様がある以上、少なくとも WORD(unsigned short) の範囲を超えたものを指定するのはすべきでないと読み取れます。
    http://msdn.microsoft.com/en-us/library/ms647591(v=VS.85).aspx

    また、IDOK, IDCANCEL といったすでに意味を持たせた数値がいくつか存在します。
    別の意味を持たせたいのであれば、これらの ID は避けた方がよいでしょうね。(数値はヘッダーファイルを参照してください)

    私が探しているようなドキュメントは存在せず、windows.h 等を確認するしか方法はないのでしょうか?

    # 何故かご提示下さったアドレスが Content not found になってしまいましたが・・・。


    • 編集済み ミッヒー 2011年4月10日 0:25 AFX_IDW_PANE_FIRST の数値間違い訂正
    2011年4月9日 23:37
  • MFCだけど

    http://msdn.microsoft.com/ja-jp/library/t2zechd4(v=VS.100).aspx

    これの一番下の方はどうかな?

     >1 ~ 7 のコントロール ID は、IDOK や IDCANCEL などの標準コントロールのために予約されています。
    などが書かれています

    • 回答としてマーク ミッヒー 2011年4月10日 13:26
    2011年4月10日 7:33
  • >私が探しているようなドキュメントは存在せず
    ないですね。
    情報は分散していますが、関係するMSDNのGUIのカテゴリから情報を集めて考察する形になるでしょう。

    これらのIDはResourceの仕組みに影響を受けているのではないか、と考えています。
    Menu Item IDに注目してみます。
    APIでMenu Item IDを取得する場合GetMenuItemID()を利用でき、また、戻り値はUINTになっています。

    そのため、このAPIだけみるとUINTの範囲でIDを定義できそうに思えますが、
    Menu Item ResourceのMENUITEMTEMPLATEをみると、WORDになっています。
    また、MENUITEMINFOをみると「Application-defined 16-bit value that identifies the menu item.」と記述されています。

    上記よりWORDの範囲で表現するのが良いと考えられます。
    これに加え、GetMenuItemID()では「 If the menu item identifier is NULL or if the specified item opens a submenu, the return value is -1. 」と記述されているため、
    0と-1は避けたほうが良いと判断できます。

    従って、1以上のshortの範囲でIDを定義するのが良いのではないか、と判断することができます。
    -1未満の負の値については特に記述が見当たりませんが、1以上のshortの範囲でIDの個数としては十分でしょう。

    >windows.h 等を確認するしか方法はないのでしょうか?
    Predefined IDは以下の各APIを参考にするとよいでしょう。
    [Finding and Loading Resources]
      http://msdn.microsoft.com/en-us/library/ms648006(VS.85).aspx

    IDOKなどのControl IDは以下が参考になります。
    [MessageBox Function]
      http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx

    [About Dialog Boxes]
      http://msdn.microsoft.com/en-us/library/ms644994(v=VS.85).aspx

    Resource IDは以下が参考になります。
    [MAKEINTRESOURCE Macro]
      http://msdn.microsoft.com/en-us/library/ms648029(VS.85).aspx

    詳細は各々確認していただくとして、IDを定義する範囲は1 ~ short max にしておけば安全かと思います。
    identifierで検索すると早く見つけられますよ。

    • 編集済み kozz 2011年4月10日 9:51 補足
    • 回答としてマーク ミッヒー 2011年4月10日 13:26
    2011年4月10日 9:37
  • Azulean さん、yominet さん、kozz さん、非常に参考になる回答をありがとうございました。

    皆様からの回答を参考に ID として適切な値を模索していきたいと思います。
    2011年4月10日 13:26
  • お示しのページ、読んでみたんですけどもっと直接的な答が書いてありますね。(4年半の間に内容がアップデートされたのかもしれませんが)

    コントロールIDの有効範囲は8 - 0xDFFFと明記されています。

    • 回答としてマーク ミッヒー 2015年12月10日 20:11
    2015年11月24日 2:19
  • 遅くなりました。かなりプログラミングから離れていたので、失礼をお詫び致します。ただ、PCの様子が変なのでとりあえずお礼がてらに。

    2015年12月10日 20:10