使用VTK嵌入MFC,实现四视图更新,机制和细节参考原文。

原文链接:http://blog.csdn.net/www_doling_net/article/details/8939115

原文代码:

#pragma once#include <vtkResliceCursor.h>
#include <vtkResliceCursorWidget.h>#include <vtkPlane.h>
#include <vtkPlaneSource.h>
#include <vtkPlaneWidget.h>#include <vtkImagePlaneWidget.h>
#include <vtkResliceCursorThickLineRepresentation.h>
#include <vtkResliceCursor.h>#include <vtkCommand.h>
#include <vtkViewport.h>
#include <vtkViewDependentErrorMetric.h>#include <vtkSmartPointer.h>#include <vtkRenderer.h>
#include <vtkRendererSource.h>
#include <vtkRenderingOpenGLModule.h>
#include <vtkRenderWindow.h>
#include <vtkWin32OpenGLRenderWindow.h>
#include <vtkWin32RenderWindowInteractor.h>
// CVtkViewclass CVtkView : public CStatic
{DECLARE_DYNAMIC(CVtkView)public:CVtkView();virtual ~CVtkView();public://3.2 重载CvtkView类PreSubclassWindow()函数和OnPaint()函数//PreSubclassWindow函数负责创建VTK可视化管线,OnPaint()函数负责客户区内场景渲染。//vtkAcor,vtkRenderer,vtkRenderWindow,vtkRenderWindowInteractor四个部分。当然根据需要还可以设置vtkRenderWindowInteractorStyle,以及光照,材质,颜色等。//在CvtkView类头文件中定义相关对象,并在PreSubclassWindow函数中实例化和构建可视化管线void PreSubclassWindow();void SetImageData(vtkSmartPointer<vtkImageData> ImageData);void SetupReslice();private:vtkSmartPointer< vtkImagePlaneWidget >   m_ImagePlaneWidget;vtkSmartPointer< vtkResliceCursorWidget> m_ResliceCursorWidget;vtkSmartPointer< vtkResliceCursor >      m_ResliceCursor;vtkSmartPointer< vtkResliceCursorThickLineRepresentation > m_ResliceCursorRep;vtkSmartPointer<vtkRenderer>         m_Renderer;vtkSmartPointer<vtkRenderWindow> m_RenderWindow;vtkSmartPointer<vtkImageData>       m_ImageData;//m_Direction为方向标志,取值分别为0,1和2,分别代表X轴,Y轴和Z轴方向,int m_Direction;protected:DECLARE_MESSAGE_MAP()
};

原代码:

// VtkView.cpp : implementation file
//#include "stdafx.h"
#include "iisu2vrMfcs.h"
#include "VtkView.h"// CVtkViewIMPLEMENT_DYNAMIC(CVtkView, CStatic)CVtkView::CVtkView()
{//在实例化时需要注意,该视图类在默认情况下渲染的是vtkResliceCursorWidget对象的输出,//因此需要为vtkResliceCursorWidget对象指定相应的vtkRenderer对象,//m_ResliceCursorWidget->SetInteractor(m_RenderWindow->GetInteractor());//m_ResliceCursorWidget->SetDefaultRenderer(m_Renderer);
}CVtkView::~CVtkView()
{
}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();
}void CVtkView::SetImageData(vtkSmartPointer<vtkImageData> ImageData)
{if (ImageData == NULL) return;m_ImageData = ImageData;SetupReslice();
}
void CVtkView::SetupReslice()
{if (m_ImageData == NULL) return;int dims[3];m_ImageData->GetDimensions(dims);//  m_ImagePlaneWidget->SetInputData(m_ImageData);m_ImagePlaneWidget->SetPlaneOrientation(m_Direction);m_ImagePlaneWidget->SetSliceIndex(dims[m_Direction] / 2);m_ImagePlaneWidget->On();m_ImagePlaneWidget->InteractionOn();//  m_ResliceCursor->SetCenter(m_ImageData->GetCenter());m_ResliceCursor->SetImage(m_ImageData);m_ResliceCursor->SetThickMode(0);//m_ResliceCursorRep->GetResliceCursorActor()->GetCursorAlgorithm()->SetResliceCursor(m_ResliceCursor);//m_ResliceCursorRep->GetResliceCursorActor()->GetCursorAlgorithm()->SetReslicePlaneNormal(m_Direction);m_ResliceCursorWidget->SetEnabled(1);m_Renderer->ResetCamera();//  double range[2];m_ImageData->GetScalarRange(range);m_ResliceCursorWidget->GetResliceCursorRepresentation()->SetWindowLevel(range[1] - range[0], (range[0] + range[1]) / 2.0);m_ImagePlaneWidget->SetWindowLevel(range[1] - range[0], (range[0] + range[1]) / 2.0);
}BEGIN_MESSAGE_MAP(CVtkView, CStatic)
END_MESSAGE_MAP()

