Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 2.DOC
Скачиваний:
98
Добавлен:
10.05.2014
Размер:
827.9 Кб
Скачать

Окна предопределенных классов в главном окне

До сих пор мы сталкивались с такими формами приложений Windows:

  • приложение с главным окном;

  • приложение без главного окна на основе модального диалога;

  • приложение с главным окном и вложенным диалоговым окном (модальным или немодальным);

  • приложение с главным окном и вложенными дочерними окнами.

В действительности в рамках главного окна приложения можно иметь не только вложенные дочерние или всплывающие окна, созданные в программе, но и любые окна предопределенных в Windows классов – кнопки, списки, статические элементы с текстом и др. Таким образом, рассмотренные нами ранее элементы управления необязательно должны быть элементами диалога; с таким же успехом их можно использовать в составе главного окна приложения или любых вложенных окон. На рис. 4.1 были показаны два окна такого рода – окно для ввода текста, в данном случае числа, задающего время экспозиции, и обычная кнопка “Пуск”.

Для создания окон предопределенных классов так же, как и любых других, используется функция CreateWindow(). Так, окна, показанные на рис. 4.1, созданы следующим образом:

HWND hwndEdit=CreateWindow("EDIT",NULL,

WS_CHILD|WS_VISIBLE|WS_BORDER|ES_NUMBER,

162,10,45,20, hwnd, NULL, hInst, NULL);

HWND hwndBtn= CreateWindow("BUTTON","Пуск",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

162,40,45,35, (HMENU)ID_GO, NULL, hInst, NULL);

В качестве класса окна указывается один из предопределенных классов (“EDIT”, “BUTTON”, “LISTBOX” и т. д.). В составную константу, определяющую стиль окна, могут входить как константы общего назначения (WS_CHILD,WS_VISIBLE,WS_BORDER), так и характерные только для окон данного класса. Так, константаES_NUMBERразрешает ввод в окно редактирования только десятичных цифр, а константаBS_PUSHBUTTONопределяет внешний вид и функциональное назначение кнопки (“нажимаемая” кнопка).

Обычно элементам управления (кнопкам, спискам и проч.) присваивают идентификаторы – произвольные символические константы. Идентификаторы удобны тем, что при поступлении в окно приложения сообщения WM_COMMAND, возникшего в результате воздействия пользователя на тот или иной элемент управления, среди параметров этого сообщения передается и идентификатор активизированного элемента. Выполняя с помощью конструкцииswitch-caseанализ этого параметра, программа определяет, на какой конкретно элемент управления воздействовал пользователь. Если, например, в диалоговом окне имеются две кнопки с идентификаторамиBTN_1иBTN_2, то функцияOnCommand()будет выглядеть так:

void OnCommand(HWND hwnd,int id,HWND,UINT){

switch(id){

case BTN_1:

...//Действия при нажатии на кнопку с идентификатором BTN_1

break;

case BTN_2:

...//Действия при нажатии на кнопку с идентификатором BTN_2

break;

...//И т. д.

Если элементы управления входят в состав диалогового окна, то идентификаторы назначаются им в предложениях файла ресурсов:

CONTROL "Пуск", BTN_1, "BUTTON", BS_PUSHBUTTON, 27,32,43,12

Если, однако, элемент управления создается непосредственно в программе, как дочернее окно предопределенного класса, идентификатор должен быть назначен в процессе его создания. В этом случае идентификатор указывается в качестве восьмого по счету параметра функции CreateWindow()(см. приведенное выше предложение создания кнопки, которой назначается идентифика­торID_GO). Однако согласно прототипу функцииCreateWin­dow()восьмой параметр должен иметь типаHMENU. Поэтому при подстановке в качестве этого параметра символического обозначения идентификатора его следует явным образом преобразовать в типHMENU, что и сделано в приведенном выше фрагменте.