- •Id_indicator_caps,
- •Id_indicator_num,
- •Id_indicator_scrl,
- •Virtual void Serialize(cArchive& ar);
- •Implement_dyncreate(ccontDoc, cOleDocument)
- •Void ccontView::OnDraw(cdc* pDc) // Обработчик сообщения
- •Void ccontView::OnBeginPrintiBg(cdc* /*pDc*/, cPrintlnfo* /*рШо*/) {
- •Void ccontView::OnDestroy() {
- •Void ccontView::OnSetFocns(cWnd* pOldWnd)
- •Void ccontView::AssertValid() const
Приложение РЕАЛИЗАЦИЯ 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();