15.12  Компоненты приложения

Проект включает в себя ряд файлов, созданных системой AppWizard (рис. 15.8):

· RGZ.cpp – основной файл приложения. В нем определены методы основного класса приложения;

· RGZ.rc – файл ресурсов. В этом файле описаны все ресурсы приложения. Сами ресурсы приложения могут быть записаны в каталоге Res, расположенном в главном каталоге проекта;

· RGZDlg.cpp – файл содержит определение методов класса CDlgDlg;

· Resource.h – файл содержит определения идентификаторов ресурсов приложения;

· RGZ.h – в этом файле перечислены другие включаемые файлы и описан главный класс приложения;

· RGZDlg.h – файл содержит описание класса главной диалоговой панели, который называется CDlgDlg. Класс CDlgDlg наследуется от базового класса CDialog, определенного в библиотеке классов MFC;

· StdAfx.h, StdAfx.cpp – использование этих файлов позволяет ускорить процесс повторного построения проекта;

· RGZ.ico – пиктограмма приложения.

Рис. 15.8. Информационное окно File/View

· RGZ.rc2 – в этом файле определены ресурсы, которые нельзя редактировать с помощью редактора ресурсов среды Visual C++;

· Readme.txt – текстовый файл, содержащий описание проекта. В нем кратко рассмотрен каждый файл, входящий в проект, перечислены классы приложения, а также представлена другая информация.

Рассмотрим более подробно содержимое  файлов.

Заголовочные файлы Header files

1) Resourse.h.

// (()) NO_DEPENDENCIES

// Microsoft Visual C + + Сгенерировано включать файл.

// Используется RGZ.RC

//

#DEFINE IDR_MAINFRAME 128

#DEFINE IDM_ABOUTBOX 0x0010

#DEFINE IDD_ABOUTBOX 100

#DEFINE IDS_ABOUTBOX 101

#DEFINE IDD_RGZ_MFC_DIALOG 102

// Следующие значения являются значениями по умолчанию для новых объектов 

#IFDEF APSTUDIO_INVOKED

#IFNDEF APSTUDIO_READONLY_SYMBOLS

#DEFINE _APS_NEXT_RESOURCE_VALUE 129

#DEFINE _APS_NEXT_CONTROL_VALUE 1000

#DEFINE _APS_NEXT_SYMED_VALUE 101

#DEFINE _APS_NEXT_COMMAND_VALUE 32771

#ENDIF

#ENDIF

2) RGZ.h

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

#if!defined(AFX_RGZ_H__22E19C91_FA8D_4796_9813_762A1CFCADCE__INCLUDED_)

#defineAFX_RGZ_H__22E19C91_FA8D_4796_9813_762A1CFCADCE__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__

#error include ‘stdafx.h’ before including this file for PCH

#endif

#include "resource.h" // основной символ

// CRGZApp:

// См. RGZ.cpp реализации этого класса

class CRGZApp : public CWinApp

{ public: CRGZApp();

// ClassWizard виртуальная функция переопределяет

// {{AFX_VIRTUAL(CRGZApp)

public:

virtual BOOL InitInstance();

// }}AFX_VIRTUAL

// Реализация

// ((AFX_MSG (CRGZApp)

// ПРИМЕЧАНИЕ – ClassWizard будет добавлять и удалять члены-функции здесь.

// Не изменяйте то, что вы видите в этих блоках генерируемого кода!

// )) AFX_MSG

DECLARE_MESSAGE_MAP ()

};

// (()) AFX_INSERT_LOCATION

// Microsoft Visual C + + будет вставлять дополнительные объявления непосредственно

//  перед предыдущей строкой.

#ENDIF//!defined(AFX_RGZ_H__22E19C91_FA8D_4796_9813_762A1CFCADCE__INCLUDED_)

3) RGZDlg.h

#if

!defined(AFX_RGZDLG_H__1F1014A5_FE6B_4499_960B_43BCB795C72F__INCLUDED_)

#define AFX_RGZDLG_H__1F1014A5_FE6B_4499_960B_43BCB795C72F__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// CRGZDlg dialog

class CRGZDlg : public CDialog

{public:

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

// данные

// {{AFX_DATA(CRGZDlg)

enum { IDD = IDD_RGZ_DIALOG };

// Примечание: ClassWizard будет добавлять данные-члены здесь

// }}AFX_DATA

// ClassWizard виртуальная функция переопределяет

// {{AFX_VIRTUAL(CRGZDlg)

protected:

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

// поддержка

// }}AFX_VIRTUAL

// Реализация

protected:

HICON m_hIcon;

// Функции сообщений

// {{AFX_MSG(CRGZDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

// }}AFX_MSG

DECLARE_MESSAGE_MAP()

};

// {{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ будет добавлять новые объявления перед предыдущей строкой.

#endif

//!defined(AFX_RGZDLG_H__1F1014A5_FE6B_4499_960B_43BCB795C72F__INCLUDED_)

4) Stdafx.h:

// включаемый файл из стандартной системы включаемых файлов,

#if

!defined(AFX_STDAFX_H__F9A0117A_69C2_4EA2_9A7B_D6F83B4357D1__INCLUDED_)