添加类成员:

public:afx_msg void OnBnClickedButtonViewshow();//CStatic m_ShowLU;//CStatic m_ShowRU;//CStatic m_ShowLD;//CStatic m_ShowRD;CVtkView m_ShowLU;CVtkView m_ShowRU;CVtkView m_ShowLD;CVtkView m_ShowRD;CVtkView m_AxialView;CVtkView m_SagittalView;CVtkView m_CoronalView;CVtkView m_3DView;

四视图更新代码:

//当用户改变图像切分的坐标轴时(旋转坐标轴或者平移坐标系),图像切分平面会产生相应的改变,
//如果将新的切分平面更新到二维视图的vtkImagePlaneWidget对象中,即可实现三维视图的同步更新操作。
///基于以上设计,实现一个vtkCommand子类,来监听vtkResliceCursorWidget::ResliceAxesChangedEvent消息,并实现相应的更新操作。
class vtkResliceCursorCallback : public vtkCommand
{
public:static vtkResliceCursorCallback *New(){return new vtkResliceCursorCallback;}CVtkView* view[4];public:void Execute(vtkObject *caller, unsigned long /*ev*/,void *callData){vtkResliceCursorWidget *rcw = dynamic_cast<vtkResliceCursorWidget *>(caller);if (rcw){for (int i = 0; i < 3; i++){vtkPlaneSource *ps =static_cast<vtkPlaneSource *>(view[i]->GetImagePlaneWidget()->GetPolyDataAlgorithm());ps->SetOrigin(view[i]->GetResliceCursorWidget()->GetResliceCursorRepresentation()->GetPlaneSource()->GetOrigin());ps->SetPoint1(view[i]->GetResliceCursorWidget()->GetResliceCursorRepresentation()->GetPlaneSource()->GetPoint1());ps->SetPoint2(view[i]->GetResliceCursorWidget()->GetResliceCursorRepresentation()->GetPlaneSource()->GetPoint2());view[i]->GetImagePlaneWidget()->UpdatePlacement();view[i]->Render();}view[3]->Render();}}vtkResliceCursorCallback() {}};

最终效果图:

