Шаг 72.
Библиотека OWL.
Создание простейшего текстового редактора

    На этом шаге мы рассмотрим простой текстовый редактор.

    Здесь мы представляем вам небольшой текстовый редактор, реализованный студенткой 4 курса факультета математики и информационных технологий Курганского государственного университета Назаровой Татьяной (декабрь 2005 г.).

    Передо ней стояла задача создания простейшего текстового редактора. Он должен позволять вводить, редактировать, сохранять и загружать текст. Задача была решена путем создания MDI-приложения.

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

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

    Кнопки созданы с помощью программы Adobe PhotoShop. Фон задается градиентом. Затем отдельным слоем задается текст. Использован эффект Satin (Атлас) для создания определенного рисунка, а также эффект Bevel and Emboss (Скос и Рельеф) для того, чтобы кнопка выглядела выпуклой. Для загрузки рисунков необходимо в файле ресурсов подключить необходимые файлы.

    Также созданы две разные иконки для окна-обрамления и для дочерних окон с помощью редактора ресурсов Resource Workshop. Для загрузки иконок необходимо в файле ресурсов подключить файлы ris1.ico и ris2.ico, а в тексте программы использовать функцию SetIcon().

    При попадании курсора на какую-либо кнопку на панели управления в строке состояния появляется подсказка. Это реализовано следующим образом: в файле ресурсов содержится строковая таблица StringTable, содержащая строки, которые появляются в виде подсказки. Идентификатор каждой строки совпадает с идентификатором команды, которую описывает подсказка.

    Ниже приведен текст редактора.

#include <owl\applicat.h>
#include <owl\decmdifr.h>
#include <owl\editfile.h>
#include <owl\mdi.h>
#include <owl\controlb.h>
#include <owl\statusba.h>
#include <owl\buttonga.h>
#include "pr72_1.rc"

//Класс приложения.
class TMDIApp: public TApplication
{
  public:
	 TMDIApp():TApplication(){}
	 void InitMainWindow();
  protected:
	  TMDIClient *clienTWndw;
	  TControlBar *controlBar;
	  BOOL i;
	  TMDIChild *childWnd;
	  void CmFileNew();
	  void CmFileOpen();

	  DECLARE_RESPONSE_TABLE (TMDIApp);
};

DEFINE_RESPONSE_TABLE1(TMDIApp, TApplication)
EV_COMMAND (CM_FILENEW, CmFileNew),
EV_COMMAND (CM_FILEOPEN, CmFileOpen),
END_RESPONSE_TABLE;

// TMDIApp::InitMainWindow()
// Эта функция создает главное окно приложения,
// окно-клиент, панель инструментов и
// строку состояния.
void TMDIApp::InitMainWindow()
{
  // Создать окно-клиент.
  clienTWndw = new TMDIClient;
  // Создать окно обрамления.
  TDecoratedMDIFrame *frameWnd = new TDecoratedMDIFrame 
     ("Пример текстового редактора", MENU_1, *clienTWndw, TRUE);
  // Определить размеры и расположение окна обрамления.
  frameWnd->Attr.X = 50;
  frameWnd->Attr.Y = 50;
  frameWnd->Attr.W = 800;
  frameWnd->Attr.H = 600;
  i=TRUE;
  // Создать инструментальную линейку.
  controlBar = new TControlBar (frameWnd);
  controlBar->Insert(*new TButtonGadget(ID_NEW, CM_FILENEW));
  controlBar->Insert(*new TButtonGadget(ID_OPEN, CM_FILEOPEN));
  controlBar->Insert(*new TButtonGadget(ID_SAVE, CM_FILESAVE));
  controlBar->Insert(*new TSeparatorGadget (10));
  controlBar->Insert(*new TButtonGadget(ID_CUT, CM_EDITCUT));
  controlBar->Insert(*new TButtonGadget(ID_COPY, CM_EDITCOPY));
  controlBar->Insert(*new TButtonGadget(ID_PASTE, CM_EDITPASTE));
  // Установить режим подсказки, чтобы сразу
  // показывать подсказку.
  controlBar->SetHintMode(TGadgetWindow::EnterHints);
  // Вставить панель инструментов в окно обрамления.
  frameWnd->Insert(*controlBar, TDecoratedFrame::Top);
  // Создать строку состояния.
  TStatusBar *statusBar = new TStatusBar (0,
	  TGadget::Recessed,
	  TStatusBar::CapsLock | TStatusBar::NumLock |
	  TStatusBar::Overtype);
  // Вставить строку состояния в окно обрамления.
  frameWnd->Insert(*statusBar, TDecoratedFrame::Bottom);
  // Установить пиктограмму в окно обрамления.
  frameWnd->SetIcon (this, ID_MDIEDIT);
  // Активизировать трехмерные элементы управления Microsoft.
  EnableCtl3d (TRUE);
  // Установить значение указателя MainWindow приложения.
  SetMainWindow(frameWnd);
}

// TMDIApp::CmFileNew()
// Эта функция создает новое окно, когда пользователь
// выбирает команду New из меню File или когда
// пользователь выбирает кнопку New на панели инструментов.
void TMDIApp::CmFileNew()
{  // Создать новый управляющий элемент
  // редактирования файла.
  TEditFile *editFile = new TEditFile;
  // Создать дочернее окно для нового файла.
  if(i)
	{ childWnd = new TMDIChild (*clienTWndw, "", editFile);
	  childWnd->SetIcon (this, ID_DOCUMENT);
	  childWnd->Create();
	  i=FALSE;}
  else   
  //Если какое-либо окно открыто, разрушить его, а затем создать новое.
	{ childWnd->Destroy();
	  childWnd = new TMDIChild (*clienTWndw, "", editFile);
	  childWnd->SetIcon (this, ID_DOCUMENT);
	  childWnd->Create();}
}

