VTK+MFC:建立自定义控件显示

    xiaoxiao2026-04-15  3

    这里我们用MFC框架来做VTK的界面 VTK比较蛋疼的是不能像图片一样直接在MFC的picture控件中显示,需要自己添加自定义控件来显示画出的模型, 1.首先新建一个类如MyCustomControl Ctrl+W打开建立类向导界面,选择Add Class->new 名字填写如MyCustomControl Base class选择generic CWnd 2.在MyCustomControl.cpp文件中添加如下代码: 注册代码:

    BOOL MyCustomControl::RegisterWndClass() { WNDCLASS windowclass; HINSTANCE hInst = AfxGetInstanceHandle(); //Check weather the class is registerd already if (!(::GetClassInfo(hInst, MYWNDCLASS, &windowclass))) { //If not then we have to register the new class windowclass.style = CS_DBLCLKS;// | CS_HREDRAW | CS_VREDRAW; windowclass.lpfnWndProc = ::DefWindowProc; windowclass.cbClsExtra = windowclass.cbWndExtra = 0; windowclass.hInstance = hInst; windowclass.hIcon = NULL; windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW); windowclass.hbrBackground = ::GetSysColorBrush(COLOR_WINDOW); windowclass.lpszMenuName = NULL; windowclass.lpszClassName = MYWNDCLASS; if (!AfxRegisterClass(&windowclass)) { AfxThrowResourceException(); return FALSE; } } return TRUE; }

    在构造函数中添加:

    RegisterWndClass();

    添加响应函数:

    void MyCustomControl::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(flag==FALSE) { oldpt=point; flag=TRUE; } CWnd::OnLButtonDown(nFlags, point); } void MyCustomControl::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default flag=FALSE; CWnd::OnLButtonUp(nFlags, point); } void MyCustomControl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(flag==TRUE) { CDC *d=GetDC(); d->MoveTo(oldpt); d->LineTo(point); oldpt=point; ReleaseDC(d); } CWnd::OnMouseMove(nFlags, point); }

    这几个分别是控制右键按下时vtk画出来的模型的放大缩小,左键按下时vtk模型的旋转,鼠标在自定义控件窗口的移动 再在BEGIN_MESSAGE_MAP(MyCustomControl, CWnd)添加 ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() 2.右键点击添加自定义控件在种类中命名如MyDrawPad 3.在MyCustomControl.hpp文件中添加声明等 在文件开头添加:

    #define MYWNDCLASS "MyDrawPad"

    在public中添加:

    MyCustomControl(); BOOL SetBitmap(UINT nIDResource);

    在protect中修改(添加一些消息相应):

    //{{AFX_MSG(MyCustomControl) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG

    在private中添加:

    private: CDC cDC; BOOL RegisterWndClass(); CPoint oldpt; BOOL flag;

    4.在Dlg.cpp中为自定义空键添加变量: 在::DoDataExchange(CDataExchange* pDX)中添加 DDX_Control(pDX,IDC_moxing,m_drawpad1); 5.在Dlh.h中添加头文件: #include “MyCustomControl.h” 在protected中添加变量: MyCustomControl m_drawpad1; 6.在vtk要显示的时候加上获取窗口的代码:

    vtkRenderer *ren = vtkRenderer::New(); ren->SetBackground(1.0, 1.0, 1.0); vtkRenderWindow *renWindow = vtkRenderWindow::New(); renWindow->AddRenderer(ren); //renWindow->SetSize( 200, 200 ); CRect rect; GetClientRect(&rect); m_drawpad1.GetClientRect(&rect); renWindow->SetParentId(m_drawpad1.m_hWnd); renWindow->SetSize(rect.Width(),rect.Height());

    之后可以在mfc框架下显示vtk画出的图像 我用了十五年,帮那时候我最喜欢的女生追回了她的丈夫……

    相关资源:MFC 中实现VTK
    最新回复(0)