Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Паппас К., Мюррей У. - Visual C++ 6. Руководство разработчика - 2000

.pdf
Скачиваний:
290
Добавлен:
13.08.2013
Размер:
4.96 Mб
Скачать

dc.TextOut(280,150, "<-chord", 8); dc.SelectObject(oldpen); newpen.DeleteObject();

//рисование черного сектора и заливка его зеленым цветом newpen.CreatePen(PS_SOLID, I, dwColor[0]);

oldpen = dc.SelectObject(Snewpen); newbrush.CreateSolidBrush(dwColor[2]); oldbrush = dc.SelectObject(Snewbrush); dc.Pie(200,0, 300, 100, 200, 50, 250, 100); dc.TextOut (260,80, "<-pie wedge", 12); dc.SelectObject(oldbrush); newbrush.DeleteObject(); dc.SelectObject(oldpen); newpen.DeleteObject();

//рисование черного прямоугольника и заливка его серым цветом newbrush.CreateSolidBrush(dwColor[7]);

oldbrush = dc.SelectObject(Snewbrush); dc.Rectangle(25,300, 150, 375); dc.TextOut(50,325,"rectangle", 9); dc.SelectObject(oldbrush); newbrush.DeleteObject();

//рисование черного закругленного прямоугольника

//и заливка его синим цветом

newbrush.CreateHatchBrush(HS_CROSS, dwColor[3]); oldbrush = dc.SelectObject(Snewbrush); dc.RoundRect(350, 250, 400, 290,20, 20); dc.TextOut(410,270, "<-rounded rectangle", 20); dc.SelectObject(oldbrush); newbrush.DeleteObject() ;

//рисование толстой ломаной линии пурпурного цвета newpen.CreatePen(PS_SOLID, 3, dwColor[5]); oldpen=dc.SelectObject(Snewpen);

polylpts[0].x = 10; polylpts[0].у = 30; polylpts[1].x = 10; polylptstl]-У = 100; polylpts[2].x = 50; polylpts[2].y = 100; polylpts[3].x = 10; polylpts[3].y = 30; dc.Polyline(polylpts, 4);

dc.TextOut(10,110, "polyline",8) ; dc.SelectObject(oldpen) ; newpen.DeleteObject() ;

//рисование голубого многоугольника

//изаливка его диагональной желтой штриховкой newpen.CreatePen(PS_SOLID, 4, dwColor[6]); oldpen = dc.SelectObject(Snewpen);

newbrush.CreateHatchBrush(HS_FDIAGONAL, dwColor[4]); oldbrush = dc.SelectObject(Snewbrush); } polygpts[0].x = 40;

polygpts[0].y = 200; polygptstl].x = 100; polygpts[l].y = 270;

371

