На этом шаге мы рассмотрим использование диалоговых окон Find (Поиск) и Replace (Замена).
Приложения Windows, редактирующие текст, могут включать в себя все, что угодно - от текстовых процессоров, электронных таблиц, баз данных и вплоть до программ телекоммуникаций. Все эти приложения обрабатывают текст тем или иным способом и используют элементы полного редактирования текста, в том числе возможности поиска и замены текста. Чтобы помочь программистам включить эти функции в свои программы и гарантировать, что различные прикладные программы будут реализовывать эти функции одинаково, Windows содержит стандартные диалоговые окна Find и Replace ("Поиск" и "Замена").
Библиотека OWL инкапсулирует эти два стандартных диалоговых окна в классы TFindDialog и TReplaceDialog, которые являются производными от абстрактного класса TFindReplaceDialog, определяющего основные функции обоих типов диалоговых окон. Но это еще не все. Библиотека OWL имеет также два полнофункционалыгых элемента управления редактированием TEditSearch и TEditFile, которые позволяют создать пользовательское окно, автоматически реализующее многие функции редактирования текста. Эти два класса управлепия редактированием используют диалоговые окна Windows Find и Replace, так что для обычного редактирования вам редко придется непосредственно управлять этими стандартными диалоговыми окнами. Следующий пример показывает, как использовать диалоговые окна Find и Replace в Windows через управляющий элемент TEditSearch библиотеки OWL.
#include <owl\owlpch.h> #include <owl\applicat.h> #include <owl\framewin.h> #include <owl\editsear.h> #include "pr28_1.rc" //Класс приложения class TApp: public TApplication { public: TApp():TApplication(){} void InitMainWindow(); }; //Класс основного окна class TWndw : public TFrameWindow { public: TWndw(TWindow *parent, const char far *title, TWindow *client); }; TWndw::TWndw(TWindow *parent, const char far *title, TWindow *client): TFrameWindow(parent,title, client) { // Добавить меню к главному окну. AssignMenu("MENU_1"); // Определить расположение и размеры окна. Attr.X=50; Attr.Y=50; Attr.W=GetSystemMetrics(SM_CXSCREEN)/3; Attr.H=GetSystemMetrics(SM_CXSCREEN)/4; } void TApp::InitMainWindow() { TFrameWindow *wndw= new TWndw(0,"Диалоговые окна \"Поиск и Замена\"", new TEditSearch); SetMainWindow(wndw); } int OwlMain(int,char *[]) { return TApp().Run(); }
Файл ресурсов:
#ifndef WORKSHOP_INVOKED #include "windows.h" #endif #include "owl\editsear.rh" #ifdef RC_INVOKED MENU_1 MENU { POPUP "&File" { MENUITEM "E&xit", CM_EXIT } POPUP "&Edit" { MENUITEM "&Find...", CM_EDITFIND MENUITEM "Find &Next", CM_EDITFINDNEXT MENUITEM "&Replace...", CM_EDITREPLACE } } STRINGTABLE { IDS_CANNOTFIND, "Не найден фрагмент \042%s\042" } #endif
После запуска этой программы вы увидите окно, показанное в рисунке 1.
Рис.1. Результат работы приложения
Это окно содержит меню File с командой Exit и меню Edit командами Find, Find Next и Replace. Чтобы увидеть, как работав эта программа, сначала наберите одну или две строки текста в окне. Когда у вас в окне будет текст, вы можете использовать команду Find для нахождения любого слова, команду Find Next, чтобы отыскать следующее вхождение этого же слова или команду Replace для замены слова другим. Рисунки 2 и 3 показывают стандартные диалоговые окна Find и Replace.
Рис.2. Стандартное диалоговое окно Find ("Поиск")
Рис.3. Стандартное диалоговое окно Replace ("Замена")
Когда вы изучите текст программы примера, то возможно, удивитесь тому, что, кажется, эта программа всего лишь только создает приложение и обрамленное окно с рабочим окном. Фактически это действительно все, что делает программа. Функции Find, Find Next и Replace реализуются управляющим элементом TEditReplace главного окна, которое действует как рабочее окно главного окна.
Чтобы использовать класс TEditSearch из OWL, вы должны включить заголовочный файл EDITSEAR. Н в свою программу. Вы должны также создать ресурс, содержащий меню Edit с командами Find, Find Next и Replace. Идентификаторы для этих команд должны быть CM_EDITFIND (24351), CM_EDITFINDNEXT (24353) и CM_EDITREPLACE (24352) соответственно. Эти константы определяются в заглавном файле EDITSEAR.RH, который в приведенной программе подключается через файл EDITSEAR.H. Наконец, вам необходимо определить строку для окна сообщений, которое появляется, если команды Find, Find Next и Replace не в состоянии найти заданный текст. Эта строка должна иметь идентификатор ресурса ID_CANNOTFIND (32540) и должна содержать %s, чтобы получить ту строку текста, которая могла быть не найдена. Если вы хотите использовать задаваемую по умолчанию строку Borland, файл ресурса EDITSEAR.RC содержит определение этой строки. Данный файл ресурса включает также полные меню Edit и Search, так что вам не нужно создавать собственные. EDITSEAR.RC находится в каталоге INCLUDE\OWL.
Со следующего шага мы начнем рассматривать вывод на печать.