efan2000 发表于 2011-3-22 18:22:54

基于CAB技术的CAD开发实现(二)

本帖最后由 efan2000 于 2011-3-23 11:48 编辑

    在上一文章中,窗口ShellForm是模态的,显示之后不能操作CAD。而目前的CAB架构是针对独立的应用程序,如何修改才能适应嵌入在CAD中运行的架构呢?    CAB框架的启动是通过FormShellApplication.Run来运行,可FormShellApplication必须由类型为System.Windows.Forms.Form的TShell来实现,而CAD中对应的却是Autodesk.AutoCAD.Windows.Window,另外二次开发的.Net程序中的窗体,是在AutoCAD主界面里运行,不能创建自己的主窗口。下图是CabApplication的继承关系。    下面通过步骤来说明修改的方法。1、修改文件CabApplication的过程Run,将原来的Start后等待Dispose的代码放到新的过程Stop中。    旧代码:
    ''' <summary>
    ''' Starts the application.
    ''' </summary>
    Public Sub Run()
      RegisterUnhandledExceptionHandler()
      Dim builder As Builder = CreateBuilder()
      AddBuilderStrategies(builder)
      CreateRootWorkItem(builder)
      Dim visualizer As IVisualizer = CreateVisualizer()
      If Not visualizer Is Nothing Then
            visualizer.Initialize(innerRootWorkItem, builder)
      End If
      AddRequiredServices()
      AddConfiguredServices()
      AddServices()
      AuthenticateUser()
      ProcessShellAssembly()
      innerRootWorkItem.BuildUp()
      LoadModules()
      innerRootWorkItem.FinishInitialization()
      innerRootWorkItem.Run()
      Start()
      innerRootWorkItem.Dispose()
      If Not visualizer Is Nothing Then
            visualizer.Dispose()
      End If
    End Sub

    新代码:
    Private visualizer As IVisualizer

    ''' <summary>
    ''' Starts the application.
    ''' </summary>
    Public Sub Run()
      RegisterUnhandledExceptionHandler()
      Dim builder As Builder = CreateBuilder()
      AddBuilderStrategies(builder)
      CreateRootWorkItem(builder)
      visualizer = CreateVisualizer()
      If Not visualizer Is Nothing Then
            visualizer.Initialize(innerRootWorkItem, builder)
      End If
      AddRequiredServices()
      AddConfiguredServices()
      AddServices()
      AuthenticateUser()
      ProcessShellAssembly()
      innerRootWorkItem.BuildUp()
      LoadModules()
      innerRootWorkItem.FinishInitialization()
      innerRootWorkItem.Run()
      Start()
    End Sub

    ''' <summary>
    ''' Stops the application.
    ''' </summary>
    Public Sub ()
      innerRootWorkItem.Dispose()
      If Not visualizer Is Nothing Then
            visualizer.Dispose()
      End If
    End Sub
2、修改文件SmartClientApplication和FormShellApplication中的Form为IWin32Window,同时注释掉Application.Run(Shell),我们不需要应用程序来运行主窗口。
3、修改文件MdiWorkspace和WindowWorkspace中的Form为IWin32Window,以适应CAD的Window。
    重新编译CompositeUI和CompositeUI.WinForms后,就可以正常使用CAB技术了。




http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 efan2000的微博

chpmould 发表于 2011-3-22 19:43:20

目前还不懂,先顶一下来看看讲解吧

雪山飞狐_lzh 发表于 2011-3-22 20:31:12

顶一下,等发完了再合并成一个专题?

efan2000 发表于 2011-3-23 11:22:38

一直想尝试通过一个通用的框架,能适应企业级的CAD开发,从代码设计转向模型设计,提高开发效率,维护能力。

wolunli 发表于 2011-3-23 17:54:25

有点复杂但是好东西啊

monkeylzx 发表于 2011-6-29 16:32:14

很感谢分享,来学习一下
页: [1]
查看完整版本: 基于CAB技术的CAD开发实现(二)