VTK使用改进
利用VTK库开发基于MFC的应用程序
在用VTK库时,感觉很难开发出MFC的应用程序,VTK提供的vtkMFCWindow类封装的太死,在参考vtkMFCWindow类的实现方式后,通过改造单文档应用程序中的View类,直接在View类中就能响应MFC消息,同时又能利用VTK库本身的东西。在我的例子中,能打开VTK格式文件,同时能用鼠标进行移动旋转,缩放等操作,而且响应右键菜单,插入一个3ds文件。
主要修改地方:
在HBVRView.h中增加成员变量和函数:
public:
vtkRenderer* GetRenderer() { ASSERT(m_pRenderer); return m_pRenderer; }
vtkWin32OpenGLRenderWindow* GetRenderWindow(){return m_pRenderWindow;}
vtkRenderWindowInteractor* GetInteractor();
protected:
vtkRenderer *m_pRenderer;
vtkWin32OpenGLRenderWindow* m_pRenderWindow;
void SetRenderWindow(vtkWin32OpenGLRenderWindow* win);
vtkRenderer* GetRenderer() { ASSERT(m_pRenderer); return m_pRenderer; }
vtkWin32OpenGLRenderWindow* GetRenderWindow(){return m_pRenderWindow;}
vtkRenderWindowInteractor* GetInteractor();
protected:
vtkRenderer *m_pRenderer;
vtkWin32OpenGLRenderWindow* m_pRenderWindow;
void SetRenderWindow(vtkWin32OpenGLRenderWindow* win);
同时添加所有与鼠标有关的消息响应函数。
在HBVRView.cpp中做如下修改:
BOOL CHBVRView::PreCreateWindow(CREATESTRUCT& cs)
{
//设置窗口类型,OpenGL窗口需要这样的设置
cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
int CHBVRView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建OpenGL窗口
vtkWin32OpenGLRenderWindow* win = vtkWin32OpenGLRenderWindow::New();
SetRenderWindow(win);
win->Delete();
m_pRenderWindow->AddRenderer(m_pRenderer);
return 0;
}
// 左键操作采用默认操作方式
void CHBVRView::OnLButtonDown(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnLButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0);
}
// 右键自己处理,弹出菜单,用来导入3ds文件。
void CHBVRView::OnRButtonUp(UINT nFlags, CPoint point)
{
ClientToScreen(&point);
CMenu menu, *pSubMenu = NULL;
if (menu.LoadMenu(IDR_VIEW_POPUP))
{
pSubMenu = (CMenu *)menu.GetSubMenu(0);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, GetParent());
menu.DestroyMenu();
}
}
{
//设置窗口类型,OpenGL窗口需要这样的设置
cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
int CHBVRView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建OpenGL窗口
vtkWin32OpenGLRenderWindow* win = vtkWin32OpenGLRenderWindow::New();
SetRenderWindow(win);
win->Delete();
m_pRenderWindow->AddRenderer(m_pRenderer);
return 0;
}
// 左键操作采用默认操作方式
void CHBVRView::OnLButtonDown(UINT nFlags, CPoint point)
{
static_cast<vtkWin32RenderWindowInteractor*>(this->GetInteractor())->
OnLButtonDown(this->GetSafeHwnd(), nFlags, point.x, point.y, 0);
}
// 右键自己处理,弹出菜单,用来导入3ds文件。
void CHBVRView::OnRButtonUp(UINT nFlags, CPoint point)
{
ClientToScreen(&point);
CMenu menu, *pSubMenu = NULL;
if (menu.LoadMenu(IDR_VIEW_POPUP))
{
pSubMenu = (CMenu *)menu.GetSubMenu(0);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, GetParent());
menu.DestroyMenu();
}
}