Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
56
Добавлен:
16.02.2016
Размер:
6.67 Mб
Скачать

Создание нового приложения

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

  • создать новый проект, выбрав тип создаваемого проекта, и добавлять в него разрабатываемые файлы исходного кода, заголовочные файлы, файлы ресурсов и др.;

  • использовать уже существующие исходные файлы, добавив их в новый проект;

  • применить мастер AppWizard для построения готового шаблона приложения, содержащего все необходимые файлы.

При построении шаблона приложения средствами AppWizard автоматически для каждого используемого класса будут создаваться два файла: заголовочный файл и файл исходного кода.

Разработка приложения-диалога с использованием appwizard

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

Рис. 4.1. AppWizard - 1-й шаг

Нажав на кнопку Next, мы перейдем к следующему шагу (рис. 4.2). На втором шаге можно установить следующие опции:

  • About box - добавление в окно создаваемого приложения пункта меню About;

  • Context-sensitive Help - добавление в формируемый проект файлов для создания справочной системы. Это файл темы с расширением RTF, файл проекта справочной системы с расширением HPJ и командный файл с расширением ВАТ;

  • 3D controls - использование трехмерного оформления элементов управления;

  • Automation - создаваемое приложение будет доступно всем другим Windows-приложениям, использующим OLE-автоматизацию;

  • ActiveX controls - создаваемое приложение будет обладать способностью вызывать ActiveX-элементы управления;

  • Windows Sockets - приложение формируется для обеспечения передачи данных по сети (например, Internet) и содержит средства работы с протоколом TCP/IP (класс CAsynSocket);

Рис. 4.2. Арр Wizard - 2-й шаг

Title for your dialog - заголовок создаваемого диалогового окна.

Введя заголовок создаваемого диалогового окна, перейдем к следующему шагу (рис. 4.3).

На третьем шаге указывается, будет ли в создаваемый автоматически программный код вставлен текст комментариев и каким образом будет подключена библиотека MFC - как динамическая DLL-библиотека или как статически линкуемая библиотека.

Вставляемый текст комментариев очень полезен для новичков: он позволяет определять место добавления собственного кода.

Рис. 4.3. AppWizard - 3-й шаг

Оставим в этом окне предложенные по умолчанию установки и перейдем к последнему шагу (рис. 4.4).

Рис. 4.4. Арр Wizard - 4-й шаг

На четвертом шаге AppWizard отображает список всех производных классов, создаваемых для формируемого приложения. Под панелью списка расположены четыре поля ввода, в которых для каждого производного класса указывается имя этого класса, базовый класс, имя заголовочного файла и имя исходного файла. Если поле ввода имеет белый фон, то его можно редактировать. Однако соглашения об именовании, используемые в Visual C++, очень удобны и отражают некоторую информацию о базовом классе.

Для данного приложения будет создано два производных класса: CMyDlgApp и CMyDlgDlg. Класс CMyDlgApp является производным от базового класса CWinApp. Этот класс обязательно присутствует в любом Windows-приложении, создаваемом с использованием AppWizard. В нем также инкапсулирован метод WinMain (являющийся точкой входа в Windows-приложение). Единственным методом, который должен быть обязательно переопределен, является Initlnstance(), и AppWizard сформирует код переопределения этого метода. Вторым используемым производным классом является класс CMyDlgDlg, наследуемый от базового класса CDialog. Описание полей для класса CMyDlgDlg приведено на рисунке 4.5.

Рис. 4.5. AppWizard - 4-й шаг: класс создаваемого диалогового окна

После щелчка на кнопке Finish будет отображено диалоговое окно с информацией о создаваемом проекте (рис. 4.6).

Рис. 4.6. AppWizard - окно информации о создаваемом проекте

После щелчка на кнопке OK AppWizard создаст проект базового приложения MyDlg (рис. 4.7).

Далее этот проект можно компилировать и выполнять.

Для того чтобы откомпилировать проект, можно щелкнуть на кнопке Build (F7) на панели инструментария Visual C++ или выбрать соответствующий пункт из меню Build.

Рис. 4.7. Окно проекта приложения: отображение дерева классов

На рис. 4.8 приведен результат выполнения автоматически сформированного проекта.

Рис. 4.8. Результат выполнения автоматически сформированного проекта

