VTK嵌入MFC同步显示
使用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>
// CVtkView class 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" // CVtkView IMPLEMENT_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同步显示的更多相关文章
- VTK:VTK嵌入MFC成功
VTK作为医学显示库,得到较多使用.作为较为上层的设计,对OpenGL进行了封装,并且有Windows.Linux.安卓等开发版本,可移植性较强. 不过VES暂时没有编译成功. 以下是嵌入MFC-ID ...
- SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片
为了保持通讯信息的一致性,需要设置SharePoint,Exchange, Lync等信息同步更新显示,例如,员工头像信息. 本文介绍如何在SharePoint 2013中同步显示Active Dir ...
- MFC对话框显示BMP图片
1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...
- asp.net MVC SignalR 与数据库 实时同步显示
asp.net MVC SignalR 与数据库 实时同步显示 错误:未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 ...
- 在MFC[转载]在MFC状态栏显示时间 状态栏显示时间
原文:在MFC状态栏显示时间,谢小哈皮儿 c/c++ vc 在mfc状态栏显示时间,在VC的控件中有个Status bar可以在窗体状态栏中添加日期和时间.其实通过简单的代码,你就能创建一个有时钟显示 ...
- Android(java)学习笔记138:html嵌入到java显示乱码
解决方案: 使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings().setDefaultTextEnc ...
- JS中同步显示并分割输入的数字字符串
题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图 ...
- Android 小技巧-- TextView与EditText 同步显示
方法一.利用View.OnKeyListener"同步"显示 EditText myEdit = (EditText)findViewById(R.id.myEdit); Tex ...
- Android(java)学习笔记80:Html嵌入到Java显示乱码
1. Html嵌入到Java显示乱码: 解决方案: 使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings ...
随机推荐
- 并发通信Manage,队列, 互斥锁
目录 Manage 队列 先入先出 互斥锁 Manage 进程间的通信是被限制的 from multiprocessing import Process a = 1 def func(): glob ...
- toj 1421
题意:假如存在矩阵A,A[i][0] + A[i][1] + ...... + A[i][n - 1] == SR[i],A[0][j] + A[1][j] + ...... + A[n - 1][j ...
- 关于linux中使用vim打开文件出现^M的解决方法
在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...
- centos7.0_redhat7.0安装vncserver和Desktop桌面
http://blog.51cto.com/gushiren/1681616 https://blog.csdn.net/techsupporter/article/details/50628399
- iOS的四种传值方式
传值有四种方法 : 1. 属性传值 2. 单例传值 3. 代理传值 4. block传值 一.属性传值 (前-->后) 1. 后面的界面定义一个属性 存放前一个界面传过来的值 ...
- 怎样跟程序猿谈一场没有Bug的恋爱
<iframe width="580" height="90" align="center,center" id="cpro ...
- 我们的一个已投产项目的高可用数据库实战 - mongo 副本集的搭建具体过程
我们的 mongo 副本集有三台 mongo 服务器:一台主库两台从库. 主库进行写操作,两台从库进行读操作(至于某次读操作到底路由给了哪台,仲裁决定).实现了读写分离.这还不止,假设主库宕掉,还能实 ...
- 王立平--java se的简单项目创建以及具体解释
创建项目的简单步骤: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2T/fontsize/400/ ...
- C++高精度性能測试函数
在实际software开发工作中.我们常常会測试某个module或者function的执行效率.或者是某个算法的时间复杂度(尽管时间复杂度一定程度上依赖于机器性能.但在同一台computer上,经过算 ...
- HTML网页之计算器代码
计算器网页效果显示:点击这里! <script> function show(){ var date = new Date(); //日期对象 var now = "&qu ...