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

这里我们用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画出的图像


我用了十五年,帮那时候我最喜欢的女生追回了她的丈夫……

时间: 2024-09-20 04:19:56

VTK+MFC:建立自定义控件显示的相关文章

mfc windows编程-怎么才可以让mfc框架中显示出图片

问题描述 怎么才可以让mfc框架中显示出图片 如图所示,我看视频学的,写的也和视频中一样,可为什么图片总是显示不出来,是因为m_img没有赋值成功么,希望大神们指导,最好能写下源码.对了,我建立mfc.exe时,里面的什么头文件啊什么的,就加了一个Gdiplus.h,其他的什么定义也没动,只是加了一些东西,求教多谢各位大神 解决方案 http://blog.csdn.net/friendan/article/details/38358507http://blog.csdn.net/liu_che

界面-如何使打开的其他程序或者文档在MFC窗口中显示,而不是新打开一个窗口

问题描述 如何使打开的其他程序或者文档在MFC窗口中显示,而不是新打开一个窗口 我想在程序界面中指定一个区域,用于显示被打开的其他程序或者文档的界面.可是我用ShellExecute函数打开指定的那个文档和程序的时候,总是会再启动另一个窗口,效果就像是直接点击打开那个文件一样. 解决方案 将mfc窗口设置为其它程序的父窗口 解决方案二: 参考:程序只允许打开唯一实例且所有关联文档都在同一实例内打开的一揽子解决办法http://blog.csdn.net/IfI/article/details/1

mfc-新手求救MFC建立公有函数添加不了

问题描述 新手求救MFC建立公有函数添加不了 添加方法"公有函数void GetLogicalDrives(HTREEITEM hParent).,在类向导里怎么也添加不起 解决方案 怎么会,再不行,你直接双击打开类定义文件,手工添加下看看是否可以.这种不是消息映射的函数也可以不通过类向导自己写. 解决方案二: h文件中定义,然后添加函数.就可以使用了. 解决方案三: vs2008 MFC中如何添加和删除消息函数? 解决方案四: 怎么会,实在不行自己手动在头文件里定义,在源文件里实现.

初始化-MFC 利用opencv显示图片,需要在窗体完成哪一步后才可以

问题描述 MFC 利用opencv显示图片,需要在窗体完成哪一步后才可以 对对话框创建流程不是太清楚. 下面代码只能通过按钮点击响应才可以,但直接放在对话框初始化以及onsize里面就不行. cv::Mat mat, mat2; mat = cv::imread("D:\test1.jpg", 1); if(! mat.data) { MessageBox(_T("error", "no image loaded!"), MB_OK); retu

mfc-VC++,MFC边框框显示文字的问题

问题描述 VC++,MFC边框框显示文字的问题 图片说明我想让编辑框中的插入符在我输入数字的时候一直显示在最右边,该怎么设置呢?请大神指导下,谢谢啦 解决方案 设置ES_RIGHT风格就可以了.https://msdn.microsoft.com/en-us/library/bb775464(VS.85).aspxhttp://www.doc88.com/p-9179977759233.html 解决方案二: 通过SetCursor来设置

repositionbars的作用-MFC全屏显示代码的解释?

问题描述 MFC全屏显示代码的解释? void CMainFrame::OnFullScreen() { CRect WindowRect; GetWindowRect(&WindowRect); CRect ClientRect; RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect); ClientToScreen(&ClientRect); //获取屏幕的分辨率 int nFullWidth=Get

【数字图像处理】一.MFC详解显示BMP格式图片

本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,故称位图(bitmap),其扩展名为BMP.BMP图像通常有4个部分组成:位图文件头.位图信息头.颜色表.位图数据.如下图所示: 第一部分为位图文件

在MFC程序中显示 JPG/GIF图像

如果你是一个使用VB编程的程序员,要在程序中显示JPG或者GIF图像简直易如反掌,将图像控件拖到Form中,分分钟即可搞掂.但是C++程序员要显  示同样的图形却没有那么轻松,那么是不是要自己编写JPG解压缩代码呢?当然不用那么复杂啦!本文将针对这个问题讨论如何在MFC中显示JPG或者GIF 图像. 用VB写图像显示程序之所以如此轻松,完全是利用了琳琅满目的图像处理控件,把你想要做的事情都一一搞掂.而C++程序员为了实现相同的功能必须忙 乎半 天.其实,C/C++程序员也能使用那些VB程序员所用

mfc surface 图片显示-mfc 用SURFACE的blit显示图片

问题描述 mfc 用SURFACE的blit显示图片 void CView::OnDraw(SURFACE* psurfTarget){ //简略片段 希望大家能够看懂 m_ImageCenter.Load(""center.psd""); m_ImageCenter.DrawImage(m_ImagePanal(width-m_ImageCenter.GetWidth())/2(height- m_ImageCenter.GetHeight())/2);} cla