// TMDIApp::CmFileOpen()
// Эта функция создает новое окно, когда пользователь
// выбирает команду Open из меню File или когда
// пользователь выбирает кнопку Open на панели инструментов.
void TMDIApp::CmFileOpen()
{
  // Создать объект TData диалогового окна.
  TOpenSaveDialog::TData fileData (OFN_FILEMUSTEXIST |
	 OFN_HIDEREADONLY | OFN_PATHMUSTEXIST,
	 "Все файлы (*.*) | *.* |Текстовые файлы (*.txt) | *.txt |", 
          0, 0, " * ");
  // Задать имя файла как пустую строку.
  strcpy(fileData.FileName, "");
  // Создать диалоговое окно Open.
  TFileOpenDialog *dialog =
		new TFileOpenDialog (MainWindow, fileData);
  // Выполнить диалоговое окно Open.
  int result = dialog->Execute();
  // Если пользователь выходит по кнопке ОК...
  if (result == IDOK)
	 // Создать новый управляющий элемент
	 // редактирования файла.
	{
	 TEditFile *editFile =
		  new TEditFile (0, 0, 0, 0, 0, 0, 0, fileData.FileName);
	 // Создать новое дочернее окно для файла.
	if (i)
	 { childWnd = new TMDIChild (*clienTWndw, "", editFile);
	 // Создать пиктограмму файла.
	 childWnd->SetIcon (this, ID_DOCUMENT);
	 // Отобразить новое дочернее окно.
	 childWnd->Create();
	 i=FALSE;}
	  else 
          //Если какое-либо окно открыто, разрушить его, а затем создать новое.
		{ childWnd->Destroy();
		  childWnd = new TMDIChild (*clienTWndw, "", editFile);
		  childWnd->SetIcon (this, ID_DOCUMENT);
		  childWnd->Create();}
		 }
  // Удалить старый текст подсказки.
  controlBar->SetHintCommand (-1);
}

int OwlMain(int,char *[])
{
  return TMDIApp().Run();
}

    Файл ресурсов:

#ifndef WORKSHOP_INVOKED
#include "windows.h"
#endif

#include <owl\mdi.rh>
#include <owl\editfile.rh>

#define MENU_1         100
#define ID_MDIEDIT     101
#define ID_DOCUMENT    102
#define ID_SAVE        CM_FILESAVE
#define ID_PASTE       CM_EDITPASTE
#define ID_OPEN        CM_FILEOPEN
#define ID_NEW         CM_FILENEW
#define ID_CUT         CM_EDITCUT
#define ID_COPY        CM_EDITCOPY

#ifdef RC_INVOKED

#include <owl\except.rc>
#include <owl\statusba.rc>

MENU_1 MENU
{
	POPUP "&File"
	{
		 MENUITEM "&New",        CM_FILENEW
		 MENUITEM "&Open",       CM_FILEOPEN
		 MENUITEM "&Save",       CM_FILESAVE, GRAYED
		 MENUITEM "Save &As...", CM_FILESAVEAS
		 MENUITEM SEPARATOR
		 MENUITEM "E&xit",       CM_EXIT
	}
	POPUP "&Edit"
	{
		 MENUITEM "&Cut",        CM_EDITCUT
		 MENUITEM "C&opy",       CM_EDITCOPY
		 MENUITEM "&Paste",      CM_EDITPASTE
		 MENUITEM "&Delete",     CM_EDITDELETE
		 MENUITEM "C&lear All",  CM_EDITCLEAR
	}
}

STRINGTABLE
{
	CM_FILENEW, "Создание нового документа"
	CM_FILEOPEN,  "Открытие документа"
	CM_FILESAVE, "Сохранение документа"
	CM_FILESAVEAS, "Сохранение документа под новым именем"
	CM_EXIT, "Выход из редактора"
	CM_EDITUNDO, "Отменить последнюю операцию"
	CM_EDITCOPY, "Скопировать выделенный текст в буфер обмена"
	CM_EDITCUT, "Поместить выделенный текст в буфер обмена"
	CM_EDITPASTE, "Вставить текст из буфера"
	CM_CLOSECHILDREN, "Закрыть все окна"
	IDS_UNTITLEDFILE, "Безымянный"
	IDS_FILECHANGED, "Файл %s был изменен. \n\nСохранить изменения?"
}

ID_CUT   BITMAP "cut3.bmp"
ID_COPY  BITMAP "copy3.bmp"
ID_PASTE BITMAP "paste3.bmp"
ID_NEW   BITMAP "new3.bmp"
ID_OPEN  BITMAP "open3.bmp"
ID_SAVE  BITMAP "save3.bmp"

ID_DOCUMENT ICON  "ris2.ico"
ID_MDIEDIT  ICON "ris1.ico"

#endif
Текст этого приложения можно взять здесь.

    Результат работы приложения изображен на рисунке 1:


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим еще один пример приложения, созданного с использованием OWL.




Предыдущий шаг Содержание Следующий шаг