网上有很多博客介绍使用Halcon库,在MFC界面打开显示图片。图片显示在静态图片控件,STATIC PICTURE CTRL。
但是网上的案例都没有实现多次点击"打开"按钮,使得可以在PIC控件里显示不同的图片;即,打开一张图片可以显示在PIC控件,再打开第二张图片时,PIC控件没有刷新,还是显示第一张图。
这里笔者分享一下自己的方法,我和他们的不同之处在于实现了C++异常处理和连续打开并显示不同的图片:
//构造文件对话框对象 CFileDialog readfileDlg(TRUE, NULL, NULL, 0, _T("图像文件(*.bmp)|*.bmp||"), this); if (IDOK == readfileDlg.DoModal()) { m_strPathTemplateOk = readfileDlg.GetPathName(); //声明标识,函数T2A和W2A均支持ATL和MFC中的字符 USES_CONVERSION; std::string s(W2A(m_strPathTemplateOk)); const char *filename = s.c_str(); try { ReadImage(&m_ImageOK, filename);//文件如果不存在会抛出异常 } catch (HException* e)//很奇怪,这里捕获不到 { UNUSED_PARAMETER(e); return FALSE; } catch (...)//能处理任何异常的代码 { return FALSE; } if (!m_ImageOK.IsInitialized()) { return FALSE; } HTuple width, height; GetImageSize(m_ImageOK, &width, &height); CRect rect; HWND hImgWnd = GetDlgItem(IDC_STATIC_PIC_TEMPLATE)->m_hWnd; GetDlgItem(IDC_STATIC_PIC_TEMPLATE)->GetClientRect(&rect); if (HDevWindowStack::IsOpen()) { close_window(HDevWindowStack::Pop());//这段话很重要,否则无法连续打开图像显示,仅仅固定显示第一幅图 } HTuple hv_WindowHandle; OpenWindow(rect.left, rect.top, rect.Width(), rect.Height(), (Hlong)hImgWnd, "visible", "", &hv_WindowHandle); HDevWindowStack::Push(hv_WindowHandle);//这段话很重要,否则无法连续打开图像显示,仅仅固定显示第一幅图 SetPart(hv_WindowHandle, 0, 0, height, width);//设置显示的图像范围 DispObj(m_ImageOK, hv_WindowHandle); }
不需要依赖动态库文件hcanvas.dll,只需要halcon.dll和halconcpp.dll这两个即可。
---
姊妹篇:
《使用Halcon库,在Qt界面打开显示图片,可实现多次打开不同图片》
https://libaineu2004.blog.csdn.net/article/details/113925024