明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1646|回复: 5

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

[复制链接]
发表于 2011-3-22 18:22:54 | 显示全部楼层 |阅读模式
本帖最后由 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 [Stop]()
        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技术了。





该贴已经同步到 efan2000的微博

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-3-22 19:43:20 | 显示全部楼层
目前还不懂,先顶一下来看看讲解吧
发表于 2011-3-22 20:31:12 | 显示全部楼层
顶一下,等发完了再合并成一个专题?
 楼主| 发表于 2011-3-23 11:22:38 | 显示全部楼层
一直想尝试通过一个通用的框架,能适应企业级的CAD开发,从代码设计转向模型设计,提高开发效率,维护能力。
发表于 2011-3-23 17:54:25 | 显示全部楼层
有点复杂但是好东西啊
发表于 2011-6-29 16:32:14 | 显示全部楼层
很感谢分享,来学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 21:38 , Processed in 0.153428 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表