Созданный проект включает в себя:

  • файлы программного кода:

MYDLG.CPP MYDLG.H

MYDLGDLG.CPP MYDLGDLG.H

STDAFX.CPP STDAFX.H

  • файлы ресурсов:

MYDLG.RC

  • файл со справочной информацией:

README.TXT

и ряд других служебных файлов.

Приведем с некоторым сокращением текст автоматически формируемых файлов (комментарии частично заменены русским аналогом).

Листинг файла README. TXT

MICROSOFT FOUNDATION CLASS LIBRARY : MyDlg

AppWizard создал приложеии MyDlg. Это приложение демонстрирует основные используемые классы Microsoft Foundation classes и является некоторым шаблоном, который можно расширять далее.

В этом файле приведена общая информация о созданных файлах проекта приложения MyDlg. MyDIg.h

Это главный заголовочный файл приложения. В нем указаны другие подключаемые заголовочные файлы (в том числе Resource.h) и обявляется класс приложения CMyDlgApp.

MyDlg.cpp

Это главный исходный файл приложения, содержащий класс приложения CMyDlgApp.

MyDlg.rc

Это список всех ресурсов Microsoft Windows, используемых программой. Ресурсами являются пиктограммы, битовые изображения и курсоры, хранимые в подкаталоге RES. Этот файл можно редактировать средствами Microsoft Developer Studio. res\MyDIg.ico

Это файл пиктограммы, используемой как ярлык приложения. Эта пиктограмма также включена в файл ресурсов MyDlg.rc.

res\MyDlg.rc2

В этом файле представлены ресурсы, не редактируемые средствами Microsoft Developer Studio.

MyDlg.clw

Этот файл содержит информацию, используемую ClassWizard для редактирования существующих классов или добавления новых классов. ClassWizard также использует этот файл для хранения необходимой информации для создания и редактирования таблицы сообщений (message map) и таблицы данных (dialog data map) и для создания прототипов функций-членов.

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

AppWizard создает один класс диалогового окна: MyDlgDlg.h, MyDIgDlg.cpp - диалог

Эти файлы содержат ваш производный класс CMyDlgDlg. Этот класс описывает поведение главного диалогового окна вашего приложения. Шаблон этого диалогового окна содержится в файле MyDlg.rc, который можно редактировать средствами Microsoft Developer Studio.

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

Другие стандартные файлы:

StdAfx.h, StdAfx.cpp

Эти файлы используются для MyDlg.pch и StdAfx.obj. Resource.h

Это стандартный заголовочный файл, в котором определяются новые ресурсы IDs. Microsoft Developer Studio читает и модифицирует этот файл.

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

Другие замечания:

AppWizard использует вставку "TODO:" для указания места в исходном коде программы, в которое вы можете вставлять свой дополнительный код.

///////////////////////////////////////////////////////////////// Листинг файла MyDlg.cpp

// MyDlg.cpp : Defines the class behaviors for the application.

// Определяет поведение класса приложения

#include "stdafich" «include "MyDlg.h" «include "MyDlgDlg.h"

#ifdef_DEBUG

«define new DEBUG_NEW

#undefTHIS_FILE

static char THIS_FILE[] = _FILE_;

#endif

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

// CMyDlgApp

BEGIN_MESSAGE_MAP(CMyDlgApp, CWinApp)

//{{AFX_MSG_MAP(CMyDlgApp)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG

ON_COMMAND(ID_HELP, CWinApp: :OnHelp) END_MESSAGE_MAP()

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

// CMyDlgApp конструктор CMyDlgApp::CMyDlgApp()

{ // TODO: Здесь можно добавить программный код конструктора, // Код инициализации следует добавлять в методе Initlnstance

}

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

// The one and only CMyDlgApp object

CMyDlgApp theApp; // Создание объекта приложения

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

// CMyDlgApp инициализация

BOOL CMyDlgApp::InitInstance()

{

// If you are not using these features and wish to reduce the size

// of your final executable, you should remove from the following

// the specifc initialization routines you do not need. #ifdef_AFXDLL

Enable3dControls();

// Вызывается, если MFC загружается как DLL

#else

Enable3dControlsStatic();

// Вызывается, если MFC линкуется статически

#endif

CMyDlgDlg dig; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK)

