徒手打造OCAF单文档程序框架

  • 格式:pdf
  • 大小:466.39 KB
  • 文档页数:15

Vs2008下手工创建OCAF单文档程序框架徒手打造OCAF单文档程序框架分类:技术开发2008-06-14 16:44936人阅读评论(4)收藏举报徒手打造OCAF单文档程序框架VC6, MFC, SDI, OpenCascade, OCAF, 程序框架为什么是单文档?也许只是因为喜欢。

不过大多数的CAD类软件都是单文档框架,所以我们有理由相信,“单文档”是情理之中的选择。

本文介绍如何根据Ocaf AppWizard生成的MDI程序框架,在MFC标准SDI程序框架上构造OCAF程序框架的方法。

(其实,写下来的主要目的是备忘)一、用Ocaf AppWizard生成OCAF程序框架这一步很简单,就是用OCC提供的wizard生成一个OCAF程序框架。

之所以要这样做,是因为OCAF程序必须有一个document作为数据框架的容器,而这个document又必须包含在一个继承自TDocStd_Application类的application中,我们就利用wizard生成这个类。

1.打开VC6,新建一个project,如下图所示,2.在下图的这个选项页中,我们保留缺省值。

3.Build这个project,确保它能运行,如下图所示。

二、生成MFC单文档程序这一步没什么需要多说的,注意以下图中的选项。

三、改造1.按以下两图更改Project Settings。

一个简单办法就是从第一步的OCAF中把相应的设置复制到第二步的OccSDI中。

2.把第一步中生成的OcafApplication类添加到第二步中的project中。

具体的,把第一步中生成的project的目录中的5个文件Handle_OcafApplication.h, OcafApplication.cpp, OcafApplication.h, OcafApplication.ixx和OcafApplication.jxx复制到第二步中的OccSDI的目录下,并在VC中把以上文件添加OccSDI的project中。

它看起来应该是这个样子。

3.对比COccSDIApp和COCAFApp这两个类,把COCAFApp中有的,而COccSDIApp 中没有的添加到COccSDIApp类中。

a)在COccSDIApp类的头文件中添加如下包含语句:#include <Graphic3d_WNTGraphicDevice.hxx>#include "OcafApplication.h"b) 在COccSDIApp类的声明中添加如下成员函数和成员变量:public:Handle_OcafApplication GetOCAFApp() { return myOcafApplication; };Handle_Graphic3d_WNTGraphicDevice GetGraphicDevice() const{ return myGraphicDevice; }protected:// This object needed for creating V3d_ViewerHandle_Graphic3d_WNTGraphicDevice myGraphicDevice;// Object of class derived from TDocStd_ApplicationHandle_OcafApplication myOcafApplication;c)在OccSDI.cpp中添加如下包含语句:#include "direct.h"#include <Standard_Version.hxx>(现在还不明白其作用)d)注释掉#define new DEBUG_NEW这一宏。

e)把构造函数COCAFApp::COCAFApp()的函数体复制到COccSDIApp::COccSDIApp()中。

4.改造文档类。

方法还是拿来主义。

a)在OccSDIDoc.h中添加头文件包含:#include <TDocStd_Document.hxx>#include <V3d_Viewer.hxx>#include <AIS_InteractiveContext.hxx>b) 在COccSDIDoc类的声明中添加如下inline函数和成员变量:public:Handle_TDocStd_Document GetOCAFDoc() { return OCAFDoc; };Handle_V3d_Viewer GetViewer() { return myViewer; };protected:Handle_V3d_Viewer myViewer;Handle_AIS_InteractiveContext myAISContext;// OCAF Document attached to myOcafApplicationHandle_TDocStd_Document OCAFDoc;OccSDIDoc.cppc) 在OccSDIDoc.cpp中添加如下包含语句:#include <TCollection_ExtendedString.hxx>#include <Graphic3d_WNTGraphicDevice.hxx>#include <WNT_Window.hxx>#include <V3d_View.hxx>#include <AIS_Trihedron.hxx>#include <Geom_Axis2Placement.hxx>#include <gp.hxx>d)注释掉#define new DEBUG_NEW这一宏。

e)把构造函数COCAFDoc::COCAFDoc()的函数体复制到COccSDIDoc::COccSDIDoc()中;把析构函数COCAFDoc::~COCAFDoc()的函数体复制到COccSDIDoc::~COccSDIDoc()中。

注意,这两个函数中分别有一处应用程序指针的cast型需要修改,我想你知道应该怎么做。

f)复制OnNewDocument()函数的函数体。

其实只是这样简单的复制是不行的,对这个函数的修改还需要研究。

g)重载COccSDIDoc::OnSaveDocument()虚函数,复制COCAFDoc::OnSaveDocument()的函数体过来,同样有一处应用程序指针的cast型需要修改。

h)重载COccSDIDoc::OnOpenDocument ()虚函数,复制COCAFDoc::OnOpenDocument()的函数体过来,同样有一处应用程序指针的cast型需要修改。

这个函数也需要适当的修改。

i)添加以下函数:virtual void DragEvent (const Standard_Integer x ,const Standard_Integer y ,const Standard_Integer TheState,const Handle(V3d_View)& aView );virtual void InputEvent (const Standard_Integer x ,const Standard_Integer y ,const Handle(V3d_View)& aView );virtual void MoveEvent (const Standard_Integer x ,const Standard_Integer y ,const Handle(V3d_View)& aView );virtual void ShiftMoveEvent (const Standard_Integer x ,const Standard_Integer y ,const Handle(V3d_View)& aView );virtual void ShiftDragEvent (const Standard_Integer x ,const Standard_Integer y ,const Standard_Integer TheState,const Handle(V3d_View)& aView );virtual void ShiftInputEvent(const Standard_Integer x ,const Standard_Integer y ,const Handle(V3d_View)& aView );virtual void Popup (const Standard_Integer x ,const Standard_Integer y ,const Handle(V3d_View)& aView );把对应的函数体copy过去就可以了。

j)参照OCAF的ID为IDR_Popup3D的Menu资源,在OccSDI中添加一个完全相同的资源。

5.改造框架类,把工具条加进去。

a) 参照OCAF的ID为IDR_CHILDFRAME的Toolbar资源,在OccSDI中添加一个完全相同的资源,并把新的Toolbar资源的ID设为IDR_MAINTOOLBAR。

注意每个按钮的ID 均一字不差地复制过来。

b)在CMainFrame类中添加一个成员变量:CToolBar m_MainToolBar;c)在CMainFrame::OnCreate()函数中添加如下语句:if (!m_MainToolBar.Create(this) || !m_MainToolBar.LoadToolBar(IDR_MAINTOOLBAR)) {TRACE0("Failed to create toolbar/n");return -1; // fail to create}m_MainToolBar.SetBarStyle(m_MainToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);m_MainToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_MainToolBar);d)现在OccSDI看起来应该是这个样子:6.改造视图类。

a)在OccSDIView.h文件中添加以下头文件包含和枚举类型定义:#include <V3d_View.hxx>#include <TPrsStd_AISViewer.hxx>enum CurAction3d {CurAction3d_Nothing,CurAction3d_DynamicZooming,CurAction3d_WindowZooming,CurAction3d_DynamicPanning,CurAction3d_GlobalPanning,CurAction3d_DynamicRotation};b)在COccSDIView类声明中添加以下变量以及函数。