polygpts[2^.x = 80; polygpts[2].y = 290; polygpts[3].x = 20; polygpts[3].y = 220; polygpts[4].x = 40; polygpts[4].y = 200; dc.Polygon(polygpts, 5);

dc.TextOut(80,230, "<-polygon", 10); dc.SelectObject(oldbrush) ; newbrush.DeleteObject() ; dc.SelectObject(oldpen); newpen.DeleteObject() ;

// He вызывайте метод CView::OnPaint() }

После внесения изменений скомпилируйте и запустите новую версию приложения. Мастер AppWizard сгенерировал базовый код программы и строку меню с подменю File, Edit и Help. При выборе в меню Help команды About на экран открывается диалоговое окно About.

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

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

Текстовый редактор

Теперь займемся разработкой приложения, которое позволит нам вводить и редактировать текст. Выберите в окне компилятора MicrosoftVisualC++ команду New из меню File, а в открывшемся диалоговом окне New— опцию MFC AppWizard (exe), чтобы запустить мастер

AppWizard. Имя нового проекта — Editor(рис. 20.16).

Рис. 20.16. Выбор типа проекта

372

Мастер приложений автоматически создаст папку для нового приложения с тем именем, которое вы задали. На экране откроется первое, уже знакомое вам окно мастера. Теперь установите опцию Multiple documents, отвечающую за создание приложения, которое будет поддерживать работу с несколькими документами (рис. 20.17).

Рис. 20.17. Шаг 1: Выбор многодокументного интерфейса

Как следует из рис. 20.18 и 20.19, в создаваемом приложении не предусмотрено использование баз данных и составных документов.

На следующем этапе (шаг 4) установите опции, позволяющие добавить в окно приложения панель инструментов, строку состояния, трехмерные элементы управления и включить возможность вывода документов на печать (рис. 20.20).

Далее устанавливаются опции, подавляющие включение комментариев в код программы и задающие статический режим компоновки библиотеки MFC (рис. 20.21).

Теперь (шаг 6) мастер должен вывести список из пяти классов, которые будут им созданы, а

именно: CEditorApp, CMainFrame, CChildFrame, CEditorDocи CEditorView(рис. 20.22).

373

Рис.20.18. Шаг 2: базы данных не используются

Рис. 20.19. Шаг 3: работа с составными документами не поддерживается, но используются элементы ActiveX

374

Рис. 20.20. Шаг 4: в окне приложения теперь можно использовать панель инструментов, строку состояния, трехмерные элементы управления, а также выводить документы на печать

Рис.20.21. Шаг 5: отменено добавление комментариев в код программы и задан статический режим компоновки библиотеки MFC

375

Рис. 20.22. Шаг 6: для работы приложения Editor необходимо сгенерировать пять классов

376

Рис. 20.23. Отчет об установках, сделанных в окнах мастера приложений

Если выбрать класс CEditorView, в списке Baseclass будет предложен перечень классов, которые можно использовать в качестве базового. в их числе: CEditview, CFormView, CHtmlView, CListView, CRichEditView, CScrollView, CTreeView и CView. В нашем примере класс

CEditorView порождается от CEditview и используется в качестве родительского для пользовательских классов областей просмотра. Базовый класс CEditview инкапсулирует основные функции текстового редактора.

Далее необходимо щелкнуть на кнопке Finish, в результате чего будет выведен отчет о работе, выполняемой мастером AppWizard(рис. 20.23).

Щелкните на кнопке ОК, чтобы запустить процесс создания программного кода. На рис. 20.24 показан список файлов проекта, созданных мастером автоматически. Все эти файлы сохраняются в папке, которая была выбрана для проекта в окне New.

Класс CEditview реализует базовые функции текстового редактора. Созданный шаблон программы позволит вывести документ на печать, осуществить поиск и замену текста, вырезать, скопировать, вставить и удалить текстовые блоки, а также выполнить отмену предыдущей команды. Этоткласспоумолчаниюобрабатываетсообщениясидентификаторами

ID_FILE_PRINT, id_edit_cut, ID_EDIT_COPY, ID_EDIT_PASTE, ID_EDIT_CLEAR, ID_EDIT_UNDO, ID_EDIT_SE-LECT_ALL, ID_EDIT_FIND, ID_EDIT_REPLACE U ID_EDIT__REPEAT.

377

Рис. 20.24. На вкладке FileView выведен перечень файлов, которые были автоматически сгенерированы мастером AppWizard

Построение приложения

Теперь приложение можно скомпилировать и запустить. Исполняемый файл будет помещен в папку DEBUG. Наше приложение дает возможность открывать и редактировать существующие текстовые файлы, создавать новые файлы и сохранять их на диске.

Давайте проанализируем код программы, сгенерированный мастером AppWizard, и рассмотрим некоторые новые блоки.

Анализ программного кода

378

Мастер приложений создал для проекта Editorпять исходных файлов: EDITOR.CPP, MAINFRM.CPP, EDITORDOC.CPP, CHILDFRM.CPP и EDITOR-VIEW.CPP. Каждому из них соответствует свой файл заголовков: EDITOR.H, MAINFRM.H, EDITORDOC.H, CHILDFRM.H и EDITORVIEW.H. Файлы заголовков содержат описания классов, используемых в исходных файлах.

Файл EDITOR.CPP

Файл EDITOR.CPPявляется основным файлом приложения. Он содержит реализацию класса

CEditorApp.

//Editor. cpp: определяет работу приложения. #include "stdafx.h"

#include "Editor. h" #include "MainFrm.h" #include "ChildFrm.h" #include "EditorDoc.h"

#include "EditorView.h" #ifdef _DEBUG

#define new DEBUG_NEW lundef THIS_FILE

static char THIS_FILE[] = _ FILE _ ; #endif

//////////////////////////////////

//CEditorApp

BEGIN_MESSAGE_MAP(CEditorApp, CWinApp) // { (AFX_MSG_MAP (CEditorApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP

// Стандартные операции с документами

ON_COMMAND(ID_FILE_NEW, CWinApp : :OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp: :OnFileOpen)

// Стандартная команда задания -установок принтера

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp: :OnFilePrintSetup) END_MESSAGE_MAP ( )

//////////////////////////////////

// Конструкторкласса CEditorApp CEditorApp: : CEditorApp ()

}

//////////////////////////////////

//Единственный объект класса CEditorApp CEditorApp theApp;

//////////////////////////////////

//Инициализациякласса CEditorApp BOOL CEditorApp: : Initlnstance () COLORREF clrCtlBk, clrCtlText;

//Цвет фона диалоговых окон задается синим,

//а цвет текста — белым

SetDialogBkColor(clrCtlBk = RGB (О,О, 255), clrCtlText = RGB(255, 255, 255)); AfxEnableControlContainer();

//Стандартная инициализация

tifdef _AFXDLL EnableSdControls();

//эта функция вызывается при

//динамической компоновке MFC

379

#else

EnableSdControlsStatic(); // эта функция вызывается при

//статической компоновке MFC #endif

//Измените раздел реестра, где будут храниться

//параметры программы.

SetRegistryKey(_T ("LocalAppWizard-Generated Applications"));

LoadStdProfileSettings();

//загрузка параметров из INI-файла

//Регистрация шаблонов документов

CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_EDITORTYPE,

RUNTIME_CLASS(CEditorDoc), RUNTIME_CLASS(CChildFrame), // пользовательское

// дочернее MDI-окно

RONTIME_CLASS(CEditorView)); AddDocTemplate(pDocTemplate);

//Создание основного MDI-окна

CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame;

//Анализ командной строки на предмет поиска системных команд,

//DDE-команд или команд открытия файлов.

CCommandLinelnfo cmdlnfo;

ParseCommandLine(cmdlnfo);

//Обработка команд, указанных в командной строке if(!ProcessShellCommand(cmdlnfo))

return FALSE;

pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); return TRUE;

}

//////////////////////////////////

//Класс CAboutDlg, управляющий окном About

class CAboutDlg : public CDialog

{

public: CAboutDlg () ;

// Данные диалогового окна//

{(AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA

//Виртуальные функции, сгенерированные мастером ClassWizard

//{ {AFX_VIRTUAL (CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); //}}AFX__VIRTUAL

//Реализацияprotected: //{(AFX_MSG(CAboutDlg)

//Обработчики сообщений отсутствуют

//) }AFX__MSG DECLARE MESSAGE MAP() };

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT (CAboutDlg)

//})AFX_DATA_INIT }

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

380

Соседние файлы в предмете Программирование на C++