{ // TODO: Здесь можно поместить программный код, выполняемый, // когда диалоговое окно разрушается при щелчке на кнопке ОК

}

else if (nResponse == IDCANCEL)

{ // TODO: Здесь можно поместить программный код, выполняемый, // когда диалоговое окно разрушается при щелчке на кнопке Cancel

}

// Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump, return FALSE; >

Листинг файла MyDIgDlg.cpp:

// MyDIgDlg.cpp : implementation file (файл управления диалоговым окном) #include "stdafx.h" #include "MyDlg.h" #include "MyDlgDlg.h" #ifdef_DEBUG #define new DEBUG_NEW #undefTHIS_FILE static char THIS_FILE[] = _FILE_;

#endif

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

// CAboutDlg используется для диалогового окна с пунктом меню Арр About class CAboutDlg : public CDialog {public:

CAboutDlgO;

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL // Implementation 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) { CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg) // Нет обработки сообщений

//}}AFX_MSG_MAP END_MESSAGE_MAP()

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

// CMyDlgDlg диалоговое окно CMyDlgDlg::CMyDlgDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMyDlgDlg::IDD, pParent) {

//{{AFX_DATA_INIT(CMyDlgDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

// Note that Loadlcon does not require a subsequent Destroylcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMyDIgDIg::DoDataExchange(CDataExchange* pDX)

{ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlgDlg)

// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CMyDlgDlg, CDialog)

//{{AFX_MSG_MAP(CMyDlgDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP END_MESSAGE_MAP()

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

// CMyDlgDlg обработка сообщений BOOL CMyDIgDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Добавление к системному меню пункта "About..."

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & OxFFFO) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < OxFOOO);

CMenu* pSysMenu = GetSystemMenu(FALSE);

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{ pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

// Установка пиктограммы для данного диалогового окна.

// Если главное окно приложения не является диалоговым окном,

// то это делается автоматически

Setlcon(m_hlcon, TRUE); // Определение большой пиктограммы

Setlcon(m_hlcon, FALSE); // Определение малой пиктограммы

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}

void CMyDlgDlg: :OnSysCommand(UINT nID, LPARAM lParam)

{ if ((nID & OxFFFO) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal();

}

else

{ CDialog::OnSysCommand(nID, lParam);

} }

// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CMyDlgDlg::OnPaint() { if(lslconic())

{ CPaintDC dc(this); // графический контекст

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxlcon + 1) / 2;

int у = (rect.Height() - cylcon + 1) / 2;

// Отображение пиктограммы

dc.DrawIcon(x, у, m_hlcon); }

else

{ CDialog::OnPaint(); } }

// The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSORCMyDlgDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; >

Листинг файла MyDlg.h

// MyDlg.h : главный заголовочный файл для приложения MYDLG

//

#ifndef _AFXWIN_H_

#error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols

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

// CMyDlgApp:

// Реализация этого класса находится в файле MyDlg.cpp class CMyDlgApp : public CWinApp

{ public:

CMyDlgApp(); // Конструктор // Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMyDlgApp) public:

virtual BOOL Initlnstance();

// Этот метод обязательно переопределять //}}AFX_VIRTUAL // Implementation

//{{AFX_MSG(CMyDlgApp)

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP()

};

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

Листинг файла MyDlgDlg.h

// MyDlgDlg.h : заголовочный файл

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

// CMyDlgDlg класс диалогового окна class CMyDlgDlg : public CDialog

{

// Конструкторы

public:

CMyDlgDlg(CWnd* pParent = NULL); // стандартный конструктор // Dialog Data

//{{AFX_DATA(CMyDlgDlg)

enum {IDD = IDD_MYDLG_DIALOG };

// NOTE: the ClassWizard will add data members here

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMyDlgDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL // Implementation protected:

HICON m_hIcon;

// Generated message map functions

//{{AFX_MSG(CMyDlgDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afxmsg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

Приведенный выше пример автоматического создания приложения-диалога включает следующие элементы:

  • средства для отображения диалогового окна с двумя командными кнопками ОК и Cancel и процедуру обработки событий, возникающих при щелчке мышью на этих кнопках;

  • описание пункта системного меню About и процедуру обработки событий для него.

Соседние файлы в папке VC++Баженова