使用Halcon库,在MFC界面打开显示图片,可实现多次打开不同图片

754 阅读1分钟

网上有很多博客介绍使用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界面打开显示图片,可实现多次打开不同图片》

libaineu2004.blog.csdn.net/article/det…