Как создаются идентификаторы управления Windows GUI? - PullRequest
5 голосов
/ 14 сентября 2011

В Windows для каждого элемента управления (например, для каждого диалога, окна, текстового поля, флажка и т. Д.) Будет задан идентификатор элемента управления

Как создается этот контрольный идентификатор? Могут ли два приложения в Windows иметь одинаковые идентификаторы управления? Можно ли вручную установить идентификаторы управления Windows?

Ответы [ 4 ]

5 голосов
/ 14 сентября 2011

Идентификатор управления является одним из параметров, передаваемых в функцию CreateWindow.Если элемент управления был создан из шаблона диалога, диспетчер диалогов получает идентификатор элемента управления из шаблона диалога.Обычно два элемента управления имеют одинаковый идентификатор.Например, большинство кнопок Cancel имеют идентификатор элемента управления IDCANCEL.

4 голосов
/ 14 сентября 2011

В дополнение к тому, что Раймонд написал:

Совершенно законно для окна создавать дочерние окна (иначе говоря, элементы управления) и присваивать им тот же ControlId. Единственная проблема заключается в том, что вы не сможете уникальным образом получить элемент управления по его идентификатору (используя GetDlgItem()). Если вы не заинтересованы в манипулировании элементом управления во время выполнения (например, статической меткой), вам не нужно заботиться о присвоении ему уникального идентификатора элемента управления. Просто дайте ему 0xFFFF).

Конечно, это законный (и обычный) один и тот же идентификатор элемента управления для разных элементов управления / дочерних окон в разных приложениях или родительских окнах (например, IDCANCEL или IDOK для кнопок). GetDlgItem () извлекает элемент управления одного данного родительского окна.

3 голосов
/ 15 сентября 2011

В дополнение к информации в других ответах:

В окнах для каждого элемента управления (например, для каждого диалога, окна, текстового поля, флажка и т. Д.) Будет задан идентификатор элемента управления

На самом деле это не совсем так: окна верхнего уровня, такие как окна приложений и диалоги, вообще не имеют идентификатора элемента управления. Только дочерние окна могут иметь идентификаторы управления.

(Окна верхнего уровня используют этот параметр CreateWindow, чтобы вместо этого указать HMENU для окна - поэтому только окна верхнего уровня могут иметь меню.)

Разработчик приложения должен сам решить, как назначать и использовать идентификаторы. Обычно они используются с GetDlgItem (), который ищет HWND с данным идентификатором с родительским HWND, поэтому в этом случае идентификаторы должны быть уникальными только внутри этого родителя. Если разработчику не нужно искать элемент управления во время выполнения, он может присвоить ему любой идентификатор, традиционно здесь используется -1.

Некоторые платформы вообще не используют идентификаторы элементов управления и просто отслеживают HWND по мере их создания.

0 голосов
/ 10 мая 2014

В дополнение к другим ответам:

Хотя идентификатор элемента управления может быть одинаковым, лучше сделать его уникальным. Элемент управления сообщает о событиях в родительское окно с его идентификатором и hwnd. В цикле сообщений родителя мы обычно используем id для идентификации элемента управления, в этом случае, если вы хотите различную обработку событий, используйте разные id для каждого элемента управления.

...