本帖最后由 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的微博
|