VTK嵌入MFC同步显示相关推荐

  1. VTK:VTK嵌入MFC成功

    VTK作为医学显示库,得到较多使用.作为较为上层的设计,对OpenGL进行了封装,并且有Windows.Linux.安卓等开发版本,可移植性较强. 不过VES暂时没有编译成功. 以下是嵌入MFC-ID ...

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

    基于VTK的MFC应用程序开发(3) 分类: VTK应用示例 2013-05-17 13:37 3307人阅读 评论(23) 收藏 举报 目录(?)[+] 之前介绍了基于VTK的单文档应用程序开发,并 ...

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

    基于VTK的MFC应用程序开发(2) 分类: VTK应用示例 2013-03-29 13:03 6647人阅读 评论(18) 收藏 举报 MFCVTK图像重采样 目录(?)[+] 现在基于VTK的MF ...

  4. 基于VTK的MFC应用程序开发(1)

    基于VTK的MFC应用程序开发(1) 分类: VTK应用示例 2013-03-24 22:35 4195人阅读 评论(28) 收藏 举报 CMakeVTKMFC 目录(?)[+] 提到MFC一般都不陌 ...

  5. mfc嵌入matlab绘图窗口,将matlab的图嵌入MFC

    [实例简介] VS调用matlab画图模块编译成的动态链接库,并在MFC显示. [实例截图] [核心代码] 3b0582a3-4ea8-4a61-ba33-e448be563b88 └── 将matl ...

  6. ogre嵌入MFC教程

    由于实验室项目的需要,要学习ogre嵌入MFC,在这里把我从小白到实现的过程写下来给大家分享. 首先声明一下,在这里我建的是基于单文档的ogre嵌入MFC,多文档的并没有研究,后面有时间实现了再拿来分 ...

  7. 调用opencv3.x 库,在MFC中显示图片

    调用opencv3.x 库,在MFC中显示图片 使用opencv和MFC显示图片的方法大致分为以下几种: 1:将opencv的显示对话框嵌入到MFC窗口. 2:使用CvvImage类显示图片. 3:将 ...

  8. Android -- TextView与EditText 同步显示

    Android -- TextView与EditText 同步显示 文章分类:JavaEye 方法一.利用View.OnKeyListener"同步"显示         Java ...

  9. Linux如何在任务栏显示时间,在MFC[转载]在MFC状态栏显示时间 状态栏显示时间

    c/c++ vc 在mfc状态栏显示时间,在VC的控件中有个Status bar可以在窗体状态栏中添加日期和时间.其实通过简单的代码,你就能创建一个有时钟显示的状态栏,并且还能设置时钟栏的显示方式.举 ...

最新文章

  1. 一个狠招|如何高效学习3D视觉
  2. Unity扩展编辑器二
  3. java 写入指定路径文件_java对指定目录下文件读写操作介绍 | 学步园
  4. pandas 替换 某列大于_Pandas简单入门 1
  5. shell实现https登录
  6. RDS SQL Server死锁(Deadlock)系列之四利用Service Broker事件通知捕获死锁
  7. ajax请求队列,使AJAX队列稍后解析请求
  8. docker 安装 oracle
  9. multisim 10 小知识
  10. 计算机控制液压同步顶升系统,PLC四点多点同步顶升系统,同步液压顶升系统
  11. AI 仿人类人工智能(超级智能)的本质
  12. 程序员用简单C语言一顿神操作,瞬间打造植物大战僵尸,无人不服
  13. 制作人 Joe Carrell 教你充分释放TB12音色野兽
  14. duilib设置透明窗口_使用duilib开发半透明异形窗体程序(补充)
  15. อยากจะร่ำรวยเล่น แทงบอลออนไลน์
  16. MySQL 不等于的三种表示及区别
  17. 论剑江湖服务器维护,《论剑:江湖》老玩家谈前期流程攻略
  18. MATLAB仿真节点个数和节点通信半径与网络连通率的关系,WSN实验
  19. 数据恢复 diskginus
  20. PLC通过伯努利方程近似计算水箱流量(FC)

热门文章

  1. Fis3的前端工程化之路[三大特性篇之资源定位]
  2. 金蝶BOS开发中Edit编辑界面和List叙事薄界面需要写的代码
  3. 《小马哥Spring Cloud系列》十五:分布式应用追踪-视频笔记
  4. nginx 内置变量
  5. 获取自定义data的几种属性
  6. cordova插件开发
  7. learn_Day14 内置函数补充、反射、初识面向对象
  8. linux命令crontab
  9. Android Studio解决未识别Java文件(出现红J)问题
  10. 围住浮动元素(消除浮动)的三种方法