天天看點

使用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

繼續閱讀