Создав описание окна диалога, нужно определитьфункцию окна. Функция окна диалога нашего приложения будет создавать и управлять диалоговым окном.
Функции окна диалога, как и другим функциям окон диалога, передаются те же параметры, что и функциям окна, однако они обрабатывают только те сообщения, которые предназначены для окна диалога.
Функция окна диалога, в отличие от функции окна приложения, обрабатывает в основном действия пользователя (сообщения типа WM_COMMAND), и не передает неопознанное сообщение стандартной функции DefWindowProc() :
BOOL DialogProc ( hDlg, message, wParam, lParam )
HWND hDlg;
unsigned message;
WORD wParam;
LONG lParam;
{
switch (message
{
case WM_INITDIALOG : // Сообщения об инициализации диалогового окна
return TRUE ;
case WM_COMMAND:; // Сообщение о поступлении команды
if (wParam = = IDOK) {
EndDialog (hDlg, NULL);
return TRUE ;
}
break;
}
return FALSE;
}
Функция диалогового окна сходна с функцией окна, но все-таки это «не настоящая» функция окна.
Настоящая функция диалогового окна находится в Windows. Создав диалоговое окно, приложение получает возможность лишь вмешаться в процесс обработки сообщений , после чего управление должно быть передано обратно собственно функции окна, находящейся в Windows. Именно поэтому в функции диалогового окна отсутствует обращение к стандартному обработчику сообщений, функции DefWindowProc( ) .
Приведем несколько отличий функции диалогового окна от «настоящей»
функции окна:
Функция окна возвращает значение типа long, а функция диалогового окна - значение типа BOOL ( этот тип определен в файле windows.h как тип int).
¨ Если функция обычного окна не обрабатывает поступающее ей сообщение ,то она должна передать необработанное сообщение Windows, вызвав функцию Def WindowProc . А функция диалогового окна, если она не обработала переданное ей сообщение , должна просто вернуть значение TRUE ( не нулевое значение; если сообщение обработано , следует вернуть FALSE).
¨ Функция диалогового окна не получает сообщения WM_CREATE, вместо него поступает WM_INITDIALOG. Кроме того, функция диалогового окна не обрабатывает сообщения WM_PAINT и WM_DESTROY.
Как и все функции окон, функция окна диалога не должна вызываться из приложения явно.
Простейшая функция окна диалога обрабатывает всего два сообщения: WM_COMMAND и WM_INITDIALOG.
Сообщение WM_INITDIALOG является первым сообщением, которое получает функция диалогового окна.
Сообщение WM_INITDIALOG посылается функции окна Windows непосредственно перед вызовом диалогового окна с тем, чтобы можно было выполнить необходимые подготовительные действия.
Несмотря на то, что в функции DialogProc( ) в предыдущем примере таких действий не производится, сообщение WM_INITDIALOG должно быть обработано, поскольку возвращаемое значение определяет, какому органу управления в диалоговом окне будет передано управление. Если при обработке сообщения WM_INITDIALOG возвращается TRUE, то управление передается первому органу, имеющему тип WS_TABSTOP. Если при обработке сообщения WM_INITDIALOG будет возвращено значение FALSE, то управление не будет передано ни одному органу управления диалогового окна, т.е. Windows не будет сам устанавливать фокус ввода. Это позволяет функции диалогового окна установить фокус ввода при помощи SetFocus( ).
Другим сообщением, которое может обрабатывать функция диалогового окна , является WM_COMMAND. Оно поступает при нажатии пользователем кнопки мыши в момент, когда указатель мыши находится на органе управления типа «кнопка», либо когда пользователь нажал на клавишу пробела и есть кнопка на диалоговом окне, имеющая фокус ввода. При этом параметр wParam сообщения содержит идентификатор органа управления, от которого поступило сообщение.
Завершение работы с диалоговым окном всегда должно осуществляться при помощи функции EndDialog.
В предыдущем примере, после того, как пользователь «нажмет» кнопку «OK» диалогового окна, управление передается функции EndDialog, которая удаляет диалоговое окно с экрана и передает управление Windows.