#define AFX_STDAFX_H__F9A0117A_69C2_4EA2_9A7B_D6F83B4357D1__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif //_MSC_VER > 1000

#define VC_EXTRALEAN // исключает редко используемые вещи

                                                 // из заголовков Windows

#include <afxwin.h>          // MFC ядро и стандартные компоненты

#include <afxext.h>          // MFC расширения

#include <afxdisp.h>        // MFC Automation классы

#include <afxdtctl.h> // MFC поддержка Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h> // MFC поддержка Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

// {{AFX_INSERT_LOCATION}}

//Microsoft Visual C++ будет добавлять новые объявления перед предыдущей строкой.

#endif

//!defined(AFX_STDAFX_H__F9A0117A_69C2_4EA2_9A7B_D6F83B4357D1__INCLUDED_)

Исходные файлы Source files

1. RGZ.cpp

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

#INCLUDE "stdafx.h"

#INCLUDE "RGZ.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

// CRGZApp

BEGIN_MESSAGE_MAP (CRGZApp, CWinApp)

// ((AFX_MSG_MAP (CRGZApp)

// ПРИМЕЧАНИЕ – ClassWizard будет добавлять и удалять макросы здесь.

//  Не изменяйте то, что вы видите в этих блоках генерируемого кода!

// )) AFX_MSG

ON_COMMAND (ID_HELP, CWinApp:: OnHelp)

END_MESSAGE_MAP ()

// CRGZApp конструктор

CRGZApp:: CRGZApp ()

{

//: добавить здесь код конструктора,

// Место проведения всех значимых инициализаций в InitInstance

}

// Единственный объект CRGZApp

CRGZApp thеАрр;

// Инициализация CRGZApp

BOOL CRGZApp:: InitInstance ()

{

AfxEnableControlContainer ();

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

//В специальных программах инициализации вы не нуждаетесь.

#ifdef _AFXDLL

Enable3dControls (); //Вызов при использовании МFC в общей DLL

#else

Enable3dControlsStatic (); //Вызов, когда ссылка на статическом МFC

#endif

CRGZDlg DLG;

m_pMainWnd = &dlg;

int nResponse = dlg.DoModal ();

if(nResponse== IDOK)

{

// место обработки кода при диалоге выполняется при OK

}

else If(nResponse == IDCANCEL)

{

// место обработки кода при диалоге  выполняется при Cancel

}

// Поскольку диалоговые окна были закрыты, return FALSE так что мы выходим

//  из приложения

return FALSE;

}

2. RGZDlg.cpp

#include "stdafx.h"

#include "RGZ.h"

#include "RGZDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[ ] = __FILE__;

#endif

// CAboutDlg диалоговое приложение для App 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); // DDX/DDV  поддержка   

// }}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)

{CDialog::DoDataExchange(pDX);}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

// Нет сообщений обработчика

END_MESSAGE_MAP()

// CRGZDlg dialog

CRGZDlg::CRGZDlg(CWnd* pParent /*=NULL*/): CDialog(CRGZDlg::IDD, pParent)

{ // Примечание: ClassWizard добавление и инициализация здесь

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

}

void CRGZDlg::DoDataExchange(CDataExchange* pDX)

{CDialog::DoDataExchange(pDX);

// Примечание: ClassWizard  будет добавлять DDX и DDVзвонки здесь

}

BEGIN_MESSAGE_MAP(CRGZDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

END_MESSAGE_MAP()

// CRGZDlg обработчики сообщений

BOOL CRGZDlg::OnInitDialog()

{CDialog::OnInitDialog();

// Добавить пункт меню системы меню

// IDM_ABOUTBOX должна быть от командной системы.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if(pSysMenu != NULL)

{CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!strAboutMenu.IsEmpty())

{pSysMenu->AppendMenu(MF_SEPARATOR);

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

}

// Значок для диалогового приложения. Установлен автоматически, когда главное

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

SetIcon(m_hIcon, TRUE);     // Установить большой значок

SetIcon(m_hIcon, FALSE);    // Установить маленький значок

// Добавить дополнительную инициализацию здесь

return TRUE;  / /возвращать TRUE, если установлено управление}

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

{if((nID & 0xFFF0) == IDM_ABOUTBOX)

{CAboutDlg dlgAbout;

dlgAbout.DoModal();}

else

{CDialog::OnSysCommand(nID, lParam);}}

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

//вам потребуется следующий код: Нарисовать иконку (рис. 15.9).

//Для приложений MFC с использованием документа  вид модели,

// Он будет автоматически установлен.

void CRGZDlg::OnPaint()

{if(IsIconic())

{CPaintDC dc(this); // контекст устройства для раскраски

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

int cxIcon = GetSystemMetrics(SM_CXICON); // Значок в центре

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() – cxIcon + 1) / 2;

int y = (rect.Height() – cyIcon + 1) / 2;

dc.DrawIcon(x, y, m_hIcon); // Нарисовать значок

}

else

{CDialog::OnPaint();}}

HCURSOR CRGZDlg::OnQueryDragIcon() // свернуть окно.

{return (HCURSOR) m_hIcon;

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

Файлы ресурсов  находятся в папке RGZ.rc (рис. 15.9).

Рис. 15.9. Информационное окно ResourceView