Поделиться через


Поиск и замена диалоговых окон

Отображает немодное диалоговое окно, позволяющее пользователю указать строку для поиска, а также параметры, используемые при поиске текста в документе. Диалоговое окно Замена позволяет пользователю указать строку для поиска и строку замены, а также параметры для управления операцией.

Диалоговое окно Поиск создается и отображается путем инициализации структуры FINDREPLACE и передачи структуры в функцию FindText . На следующем рисунке показано типичное диалоговое окно "Найти ".

Диалоговое окно поиска

Чтобы создать и отобразить диалоговое окно Заменить , инициализируется структура FINDREPLACE и передается в функцию ReplaceText . На следующем рисунке показано типичное диалоговое окно "Заменить ".

Диалоговое окно замены

В отличие от других распространенных диалоговых окон, диалоговые окна "Найти " и "Заменить " являются немодерными. Немодное диалоговое окно позволяет пользователю переключаться между диалоговым окном и окном, которое его создало. Это полезно, чтобы пользователь искал строку, переключился в окно приложения для работы со строкой и снова переключился в диалоговое окно для поиска другой строки, не повторяя команду, необходимую для открытия диалогового окна.

Если функция FindText или ReplaceText успешно создает диалоговое окно, она возвращает дескриптор в диалоговое окно. Этот дескриптор можно использовать для перемещения и взаимодействия с диалоговым окном. Если функция не может создать диалоговое окно, она возвращает значение NULL. Вы можете определить причину ошибки, вызвав функцию CommDlgExtendedError для получения расширенного значения ошибки.

В этом разделе рассматриваются следующие темы.

Зарегистрированные сообщения FINDMSGSTRING

Перед созданием диалогового окна Найти или Заменить необходимо вызвать функцию RegisterWindowMessage , чтобы получить идентификатор зарегистрированного сообщения FINDMSGSTRING . Затем можно использовать идентификатор для обнаружения и обработки сообщений, отправленных из диалогового окна. Когда пользователь нажимает кнопку Найти далее, Заменить или Заменить все в диалоговом окне, процедура диалогового окна отправляет сообщение FINDMSGSTRING в процедуру окна владельца. При создании диалогового окна элемент hwndOwner структуры FINDREPLACE определяет окно владельца.

Параметр lParam сообщения FINDMSGSTRING является указателем на структуру FINDREPLACE , указанную при создании диалогового окна. Перед отправкой сообщения диалоговое окно задает членам этой структуры последние данные, введенные пользователем, включая строку для поиска, строку замены (если она есть) и параметры для операции поиска и замены.

В сообщении FINDMSGSTRING элемент Flags структуры FINDREPLACE содержит один из следующих флагов для обозначения события, вызвавшего сообщение.

Flag Значение
FR_DIALOGTERM Диалоговое окно закрывается. После того как окно владельца обрабатывает это сообщение, дескриптор диалогового окна становится недействительным.
FR_FINDNEXT Пользователь нажал кнопку Найти далее в диалоговом окне Найти или заменить . Элемент lpstrFindЧто указывает строку для поиска.
FR_REPLACE Пользователь нажал кнопку Заменить в диалоговом окне Замена . Элемент lpstrFindЧто указывает строку для замены, а член lpstrReplaceWith — строку замены.
FR_REPLACEALL Пользователь нажал кнопку Заменить все в диалоговом окне Замена . Элемент lpstrFindЧто указывает строку для замены, а член lpstrReplaceWith — строку замены.

 

Для сообщения Найти далее или Заменить все элемент Flags может включать любое сочетание следующих флагов для указания параметров поиска.

Flag Значение
FR_DOWN Если этот параметр задан, выбрана кнопка Вниз переключателей направления, указывающая, что пользователь хочет выполнить поиск из текущего расположения в конец документа. Если FR_DOWN не задано, нажмите кнопку Вверх , чтобы пользователь хотел выполнить поиск в начале документа.
FR_MATCHCASE Если этот параметр задан, выбрано поле Проверка совпадения, указывающее, что пользователь хочет, чтобы поиск учитывал регистр. Если FR_MATCHCASE не задано, поле проверка не выбрано, чтобы поиск не учитывал регистр.
FR_WHOLEWORD Если задано значение , то выбрано поле Соответствовать всему Word только проверка, указывающее, что пользователь хочет искать только целые слова, соответствующие строке поиска. Если FR_WHOLEWORD не задано, поле проверка не выбрано, поэтому следует также искать фрагменты слов, соответствующие строке поиска.

 

Настройка диалогового окна "Поиск или замена"

Чтобы настроить диалоговое окно "Найти или заменить ", можно использовать любой из следующих методов:

  • Указание значений в структуре FINDREPLACE при создании диалогового окна
  • Предоставление пользовательского шаблона
  • Предоставление процедуры перехватчика

При создании диалогового окна Найти или Заменить можно задать флаги в элементе Flags структуры FINDREPLACE , чтобы скрыть или отключить любые элементы управления параметров поиска. Например, можно установить флаг FR_NOMATCHCASE, чтобы отключить поле Проверка вариантов, или установить флаг FR_HIDEMATCHCASE, чтобы скрыть его.

Вы можете предоставить настраиваемый шаблон для диалогового окна Поиск или Замена , например, если вы хотите включить дополнительные элементы управления, которые являются уникальными для вашего приложения. Функции FindText и ReplaceText используют пользовательский шаблон вместо шаблона по умолчанию.

Предоставление пользовательского шаблона для диалогового окна "Поиск и замена"

  1. Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле Findtext.dlg. Идентификаторы элементов управления, используемые в шаблоне диалогового окна поиска или замены по умолчанию, определяются в файле Dlgs.h.
  2. Используйте структуру FINDREPLACE, чтобы включить шаблон следующим образом:
      • Если настраиваемый шаблон является ресурсом в приложении или библиотеке динамической компоновки, установите флаг FR_ENABLETEMPLATE в элементе Flags . Используйте элементы hInstance и lpTemplateName структуры для идентификации модуля и имени ресурса.

        -Или-

      • Если настраиваемый шаблон уже находится в памяти, установите флаг FR_ENABLETEMPLATEHANDLE. Используйте элемент hInstance для идентификации объекта памяти, содержащего шаблон.

Вы можете указать процедуру перехватчика FRHookProc для диалогового окна Поиск или Замена . Процедура перехватчика может обрабатывать сообщения, отправленные в диалоговое окно. Если вы используете пользовательский шаблон для определения дополнительных элементов управления, необходимо предоставить процедуру перехватчика для обработки входных данных для элементов управления.

Включение процедуры перехватчика для диалогового окна "Поиск или замена"

  1. Установите флаг FR_ENABLEHOOK в элементе Flags структуры FINDREPLACE .
  2. Укажите адрес процедуры перехватчика в элементе lpfnHook .

После обработки WM_INITDIALOG сообщения процедура диалогового окна отправляет WM_INITDIALOG сообщение в процедуру перехватчика. Параметр lParam этого сообщения является указателем на структуру FINDREPLACE, используемую для инициализации диалогового окна.

Если процедура перехватчика возвращает значение FALSE в ответ на сообщение WM_INITDIALOG , диалоговое окно не будет отображаться, если только не отобразится процедура перехватчика. Для этого сначала выполните любые другие операции рисования, а затем вызовите функции ShowWindow и UpdateWindow . Примером является следующий код:

// We've returned FALSE in response to WM_INITDIALOG. 
// We've performed any other paint operations. 
// Now we display the dialog box. 
ShowWindow(hDlg, SW_SHOWNORMAL); 
UpdateWindow(hDlg);