網上有很多部落格介紹使用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