2011-09-14 19 views
5

Windowsでは、すべてのコントロール(すべてのダイアログ、ウィンドウ、テキストボックス、チェックボックスなど)のために、コントロールIDが与えられます。Windows GUIコントロールIDはどのように作成されますか?

このコントロールIDはどのように作成されますか? Windowsの2つのアプリケーションが同じ制御IDを持つことはできますか?手動でWindowsコントロールIDを設定する方法はありますか?

+0

それは本当ですか?私はコントロールがIDを使うかどうかを選ぶことができると思う。ウィンドウハンドルでコントロールを識別できます。 –

+1

そうではありません。これは、通常、ダイアログテンプレートから作成されたダイアログに対してのみ設定されます。後でSetWindowLongPtr、GWLP_IDで変更できます。 –

+0

複数のコントロールIDがあります。オートメーションIDはあなたが設定したいものです。あなたのアプリケーションにWinForms、WPF、またはWin32を使用していますか? "フレームワークIDを手動で設定する方法はありますか?"という答えは、各フレームワークごとに異なります。また、オートメーションIDはグローバルにユニークである必要はありません。特定のコントロールを識別するためにツリーの下に一意のパスが必要なので、特定のスコープ内で一意である必要があります。 .Net GUIアプリケーションについてはこれを参照してください。http://msdn.microsoft.com/en-us/library/aa349646.aspx –

答えて

5

コントロールIDは、CreateWindow関数に渡されるパラメータの1つです。コントロールがダイアログテンプレートから作成された場合、ダイアログマネージャはダイアログテンプレートからコントロールIDを取得します。 2つのコントロールが同じIDを持つことは非常に一般的です。たとえば、ほとんどのCancelボタンのコントロールIDはIDCANCELです。レイモンドが書いたものに加えて

+0

どのパラメータがCreateWindowはコントロールIDです。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx – Erik

+0

ああ、見つかりました。 hMenuを使用します。このページで見つけたもの:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645478(v=vs.85).aspx備考欄にあります。 – Erik

+0

同じウィンドウ内の2つのコントロールが同じIDを持つことは、まれです**。例えば、[GetDlgItem関数](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645481(v = vs.85).aspx)はそれに依存します。 – user34660

4

ウィンドウが(コントロール別名)子ウィンドウに作成し、それらに同じControlIdを与えるためにそれは完全に合法です。唯一の問題は、ID(GetDlgItem()を使用)によってコントロールを一意に取得できないことです。実行時にコントロールを操作することに興味がない場合(静的ラベルなど)、独自のコントロールIDを気にする必要はありません。ちょうどそれ0xFFFFを与える)。

異なるアプリケーションまたは親ウィンドウ(たとえば、IDCANCELまたはIDOKのボタン)では、異なるコントロール/子ウィンドウに対して、同じコントロールIDを使用することは確かです。 GetDlgItem()は、指定された1つの親ウィンドウのコントロールを取得します。他の回答に記載されている情報に加えて

3

それぞれのWindowsで などすべてのコントロール制御IDが与えられる(すべてのダイアログ、ウィンドウ、テキストボックスやチェックボックスなどのために)

実際にはそうではありません。アプリウィンドウやダイアログなどのトップレベルのウィンドウでは、実際にはコントロールIDはまったくありません。子ウィンドウには、制御IDを持つことができます。

(トップレベルのウィンドウではなく、ウィンドウのHMENUを示すためのcreateWindowのパラメータを使用して - 。これだけトップレベルウィンドウは、メニューバーを持つことができます)

それは割り当てる方法を決定するために、アプリ開発者次第本当にですIDを使用します。通常、GetDlgItem()で使用されます.HDNDは、親HWNDを持つ特定のIDを持つHWNDを検索します。この場合、IDはその親内で一意である必要があります。開発者が実行時にコントロールをルックアップする必要がない場合、開発者は従来どおり-1を使用してIDを与えることができます。

一部のフレームワークでは、コントロールIDはまったく使用されず、HWNDが作成されるたびに追跡されます。他の回答に加えて

+0

WinSpy ++を使って、私はcalc.exeのトップレベルのウィンドウを見て、コントロールIDを持っています。親ウィンドウのIDが "00000000"なので、トップレベルのウィンドウだと分かっています。 – Sabuncu

+0

その値は実際にはウィンドウのメニューハンドルです。ウィンドウには、メニューハンドラか、トップレベルかチャイルドウィンドウかに応じたコントロールIDがあります。 MicrosoftのSpy ++ツールは、ウィンドウのプロパティダイアログのバージョンで同じ行を使用して、この値を表示します。デフォルトでラベル「Control ID」を使用し、ウィンドウがトップレベルでその値が「メニューハンドル」に変更されますnullではありません。おそらく、WinSpy ++はここでラベルの使用に勤勉ではありません。 – BrendanMcK

+0

お返事ありがとうございます。しかし、私は上記のコントロールIDを 'GetDlgItem()'に渡して、意味のあるhwndを得ることができます。私は 'GetDlgItem()'が有効なコントロールIDとしてデータ項目を尊重するならば、それは1でなければならないと思っています。 – Sabuncu

0

コントロールのIDを同じにすることができますが、より良い、それが一意になりたいです。 Controlはイベントを親ウィンドウにidとhwndで報告します。親のメッセージループでは、一般にidを使用してコントロールを識別します。この場合、異なるイベント処理が必要な場合は、各コントロールに異なるIDを使用します。

関連する問題