单文档视图结构的ActiveX控件

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单文档/视图结构的ActiveX控件

单文档/视图模式是MFC编程里比较强大的一种编程模式,如果ActiveX控件能够用这种模式的话,将可以做出非常强大的Web在线应用。

下面我们就介绍一种把单文档/视图模式的程序改造成ActiveX控件的方法。

做起来很难,但是完成了会很有成就感,本方法来源于15Seconds。在VC6.0和下都已证明可行。我用这个方法做了一个Web上的在线服装设计软件,Client 端支持NT4.0,客户公司有上千台NT4.0。据美国同事说在投标中击败了Altium公司(电路设计软件Protel的开发商)的方案,哈。

需要要两个文件:

1.ActivDoc.cpp

// ActivDoc.cpp : implementation file

//

#include "stdafx.h"

#include "ActivDoc.h"

CActiveXDocTemplate::CActiveXDocTemplate(CRuntimeClass* pDocClass,

CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)

: CSingleDocTemplate(IDR_NOTUSED, pDocClass, pFrameClass,

pViewClass)

{

ASSERT(pFrameClass);

}

CFrameWnd* CActiveXDocTemplate::CreateDocViewFrame(CWnd* pParen tWnd)

{

CWaitCursor cursor;

TRY

{

ASSERT(pParentWnd && IsWindow(*pParentWnd));

ASSERT_KINDOF(CActiveXDocControl, pParentWnd);

m_pParentWnd = pParentWnd;

m_pFrameWnd = NULL;

// OpenDocumentFile is a virtual method (implemented in

// the CSingleDocTemplate base class) that creates

// the document (either empty or loaded from the specified

// file) and calls our CreateNewFrame function. Passing

// NULL to the function creates a new document. Incidentally,

// the view is created by the CFrameWnd's OnCreateClient()

// method.

if (!OpenDocumentFile(NULL))

return NULL;

// Since OpenDocumentFile sets m_pFrame, we can now use it.

ASSERT(m_pFrameWnd);

ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);

m_pFrameWnd->ShowWindow(SW_SHOWNORMAL);

return m_pFrameWnd;

}

CATCH_ALL(e)

{

AfxMessageBox("Read storyboard error.please retry!");

//THROW_LAST();

}

END_CATCH_ALL

return NULL;

}

CFrameWnd* CActiveXDocTemplate::CreateNewFrame(CDocument* pDoc,

CFrameWnd* pOther)

{

ASSERT(pOther == NULL);

ASSERT(m_pFrameClass != NULL);

if (pDoc != NULL)

ASSERT_VALID(pDoc);

// Create a frame wired to the specified document

CCreateContext context;

context.m_pCurrentFrame = pOther;

context.m_pCurrentDoc = pDoc;

context.m_pNewViewClass = m_pViewClass;

context.m_pNewDocTemplate = this;

m_pFrameWnd = (CFrameWnd*)m_pFrameClass->CreateObject();

if (m_pFrameWnd == NULL)

{

TRACE1("Warning: Dynamic create of frame %hs failed. ",

m_pFrameClass->m_lpszClassName);

return NULL;

}

ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);

if (context.m_pNewViewClass == NULL)

TRACE0("Warning: creating frame with no default view. ");

// The frame is created as a menu-less child of the

// CActiveXDocControl in which it will reside.

ASSERT_KINDOF(CActiveXDocControl, m_pParentWnd);

if (!m_pFrameWnd->Create(NULL, "", WS_CHILD|WS_VISIBLE,

CFrameWnd::rectDefault, m_pParentWnd, NULL, 0, &context))

{

TRACE0("Warning: CDocTemplate couldn't create a frame. ");

return NULL;

}

return m_pFrameWnd;

}

CDocument* CActiveXDocTemplate::OpenDocumentFile(

LPCTSTR lpszPathName, BOOL bVerifyExists)

{

CWaitCursor cursor;

SaveDocumentFile();

m_docFile = lpszPathName;

if (bVerifyExists)

{

DWORD dwAttrib = GetFileAttributes(m_docFile);

if (dwAttrib == 0xFFFFFFFF ||

dwAttrib == FILE_ATTRIBUTE_DIRECTORY)

{

lpszPathName = NULL;

}

}

return CSingleDocTemplate::OpenDocumentFile(

lpszPathName, TRUE);

相关文档
最新文档