天天看点

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

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

继续阅读