标签:
最近在忙于点云系统的构建,主要结合点云库PCL、可视化库VTK以及图像处理开源库OpenCV来做结合图像和点云数据协同的岩体分析系统。这里希望跟大家分享一下自己的整体构建流程,不足的地方希望大家能够帮忙指出以便改进。由于还在搭建过程中,所以文章的更新时间不一定,但是有关键性的进展一定会写出来讨论,谢谢大家。
整个系统构建的分析过程包括模块划分,模块之间的耦合,数据库构建,相关类的创建、继承等理论细节不在这里讨论。这篇文章先从系统的界面框架开始:
CMenu m_Menu;接着在XXXDlg.cpp文件中找到XXXDlg::OnInitDialog(){},在//TODE下编写代码:
m_Menu.LoadMenu(IDR_MENU1); SetMent(&m_Menu);这样我们的菜单资源就加载好了;
CToolBar m_toolbar; CImageList m_toolbarImg;接着在XXXDlg.cpp下的OnInitDialog(){}中编写代码:
if(!m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC ) ) { TRACE0(_T("创建工具条失败\n")); }
/*指定按钮图标图片*/ m_toolbarImg.Create(16,16,ILC_COLOR16,3,3); m_toolbarImg.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_toolbarImg.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); m_toolbarImg.Add(AfxGetApp()->LoadIcon(IDI_ICON3)); m_toolbar.GetToolBarCtrl().SetImageList(&m_toolbarImg);由于这里使用的图片大小为16*16的,所以需要在Crete方法里加以设置,Create方法最后两个参数可以随便设置。
m_toolbar.SetButtons(NULL,3); m_toolbar.SetButtonInfo(0,IDI_ICON1,TBSTYLE_BUTTON,0); m_toolbar.SetButtonText(0,"功能1"); m_toolbar.SetButtonInfo(1,IDI_ICON2,TBSTYLE_CHECK,1); m_toolbar.SetButtonText(1,"功能2"); m_toolbar.SetButtonInfo(2,IDI_ICON3,TBSTYLE_BUTTON,2); m_toolbar.SetButtonText(2,"功能3"); m_toolbar.SetSizes(CSize(24,24),CSize(16,16)); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); m_ImageList.Detach();我们暂时添加3个按钮,所以第一行为3,第二行的setButtonInfo表示开始添加工具,里面 有4个参数,第一个参数表示工具按钮的id号,0表示第一个;第二个参数是图标的ID号;第三个参数是工具的样式,这里为按钮所以设置为TBSTYLE_BUTTON,当然也可以设置为TBSTYLE_CHECK表示单选check控件;最后一个为CImageList里对应的图片id号,第一个从0开始。之后设置按钮的鼠标提示文本。
hIcon[0] = theApp.LoadIcon(IDI_ICON1); hIcon[1] = theApp.LoadIcon(IDI_ICON2); hIcon[2] = theApp.LoadIcon(IDI_ICON3); m_ImageList.Create(16,16,ILC_COLOR16,3,3); for(int i = 0 ;i < 3;i++) { m_ImageList.Add(hIcon[i]); } m_Tree.SetImageList(&m_ImageList,TVSIL_NORMAL);
/*建立第一个节点树*/ hRoot = m_Tree.InsertItem(_T("根节点1"),0,0); hCataItem = m_Tree.InsertItem(_T("节点1"),1,1,hRoot,TVI_LAST); m_Tree.SetItemData(hCataItem,1); hArtItem = m_Tree.InsertItem(_T("子节点1"),2,2,hCataItem,TVI_LAST); hArtItem = m_Tree.InsertItem(_T("子节点2"),2,2,hCataItem,TVI_LAST); *建立第二个节点树*/ hRoot = m_Tree.InsertItem(_T("根节点2"),0,0); hCataItem = m_Tree.InsertItem(_T("节点1"),1,1,hRoot,TVI_LAST); m_Tree.SetItemData(hCataItem,1); hArtItem = m_Tree.InsertItem(_T("子节点1"),2,2,hCataItem,TVI_LAST); hArtItem = m_Tree.InsertItem(_T("子节点2"),2,2,hCataItem,TVI_LAST);
CPropertyPage m_page1; CPropertyPage m_page2; CPropertyPage m_page3; CPropertySheet m_pagesheet;
m_page1.Construct(IDD_PROPPAGE_LARGE); m_page2.Construct(IDD_PROPPAGE_LARGE1); m_page3.Construct(IDD_PROPPAGE_LARGE2); m_pagesheet.Construct("property pages",this); m_pagesheet.AddPage(&m_page1); m_pagesheet.AddPage(&m_page2); m_pagesheet.AddPage(&m_page3); m_pagesheet.Create(this,WS_CHILD|WS_VISIBLE);
CRect rc; GetDlgItem(IDC_STATIC_PROPERTY)->GetWindowRect(&rc); m_pagesheet.SetWindowPos(&wndTop,rc.left-10,rc.top-25,rc.right,rc.bottom,NULL);这里有个问题,就是我直接获取rc的left和top,为什么不能完全叠加到static控件上,总是会有偏移,所以这里我就自己设置了偏移量好吻合上去,可是这样好麻烦...求解答。
CPagePic m_pagepicture; CPageView m_pageviewer;
CRect r; m_tab.InsertItem(1,_T("可视化")); m_tab.InsertItem(2,_T("影像")); m_pageviewer.Create(IDD_DIALOG_View,&m_tab);//加载对话框并管理到tab控件 m_pagepicture.Create(IDD_DIALOG_PICTURE,&m_tab); m_tab.GetClientRect(&r); m_pageviewer.SetWindowPos(NULL,r.left+1,r.top+1,r.right-1,r.bottom-25,SWP_SHOWWINDOW);//设置显示位置 m_pagepicture.SetWindowPos(NULL,r.left+1,r.top+1,r.right-1,r.bottom-25,SWP_HIDEWINDOW);
CRect rect; m_tab.GetClientRect(&rect); switch(m_tab.GetCurSel()) { case 0: m_pageviewer.SetWindowPos(NULL,rect.left+1,rect.top+1,rect.right-1,rect.bottom-25,SWP_SHOWWINDOW); m_pagepicture.SetWindowPos(NULL,rect.left+1,rect.top+1,rect.right-1,rect.bottom-25,SWP_HIDEWINDOW); break; case 1: m_pageviewer.SetWindowPos(NULL,rect.left+1,rect.top+1,rect.right-1,rect.bottom-25,SWP_HIDEWINDOW); m_pagepicture.SetWindowPos(NULL,rect.left+1,rect.top+1,rect.right-1,rect.bottom-25,SWP_SHOWWINDOW); break; } *pResult = 0;第六、设置好了之后如果我们想设置VTK的显示该怎么办呢?我们可以调用VTK的vtkRenderWindow对象的SetParetId方法来设置,获取tab控件下的pageviewer对象,得到其内部的static控件的句柄。
renwin->SetParentId(m_pageviewer.GetDlgItem(IDC_STATIC_VTK)->m_hWnd); CRect rect; m_pageviewer.GetDlgItem(IDC_STATIC_VTK)->GetWindowRect(&rect); renwin->SetSize(rect.Width(),rect.Height()); iren->SetRenderWindow(renwin); iren->Initialize(); renwin->Render(); iren->Start();第七、请包含所有需要的相关头文件。
基于MFC 对话框的 PCL、VTK 、OPENCV岩体识别系统构建(1)
标签:
原文地址:http://blog.csdn.net/sjm19901003/article/details/44994249