如何在MFC CStatic控件中正确集成PCL Visualizer?
PCL Visualizer嵌入MFC CStatic控件的规范解决方案
问题说明
将PCL Visualizer嵌入MFC的CStatic控件时,出现子窗口标题栏可见且可拖动的问题。调用viewer->setWindowBorders(false)无法解决,使用viewer->setPosition(-10, -50)的隐藏方式属于不规范的临时方案,需要更合理的集成方法。
初始问题代码
pcl::visualization::PCLVisualizer::Ptr simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud , HWND hParent_display ) { // -------------------------------------------- // -----Open 3D viewer and add point cloud----- // -------------------------------------------- pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); if (hParent_display) { SetParent((HWND)viewer->getRenderWindow()->GetGenericWindowId(), hParent_display); viewer->setWindowBorders(false); viewer->getRenderWindow()->SetParentId(hParent_display); //viewer->setPosition(-10, -50); // 不规范的边框隐藏方式 viewer->setBackgroundColor(0, 0, 0); viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); viewer->addCoordinateSystem(1.0); viewer->initCameraParameters(); } return (viewer); }
调用代码:
viewer = simpleVis(basic_cloud_ptr , GetDlgItem(IDC_STATIC_3D_VIWER)->m_hWnd);
规范可行代码
通过修改窗口样式和布局参数,彻底解决标题栏和边框问题:
pcl::visualization::PCLVisualizer::Ptr simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud , HWND hParent_display ,int width , int height) { // -------------------------------------------- // -----Open 3D viewer and add point cloud----- // -------------------------------------------- pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); if (hParent_display) { viewer->setWindowBorders(false); //viewer->getRenderWindow()->SetParentId(hParent_display); SetParent((HWND)viewer->getRenderWindow()->GetGenericWindowId(), hParent_display); SetWindowLongPtr((HWND)viewer->getRenderWindow()->GetGenericWindowId(), GWL_STYLE, WS_POPUP); SetWindowPos((HWND)viewer->getRenderWindow()->GetGenericWindowId(), HWND_TOPMOST, 0, 0, width, height, SWP_SHOWWINDOW); ShowWindow((HWND)viewer->getRenderWindow()->GetGenericWindowId(), SW_SHOW); viewer->setBackgroundColor(0, 0, 0); //viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud"); //viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); viewer->addCoordinateSystem(1.0); viewer->initCameraParameters(); } return (viewer); }
核心改进点
- 通过
SetWindowLongPtr将渲染窗口样式设置为WS_POPUP,该样式下窗口无标题栏和边框,完全适配父控件区域 - 使用
SetWindowPos精确控制子窗口在父控件内的位置与尺寸,确保填满CStatic控件 - 保留
viewer->setWindowBorders(false)作为辅助设置,配合窗口样式修改彻底消除边框问题
内容的提问来源于stack exchange,提问作者Ziri
相关产品推荐
相关产品推荐

