0
点赞
收藏
分享

微信扫一扫

VTK系列教程四:程序嵌套

booksmg2014 2022-01-30 阅读 40

前一篇文章我们简单介绍了MedBeyond项目,从一开始的设计初衷可见,我们希望它能作为一个独立的进程运行,也可嵌入到其他程序中作为其它UI进程的子窗口运行,今天我们就来看一下程序的运行方式以及如何进行程序嵌套。
图片
首先再次回顾一下软件组件图,正是组件的不同层次,才能让软件以不同的形式运行:

1、控制台程序

最简单的当然就是控制台程序,也就是对应于最上层的VTK层,这要归功于VTK中的vtkRenderWindow,默认情况下他将绘制结果显示到控制台上,vtkRenderWindow的继承体系如下:

在这里插入图片描述

2、Windows窗体程序

VTK擅长绘制,虽然也提供了很多控件,但效果并不好,且开发复杂,绘制效果也不如WPF、QT等框架,所以可以把VTK的绘制结果显示到Windows Form窗口中,由Windows Form提供丰富的控件,Button、Slider等。

vtkRenderWindow类中有下面这个接口:

void SetParentId(void *) override = 0;

在System.Windows.Forms.Control类中有下面这个属性:

public IntPtr Handle { get; }

将Windows Form的this.Handle通过上面的接口设置到vtkRenderWindow就可以实现将绘制结果显示到WinForm控件中了。

VTK是C++语言,Windows Form是C#语言,一个是非托管语言,一个是基于.Net的解释型托管语言,他们是不能直接调用的,不过微软提供了两种方式供他们之间进行互操作:

1、类似于调用Win32接口那样将C、C++的接口导入进来

[DllImport("user32.dll", SetLastError = true)]

public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

2、微软提供了程序模板C++/CLI,它是C++和C#的桥梁,通过在项目属性中添加公共语言运行时,这样在程序中既可以使用C++特性,也可以使用C#特性。

图片

3、WPF程序

WPF作为Windows窗体的后继者,其绘制模式与WinForm不同,在绘制效率上有提升,所以WPF会成为不二选择,那如何将VTK绘制结果嵌入到WPF中呢?在方式2中,既可以是一个Windows Form进程,也可以是一个库,我们可以将这个库嵌入到WPF中,这里就必须要用到Win32接口了。

[DllImport("user32.dll", SetLastError = true)]

public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", SetLastError = true)]

public static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

当启动一个WPF进程时,我们可以获取这个进程的信息:Process,其中有个属性MainWindowHandle是WPF进程的句柄,前面我们已经知道Windows Form程序有个属性Handle,这样就可以通过SetParent设置父子窗口关系:SetParent(MainWindowHandle,Handle);设置完父子窗口后再通过MoveWindow(Handle,0,0,父窗口Width,父窗口Heigh)接口设置子窗口位置和大小。

举报

相关推荐

0 条评论