Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / VC++Баженова / Приложение.doc
Скачиваний:
36
Добавлен:
16.02.2016
Размер:
7.5 Mб
Скачать

Приложение РЕАЛИЗАЦИЯ OLE-ПРИЛОЖЕНИЙ

Используя AppWizard, можно создавать шаблоны приложений, поддержи­вающие встраивание OLE-объектов. Будем называть такие приложения OLE-контейнером. Если приложение может вызываться для редактирования встроен­ного OLE-объекта, то оно называется OLE-сервером.

Для создания приложения OLE-контейнера или OLE-сервера следует на третьем шаге мастера AppWizard (рис. 1) выбрать требуемую поддержку для использования OLE-объектов.

Рассмотрим создание шаблона приложения для OLE-контейнера. Будем создавать простое SDI-приложение. В диалоге, отображаемом на третьем шаге, выберем тип поддержки Container.

Рис. 1. Арр Wizard - шаг 3

На шестом шаге AppWizard (рис. 2) появится диалог, отображающий список всех создаваемых классов. В нем к классам, создаваемым для шаб­лона SDI-приложения, подробно рассмотренного в главе "SDI и MDI приложения", добавляется класс, производный от COleClientltem. Также базовым классом документа вместо CDocument выбирается класс COle-Document.

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

В результате AppWizard создаст шаблон приложения, реализующий пять основных классов: класс приложения, класс окна, класс документа, класс отображения и класс элемента контейнера.

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

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

Рис. 4 иллюстрирует две вкладки окна проекта для автоматически по­строенного шаблона приложения OLE-контейнера: классы и ресурсы.

Рис. 4. Окно проекта: классы и ресурсы

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

Назначение

Имя файлов

Для класса приложения

CONT.h CONT.cpp;

Список используемых ресурсов, включая пиктограммы, битовые изображения и курсоры, расположенные в подкаталоге RES: • файл пиктограммы • ресурсы, не редактируемые средствами Microsoft Developer Studio

CONT.rc

res\CONT.ico res\CONT.rc2

Информация, используемая ClassWizard для редактирования классов и добавления новых классов

CONT.clw

Для класса главного окна приложения (класс CMainFrame, производный от CFrameWnd)

MainFrm.h, MainFrm.cpp

Файл битового изображения, используе­мый для создания панели инструментов (рис. 5)

res\Toolbar.bmp

Для класса документа

CONTDoc.h, CONTDoc.cpp

Для класса отображения

CONTView.h, CONTView.cpp

Для класса управления OLE-объектом

Cntrltem.h, Cntrltem.cpp

Общие файлы Файл описания ID всех новых ресурсов

StdAfx.h, StdAfxxpp Resource.h

Все файлы ресурсов автоматически добавляются в шаблон приложения. Так для создания панели инструментов будет создан файл, содержащий би­товое изображение всех кнопок. На рис 5. показано окно редактора ресур­сов с файлом созданной панели инструментов Toolbar.bmp.

Рис. 5. Окно редактора ресурсов для панели инструментов

В заключение с некоторым сокращением приведем листинги автомати­чески созданных мастером AppWizard файлов.

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

II CONT.h : заголовочный файл для класса приложения #include "resource.h" // main symbols class CCONTApp : public CWinApp

{ public:

CCONTApp(); // Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CCONTApp)

public:

virtual BOOL Initlnstance();

//}}AFX_VIRTUAL // Implementation

//{{AFX_MSG(CCONTApp)

afx_msg void OnAppAbout();

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

};

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

//{{AEX_INSERT_LOCATION}>

// Developer Studio will insert additional declarations immediately before the previous line.

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

II CONT.cpp : файл реализации #include "stdafx.h" «include "CONT.h" #include "MainFrm.h" «include "CONTDoc.h" «include "CONTView.h"

#ifdef_DEBUG «define new DEBUG_NEW #undefTHIS_FILE static char THIS_FILE[] = _FILE_; «endif

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllltllllllll II CCONTApp

BEGIN_MESSAGE_MAP(CCONTApp, CWinApp) //{{AFX_MSG_MAP(CCONTApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

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

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

// Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWmApp::OnFHeOpen) // Standard print setup command

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

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll CCONTApp::CCONTApp() // Конструктор { // TODO: add construction code here,

// Place all significant initialization in Initlnstance }

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll CCONTApp theApp; // Создание единственного объекта приложения

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll BOOL CCONTApp::InitInstance() // "Начало" приложения { // Initialize OLE libraries

if (!AfxOleInit())

{ AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; }

AfxEnableControlContainer();

// Стандартная инициализация (этот код можно и удалить) #ifdef_AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically #endif

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettingsO; // Load standard INI file options (including MRU)

CSingleDocTemplate* pDocTemplate; // Создание шаблона документа pDocTemplate = new CSingleDocTempIate(

IDR_MAINFRAME,

RUNTIME_CLASS(CCONTDoc),

RUNTIME_CLASS(CMainFrame), // main SDI frame window

RUNTIMElcLASS(CCONTView));

// Следующая строка кода добавлена для поддержки OLE-контейнера pDocTemplate->SetContainerInfo(IDR_CNTR_INPLACE); AddDocTemplate(pDocTemplate);

CCommandLinelnfo cmdlnfo; ■// Разбор командной строки ParseCommandLine(cmdlnfo);

if (!ProcessShellCommand(cmdInfo)) // Dispatch commands specified

return FALSE; // on the command line

mjMainWnd->ShowWindow(SW_SHOW); // Инициализация и m_pMainWnd->UpdateWindow(); // отображение окна приложения return TRUE; }

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll class CAboutDlg : public CDialog

{

public:

CAboutDlgO; // Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = roD_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) // No message handlers

//}}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) // No message handlers

//}}AFX_MSG_MAP END_MESSAGE_MAP()

void CCONTApp: :OnAppAbout() // Обработчик сообщения { CAboutDlg aboutDlg; aboutDlg.DoModal();}

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

class CMainFrame : public CFrameWnd

{

protected: // create from serialization only

CMainFrame();

DECLARE_DYNCREATE(CMainFrame) public: // Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMainFrame)

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

//}}AFX_VIRTUAL . // Implementation public:

virtual ~CMainFrame(); #ifdef_DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const; #endif protected: // control bar embedded members

CStatusBar m_wndStatusBar;

CToolBar m_wndToolBar; // Generated message map functions protected:

//{{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

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

};

HIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

//{{AFX_INSERT_LOCATION}}

// Developer Studio will insert additional declarations immediately before the previous line.

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

#include "stdafx.h"

#include "CONT.h"

#include "MainFrm.h"

#ifdef_DEBUG

#define new DEBUG_NEW

#undefTHIS_FILE

static char THIS_FILE[] = __FILE_;

#endif

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

II CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

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

// DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP()

static UINT indicators!] =

{ ID_SEPARATOR, // Индикаторы строки состояния

Id_indicator_caps,

Id_indicator_num,

Id_indicator_scrl,

};

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

CMainFrame: :CMainFrame() // Конструктор { // TODO: add member initialization code here

}

CMainFrame::~CMainFrame() // Деструктор

{ } intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStract) //Обработчик

{ // сообщения

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1; if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACEO("Failed to create toolbar\n"); return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))

{•

TRACEOf Failed to create status bar\n"); return -1; // fail to create

}

// TODO: Remove this if you don't want tool tips or a resizeable toolbar

m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |

CBRSJTOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

// TODO: Delete these three lines if you don't want the toolbar to be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar); return 0; }

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) ,{

// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CFrameWnd::PreCreateWindow(cs); }

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

II CMainFrame diagnostics

#ifdef_DEBUG

void CMainFrame::AssertValid() const

{ CFrameWnd::AssertValid();}

void CMainFrame::Dump(CDumpContext& dc) const

{ CFrameWnd::Dump(dc);}

#endif//_DEBUG

Illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll II CMainFrame message handlers

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

class CCONTDoc : public COleDocument

{

protected: // create from serialization only

CCONTDoc();

DECLARE_DYNCREATE(CCONTDoc) // Attributes public:

// Operations public: // Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CCONTDoc)

public:

virtual BOOL OnNewDocument();

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