Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
193-224.doc
Скачиваний:
1
Добавлен:
11.11.2019
Размер:
378.88 Кб
Скачать

Диалоговые окна Find и Replace

Класс CFindReplaceDialog поддерживает диалоговые окна Find (Поиск) и Replace (Замена) такие, как на рис. 7.13. В отличие от всех остальных стандартных диалоговых окон, которые являются модальными, эти диалоговые окна являются немодальными (modeless). Их открытие не прерывает работу с документом и окном представления.

Рис. 7.13. Стандартное диалоговое окно Find

Ресурс шаблона диалога хранится в файле findtext.dlg. Немодальные диалоги требуют соответствующего конструирования и отображения. Для их использования сначала необходимо сконструировать объект класса CFindReplaceDialog. Этот объект должен быть создан оператором new и удален оператором delete. Использование этих операторов обеспечивает гарантии существования диалога после возврата функции, в которой он был создан. Диалоговые окна Find или Replace взаимодействуют со своими окнами-владельцами с помощью специальных сообщений. Эти диалоговые окна посылают окну-владельцу зарегистрированное сообщение FINDMSGSTRING, когда пользователь нажимает кнопку Find Next, Replace или Replace All. Необходимо определить константу FINDMSGSTRING посредством вызова функции ::RegisterWindowMessage() для получения идентификатора сообщения, посылаемого диалоговым окном. Функция имеет следующий прототип

UINT RegisterWindowMessage( LPCTSTR lpString );

где lpString — указатель на строку сообщения.

Значение, полученное при регистрации сообщений диалоговых окон Find или Replace, затем используется в карте сообщений окна-владельца в макросе ON_REGISTERED_MESSAGE(). Прототип макроса:

ON_REGISTERED_MESSAGE( nMessageVariable, memberFxn ),

где nMessageVariable — идентификатор сообщения, посылаемого диалоговым окном, memberFxn— обработчик этого сообщения.

Само диалоговое окно создается при вызове функции CFindReplaceDialog::Create(), прототип которой показан ниже.

BOOL CFindReplaceDialog::Create( BOOL bFindDialogOnly, LPCTSTR lpszFindWhat, LPCTSTR lpszReplaceWith = NULL, DWORD dwFlags = FR_DOWN, CWnd* pParentWnd = NULL );

Функция использует такие параметры. bFindDialogOnly — тип окна (значение TRUE определяет диалоговое окно Find, значение FALSE — диалоговое окно Find and Replace). lpszFindWhat — строка для поиска. lpszReplaceWith — строка для замены. dwFlags — комбинация флагов для настройки окна. pParentWnd — указатель на родительское окно или окно-владелец.

Для инициализации диалоговых окон Find или Replace используется структура FINDREPLACE. Зарегистрированные сообщения FINDMSGSTRING используют эту структуру, чтобы передать строки для поиска и замены текста, указанные пользователем, окну-владельцу из диалогового окна Find или Replace. Фрагмент объявления структуры FINDREPLACE приводится ниже, полное объявление задано в файле commdlg.h и имеет следующий вид:

typedef struct { DWORD lStructSize; //размер структуры в байтах HWND hwndOwner; //дескриптор окна-владельца HINSTANCE hInstance; //дескриптор приложения DWORD Flags; //флаги инициализации диалогового окна LPTSTR lpstrFindWhat; //указатель на строку для поиска LPTSTR lpstrReplaceWith; //указатель на строку для замены WORD wFindWhatLen; //длина строки для поиска WORD wReplaceWithLen; //длина строки для замены } FINDREPLACE, *LPFINDREPLACE;

Создание немодального диалогового окна Find или Replace можно осуществить в обработчике командного сообщения приложения пользователя с помощью функции CFindReplaceDialog::Create(). Для обработки командного сообщения в карту сообщений нужно включить макрос ON_COMMAND() для вызова функции в ответ на выбор команды меню. Кроме этого макроса необходим еще макрос ON_REGISTERED_MESSAGE(), регистрирующий специальное сообщение от диалоговых окон Find или Replace. Этот макрос обеспечит вызов функции, которую необходимо объявить таким образом (имя функции может быть произвольным).

afx_msg LRESULT OnFindReplace(WPARAM wParam, LPARAM lParam);

Используя поля структуры FINDREPLACE, можно передать значение, указанное в строке поиска или замены, окну-владельцу. Для этого класс CFindReplaceDialog инкапсулирует переменную-член m_fr типа FINDREPLACE. Тогда обращение к полям m_fr.lpstrFindWhat или m_fr. lpstrReplaceWith даст возможность осуществить поиск и замену текста.

Настройка диалогового окна включает порождение класса от CFindReplaceDialog, создание пользовательского ресурса шаблона диалогового окна на основе стандартного из файла findtext.dlg, добавление таблицы сообщений для обработки уведомляющих сообщений от новых элементов управления.

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