Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

378

Рис. 11.6 Собственная кнопка, созданная программой ABOUT3

Оконная процедура с помощью функции GetParent получает описатель своего родительского окна (окна диалога) и посылает ему сообщение WM_COMMAND с параметром wParam равным идентификатору дочернего окна элемента управления, который получен с помощью функции GetWindowLong. Затем оконная процедура диалогового окна передает это сообщение процедуре диалога программы ABOUT3. В результате создана своя собственная кнопка, показанная на рис. 11.6. Для создания других пользовательских окон элементов управления в окне диалога можно использовать точно такой же метод.

Действительно ли это все, что нужно? К сожалению, нет. Процедура EllipPushWndProc — это лишь основа той логики, которая обычно применяется для поддержки дочернего окна элемента управления. Например, созданная кнопка никак внешне не реагирует на нажатие, как это происходит с нормальной кнопкой. Для инвертирования цвета внутренней области кнопки оконная процедура должна обрабатывать сообщения WM_KEYDOWN (от клавиши <Spacebar>) и WM_LBUTTONDOWN. Кроме этого, в ответ на сообщение WM_LBUTTONDOWN

оконной процедуре следует захватывать мышь (capture) и освобождать (release) ее (и возвращать кнопке нормальный цвет), если мышь перемещается вне рабочей области окна кнопки, в то время как кнопка мыши остается нажатой. Дочернее окно должно посылать своему родительскому окну сообщение WM_COMMAND только в том случае, если кнопка мыши отпускается в тот момент, когда мышь еще захвачена.

Кроме этого, EllipPushWndProc не обрабатывает сообщения WM_ENABLE. Как уже упоминалось выше, с помощью функции EnableWindow процедура диалога может сделать окно недоступным. Текст в дочернем окне можно было бы выводить в сером, а не черном цвете, чтобы показать, что окно элемента управления недоступно и не может получать сообщений.

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

SetWindowWord, SetWindowLong, GetWindowWord и GetWindowLong.

Окна сообщений

Давайте немного передохнем. Мы рассмотрели способы создания собственных элементов управления в окнах диалога. Теперь остановимся на альтернативе окнам диалога — окнах сообщений (message boxes). Мы использовали диалоговые окна раньше, в главе 7, но подробно они не были рассмотрены.

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

iItem = MessageBox(hwndParent, szText, szCaption, iType);

Окно сообщения имеет заголовок (строку символов szCaption), одну или более строк текста (szText), одну или более кнопок и (необязательно) предопределенный значок. Одна из кнопок определяется по умолчанию. Возвращаемое значение iItem функции MessageBox связано с кнопкой, которая была нажата.

Как правило, параметром hwndParent является описатель того окна, которое создает окно сообщения. Если окно сообщения закрывается, то фокус ввода оказывается в этом окне. Если описатель окна недоступен, или если вам не нужно, чтобы фокус ввода получило одно из окон вашего приложения, то вместо этого описателя можно использовать NULL. Если окно сообщений используется внутри окна диалога, то в качестве этого параметра используйте описатель окна диалога (который мы назвали hDlg).

Соседние файлы в предмете Операционные системы