Эта статья описывает типовой код, который показывает на экране и управляет диалоговым окном Найти (Find), так что пользователь может устанавливать параметры операции поиска. Диалоговое окно отправляет сообщения вашей оконной процедуре, так что Вы можете выполнять операцию поиска.
Код показывающий и управляющий диалоговым окном Заменить (Replace) сходен с вышеупомянутым диалогом, за исключением того, что он использует функцию ReplaceText, чтобы показать на экране диалоговое окно. Диалоговое окно Заменить (Replace) также посылает сообщения в ответ на щелчок пользователя по кнопкам Заменить (Replace) и Заменить все (Replace All).
Чтобы использовать диалоговое окно Найти (Find) или Заменить (Replace), вы должны выполнить три отдельные задачи:
- Получить идентификатор зарегистрированного сообщения FINDMSGSTRING.
- Показать на экране диалоговое окно.
- Обработать сообщения FINDMSGSTRING, когда диалоговое окно открыто
Когда вы инициализируете вашу прикладную программу, вызовите функцию RegisterWindowMessage, чтобы получить идентификатор сообщения для зарегистрированного сообщения FINDMSGSTRING.
UINT uFindReplaceMsg; // идентификатор FINDMSGSTRING uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); |
Чтобы показать на экране диалоговое окно
Найти (Find ), сначала инициализируйте структуру FINDREPLACE, а затем вызовите функцию FindText.
Обратите внимание! на то, что структура FINDREPLACE и буфер для строки для поиска должны быть глобальной или статической переменной, чтобы она не выходила за пределы области действия до того, как диалоговое окно закроется. |
Вы должны установить член hwndOwner, чтобы определить окно, которое примет зарегистрированные сообщения. После того, как вы создадите диалоговое окно, вы можете перемещать или управлять им, используя возвращенный дескриптор.
Пример
FINDREPLACE fr; // дескриптор станд. блока диалога HWND hwnd; // окно-владелец CHAR szFindWhat[80]; // буфер, принимающий строку HWND hdlg = NULL; // дескриптор блока диалога Найти (Find) // Инициализация FINDREPLACE ZeroMemory(&fr, sizeof(FINDREPLACE)); fr.lStructSize = sizeof(FINDREPLACE); 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; // Если флажок FR_DIALOGTERM установлен, значит // дескриптор идентифицирующий блок диалога, недопустимый. 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; } |