网上有很多博客介绍使用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);
}