Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-11.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.26 Mб
Скачать

Информация во всплывающих окнах

Одним из полезных применений окна сообщений при работе программы является обеспечение пользователя информацией о ходе ее выполнения. Было бы идеально использовать окно сообщения примерно так же часто, как функция printf реализуется в программах на С для MS-DOS, с форматированием строк и переменным числом аргументов. И действительно, можно создать функцию, которая позволяет это делать:

void OkMsgBox(char *szCaption, char *szFormat, ...)

{

char szBuffer [256] ;

char *pArguments ;

pArguments = (char *) &szFormat + sizeof (szFormat) ;

vsprintf (szBuffer, szFormat, pArguments) ;

MessageBox (NULL, szBuffer, szCaption, MB_OK) ;

}

Функция vsprintf похожа на функцию sprintf, за исключением того, что она использует указатель на набор аргументов (pArguments) вместо самих аргументов. Когда вызывается функция OkMsgBox, указатель устанавливается на аргументы в стеке. Первым параметром функции OkMsgBox является заголовок окна сообщения, вторым — строка формата, а третьим и последующими — выводимые на экран значения. Если нужно, чтобы, скажем, окно сообщений появлялось на экране каждый раз, когда оконная процедура получает сообщение WM_SIZE, то это можно было бы реализовать следующим образом:

case WM_SIZE :

OkMsgBox ("WM_SIZE Message",

"wParam = %04X-%04X, lParam = %04X-%04X",

HIWORD (wParam), LOWORD (wParam),

HIWORD (lParam), LOWORD (lParam)) ;

[другие строки программы]

return 0 ;

Таким образом внутри окна сообщения выводятся значения wParam и lParam.

Немодальные окна диалога

В начале этой главы говорилось, что окна диалога могут быть либо модальными (modal), либо немодальными (modeless). К этому моменту модальные окна диалога, встречающиеся наиболее часто из этих двух типов окон, уже рассмотрены. Модальные окна диалога (исключая системные) позволяют пользователю переключаться между окнами диалога и другими программами. Однако, пользователь не может перейти в другое окно своей программы, пока не закроет модальное окно диалога. Немодальное окно диалога позволяет пользователю переключаться между окном диалога и окном, в котором оно было создано, а также между окном диалога и остальными программами. Таким образом, немодальное окно диалога больше напоминает обычные всплывающие окна, которые могут создаваться программой.

Немодальные окна диалога предпочтительнее в том случае, когда пользователь хотел бы на некоторое время оставить окно диалога на экране. Например, в программах обработки текстов немодальные окна диалога часто используются при поиске (Find) и замене (Replace). Если бы окно диалога Find было бы модальным, то пользователю пришлось бы выбрать в меню опцию Find, ввести искомую строку, закрыть окно, чтобы вернуться в документ, а затем при необходимости повторения поиска, снова воспроизвести весь этот процесс. Гораздо удобнее дать пользователю возможность переключаться между документом и окном диалога.

Как уже известно, модальные окна диалога создаются с помощью функции DialogBox. Эта функция возвращает значение только после закрытия окна диалога. Ее возвращаемым значением является второй параметр функции EndDialog, которая использовалась в процедуре окна диалога для его закрытия. Немодальные окна диалога создаются с помощью функции CreateDialog. Параметры этой функции те же, что и параметры функции DialogBox:

hDlgModeless = CreateDialog (hInstance, szTemplate, hwndParent, DialogProc) ;

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

Хотя использование имен функций DialogBox для модальных окон диалога и CreateDialog для немодальных, может показаться несколько сомнительным, вы можете запомнить, что немодальные окна диалога похожи на обычные окна. А функция CreateDialog напоминает функцию CreateWindow, с помощью которой создаются обычные окна.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]