Использование стандартных диалогов
Страница 7. Диалоговые окошки поиска и замены текста


 

Диалоговые окошки поиска и замены текста

Чтобы использовать диалоги Поиска или Замены необходимо проделать следующие три операции:

  1. Получить идентификатор для зарегистрированного сообщения FINDMSGSTRING.
  2. Отобразить диалоговое окошко.
  3. Обработать сообщение FINDMSGSTRING когда диалог откроется.

При инициализации приложения можно зарегистрировать и получить идентификатор сообщения FINDMSGSTRING при помощи функции RegisterWindowMessage.

UINT uFindReplaceMsg; // идентификатор сообщения для FINDMSGSTRING

uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);

Чтобы отобразить диалог поиска или замены текста, сперва необходимо заполнить структуру FINDREPLACE, а затем вызвать функцию FindText или ReplaceText. Обратите внимание, что структура FINDREPLACE и буфер для строки поиска должны быть объявлены глобально или статически, чтобы они не вышли за пределы видимости, до того, как диалоговое окошко будет закрыто. Чтобы указать, какое окно будет получать зарегистрированные сообщения, необходимо присвоить его дескриптор переменной hwndOwner.

Пример:

FINDREPLACE fr; // структура
HWND hwnd; // окно - владелец
CHAR szFindWhat[80]; // буфер для строки
HWND hdlg = NULL; // десткриптор диалога поиска текста

// Заполняем FINDREPLACE
ZeroMemory(&fr, sizeof(fr));
fr.lStructSize = sizeof(fr);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.wFindWhatLen = 80;
fr.Flags = 0;

hdlg = FindText(&fr);

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

Чтобы отслеживать сообщения, посылаемые диалоговым окном, оконная процедура должна проверять зарегистрированное сообщение FINDMSGSTRING и обрабатывать значения, переданные в структуре FINDREPLACE:

Пример:

LPFINDREPLACE lpfr;

if (message == uFindReplaceMsg){

// Получаем указатель на структуру FINDREPLACE из lParam.

lpfr = (LPFINDREPLACE)lParam;

if (lpfr->Flags & FR_DIALOGTERM){
hdlg = NULL;
return 0;
}

// Если установлен флаг FR_FINDNEXT,
// то вызываем процедуру поиска запрошенной строки

if (lpfr->Flags & FR_FINDNEXT)
SearchFile(lpfr->lpstrFindWhat,
(BOOL) (lpfr->Flags & FR_DOWN),
(BOOL) (lpfr->Flags & FR_MATCHCASE));

return 0;

}
 
« Предыдущая статья   Следующая статья »