Органы управления – это дочерние окна, поэтому обмен информации между ними и приложением осуществляется посредством передачи сообщений.
От диалогового окна приложение принимает сообщение WM_COMMAND. Параметр wParam при этом содержит идентификатор органа управления, от которого поступило сообщение.
Однако функции API для обработки диалоговых окон используют дескриптор органа управления.
Дескриптор дочернего окна органа управления помещается в младшем слове параметра lParam.
Кроме того, имеется функция GetDlgItem, позволяющая по идентификатору органа управления диалогового окна получить дескриптор этого окна-органа управления:
hDlgCtrl = GetDlgItem ( hDlg, nID ) ;
Первый параметр функции GetDlgItem содержит дескриптор диалогового окна, а второй – идентификатор органа управления, дескриптор которого мы желаем получить. При помощи функции GetWindowWord можно, наоборот, по дескриптору органа управления получить его идентификатор. Для этой цели используется флаг GWW_ID:
nID = GetWindowWord ( hDlgCtrl , GWW_ID );
Для взаимодействия с органами управления очень важными являются две следующие функции:
SendMessage ( ) и PostMessage ( ).
Основное назначение этих функций: выдавать конкретному окну команду на выполнение некоторого задания.
Функция SendMessage ( ) явно вызывает процедуру соответствующего окна, передает ей сообщение и не выходит из этой процедуры, пока она не обработает это сообщение. То есть функция SendMessage ( ) не закончит свою работу, пока сообщение не будет обработано.
Функция PostMessage ( ) – не вызывает явно оконную процедуру, а пересылает сообщение в очередь приложения, которое извлекается оттуда функцией GetMessage ( ).
Функция PostMessage ( ) заканчивается немедленно, как только поместит сообщение в очередь приложения.
Функции SendMessage ( ) и PostMessage ( ) имеют следующий формат :
SendMessage ( hWnd, iMessage, wParam, lParam );
PostMessage ( hWnd, iMessage, wParam, lParam );
hWnd – дескриптор окна, которому посылается сообщение;
iMessage – сообщение;
wParam и lParam – параметры сообщения;
Например, если необходимо программно имитировать нажатие кнопки, то дочернему окну – органу управления – кнопке послать сообщение BM_SETSTATE
SendMessage ( hWnd_Button, BM_SETSTATE, 1,OL ),
где hWnd_Button – дескриптор окна - кнопки.
Для того , чтобы определить дескриптор окна - кнопки удобно воспользоваться функцией GetDlgItem ( ) :
hWnd_Button = GetDlgItem ( hDlg, ID_BUTTON ) ;
где hDlg – дескриптор окна диалога ;
ID_BUTTON – идентификатор окна - кнопки ;
Совместное использование функций GetDlgItem ( ) и SendMessage ( ) выглядит так:
SendMessage ( GetDlgItem ( hDlg, ID_BUTTON ),BM_SETSTATE,1, OL ).
Такая конструкция используется достаточно часто, поэтому она оформлена в виде функции
SendDlgItemMessage (hDlg, nID, iMessage, wParam, lParam),
т.е. эквивалентом прдыдущей функции SendMessage ( ) является следующее обращение :
SendDlgItemMessage (hDlg, ID_BUTTON, BM_SETSTATE, 1, OL ).
Таким образом функция SendDlgItemMessage ( ) посылает сообщение в орган управления с идентификатором nID окна с дескриптором hDlg, аналогично функции SendMessage ( ).
При работе с кнопками используются также другие функции. Например, функция CheckRadioButton ( ) позволяет перевести все переключатели диалогового окна hDlg с идентификаторами от nFirstID до nLastID , за исключением переключателя с идентификатором nCheckID , в положение « выключено »:
CheckRadioButton ( hDlg, nFirstID, nLastID, nCheckID ) ;
Функция CheckDlgButton позволяет «нажать» или «отпустить» кнопку :
CheckDlgButton ( hDlg, nCheckboxID, wCheck );
Если параметр wCheck равен нулю, то кнопка «отпускается» , единице – «нажимается».
Для проверки положения кнопки в диалоговом окне используется функция IsDlgButtonChecked :
wCheck = IsDlgButtonChecked ( hDlg, nCheckboxID );