基于VTK的MFC应用程序开发(3)

之前介绍了基于VTK的单文档应用程序开发,并以图像重采样为例,实现了一个简单的图像重采样的应用程序。对于多文档应用程序,与单文档应用程序基本一致,这里就不再讲述。对话框应用程序是MFC应用程序中一个使用非常广泛的框架,本节就以医学图像可视化中常用的四视图框架程序的实现为例,讲述基于VTK的对话框应用程序开发。

1.  利用VS和CMake建立一个空的MFC对话框程序框架。

利用VS创建一个MFC对话框工程vtkDialog,删除其中的工程文件,完成CMakeLists.txt文件,并添加相应的代码文件和链接VTK动态库,利用CMake配置完毕后,打开生成的工程文件vtkDialog.sln,编译执行,即可得到一个空的对话框程序。其中CvtkDialogDlg为该程序的主对话框类。

2.  设计用户界面,添加相应的控件

本程序需要实现的功能有(1)图像读取和管理;(2)图像切分和浏览。一个常见的医学图像可视化程序,包括四个视图,横断面视图,矢状面视图,冠状面视图和三维视图。因此,基于以上设计,我们添加一个树控件,MFC中对应的控件类为CTreeCtrl。树控件是最常用的文件管理控件,能够方便的对文件进行层次化组织和管理。四视图的实现则需要四个控件,这里我们选择CStatic控件,将其添加至对话框窗口中。添加完毕后,为控件生成相应的Control类型的变量。

按照上述设计,需要在CStatic中显示图像。这就需要对CStatic类继续扩展,使其支持VTK可视化管线。一个可行的方法是,设计一个CStatic类的子类,并在该子类中实现VTK可视化管线和处理。

3.  实现VTK图像可视化控件
3.1 首先添加一个MFC类CvtkView

其基类选择为CStatic,并添加至CMakeLists.txt文件中进行管理。

3.2 重载CvtkView类PreSubclassWindow()函数和OnPaint()函数

PreSubclassWindow函数负责创建VTK可视化管线,OnPaint()函数负责客户区内场景渲染。

3.3 建立VTK可视化管线

VTK可视化管线在第二章中已经介绍过,其中最主要包含 vtkAcor,vtkRenderer,vtkRenderWindow,vtkRenderWindowInteractor四个部分。当然根据需要还可以设置vtkRenderWindowInteractorStyle,以及光照,材质,颜色等。在CvtkView类头文件中定义相关对象,并在PreSubclassWindow函数中实例化和构建可视化管线,代码如下。

void CvtkView::PreSubclassWindow()
{
	// TODO: Add your specialized code here and/or call the base class
	CRect rect;
	GetClientRect(rect);

	m_Renderer = vtkSmartPointer<vtkRenderer>::New();
	
	m_RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	m_RenderWindow->SetParentId(this->m_hWnd);
	m_RenderWindow->SetSize(rect.Width(), rect.Height());
	m_RenderWindow->AddRenderer(m_Renderer);

	if(m_RenderWindow->GetInteractor() == NULL)
	{
		vtkSmartPointer<vtkRenderWindowInteractor> RenderWindowInteractor =
			vtkSmartPointer<vtkRenderWindowInteractor>::New();
		RenderWindowInteractor->SetRenderWindow(m_RenderWindow);
		RenderWindowInteractor->Initialize();
	}

	m_RenderWindow->Start();	
	CStatic::PreSubclassWindow();
}


相信通过前面的学习,这里建立可视化管线的流程已经比较熟悉了。需要注意的是,vtkRenderWindow需要通过函数vtkRenderWindow::SetParentId()来建立与控件本身的关联,这样才能将m_RenderWindow中的渲染内容在控件的窗口上进行显示;而vtkRenderWindow::SetSize()则是设置渲染窗口与当前控件客户区保持大小一致。

大家可能会有疑问,怎么没有vtkActor?正常的一个可视化管线中,vtkActor表示需要进行渲染或者绘制的对象。这里需要渲染的对象是图像,而与以前不同的是,没有直接去定义一个图像vtkActor。至于原因暂且不管,随着该类功能的逐步完善,我们再详细说明。VTK渲染管线建立完毕后在OnPaint()函数中调用vtkRenderWindow的Render()函数来实现渲染。

到这里一个基本的VTK显示控件已经实现,在设计界面时,通过MFC自动添加的四个视图变量类型默认为CStatic。由于CvtkView是继承自CStatic,因此我们可以直接将主对话框类CvtkDialogDlg头文件中定义的四个变量类型修改为CvtkView。然后编译运行程序,是不是已经出现了一个四视图的原型了(如下图所示)?由于没有添加任何的渲染对象,因此四个视图均为空的黑色窗口。

3.4 交互式图像切分
  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值