前面帖子介绍了halcon与C#的联合编程, 
这里继续介绍halcon与MFC也就是C++的联合编程。 
同样,首先也是在halcon编写代码,好后进行导出, 
我们以例程distance_lr为例,打开此例程后, 
在halcon菜单栏:文件->导出,弹出的窗口选择导出类型与导出位置 
halcon与MFC联合编程 
 
 
我们当前导出保存在桌面,所以在桌面生成了一文件distance_lr.cpp 
 
1.新建MFC与界面准备 
首先新建一MFC工程,基于对话框的。 
添加一图像控件,设为矩形类型,用于显示图片,也可以自己添加其他控件。 
添加一按钮,用于执行HALCON代码,双击添加其点击函数 
效果如图 
halcon与MFC联合编程 
 
 
2.在MFC中配制halcon 
当前系统为WIN10 ,64位,安装了halcon17.12,64位, 
安装于D:\Program Files\MVTec\HALCON-17.12-Progress 
在MFC中必须包含HALCON两处头文件目录: 
D:\Program Files\MVTec\HALCON-17.12-Progress\include, 
D:\Program Files\MVTec\HALCON-17.12-Progress\include\halconcpp 
和一处库目录: 
D:\Program Files\MVTec\HALCON-17.12-Progress\lib\x64-win64 
所以进行MFC工程属性的设置 
halcon与MFC联合编程 
 
 
 
3.使用导出的HALCON代码 
打开前面导出的文件,复制文件中的下面代码,用于包含halcon的头文件及作用域的引用 
#ifndef __APPLE__ 
#  include "HalconCpp.h" 
#  include "HDevThread.h" 
#  if defined(__linux__) && !defined(__arm__) && !defined(NO_EXPORT_APP_MAIN) 
#    include <X11/Xlib.h> 
#  endif 
#else 
#  ifndef HC_LARGE_IMAGES 
#    include <HALCONCpp/HalconCpp.h> 
#    include <HALCONCpp/HDevThread.h> 
#  else 
#    include <HALCONCppxl/HalconCpp.h> 
#    include <HALCONCppxl/HDevThread.h> 
#  endif 
#  include <stdio.h> 
#  include <HALCON/HpThread.h> 
#  include <CoreFoundation/CFRunLoop.h> 
#endif 
using namespace HalconCpp; 
 
 
然后就是文件中action的与视觉相关的代码, 
复制到按钮的点击函数体内进行编译, 
一般不会直接编译成功。 
提示错误 
- 错误        1        error C2660: “CWnd::CloseWindow”: 函数不接受 1 个参数        c:\users\baikhgmv\desktop\123\123\123dlg.cpp        191        1        123
 
  
- CloseWindow函数作用不匹配,
 
 - 更改::CloseWindow(HDevWindowStack::Pop()); 为 HalconCpp::CloseWindow(HDevWindowStack::Pop());
 
  
- 再次编译,又是一堆的链接错误
 
 - 错误        27        error LNK1120: 26 个无法解析的外部命令        C:\Users\baikhgmv\Desktop\123\x64\Debug\123.exe        123
 
  
- 错误        5        error LNK2019: 无法解析的外部符号 "__declspec(dllimport) bool __cdecl HalconCpp::operator<=(class HalconCpp::HTuple const &,int)" (__imp_??NHalconCpp@@YA_NAEBVHTuple@0@H@Z),该符号在函数 "public: void __cdecl CMy123Dlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CMy123Dlg@@QEAAXXZ) 中被引用        C:\Users\baikhgmv\Desktop\123\123\123Dlg.obj        123
 
  复制代码 等等。。。。。 
 
只要在前面代码追加一句代码,将halconcpp.lib库载入就好, 
using namespace HalconCpp; 
#pragma comment(lib,"halconcpp.lib") 
 
 
4.接着就是按钮执行HALCON代码的错误处理 
复制导出文件中action函数内的全部代码到按钮点击函数体内后, 
运行如有提示HDevWindowStack::IsOpen() 异常, 
可将读取图片函数放在其前面ReadImage(&ho_Image, "fabrik");执行变OK. 
 
运行程序,点击按钮,会发现图片并不显示在图片控件内,而是独自创建了新的窗口。 
我们可以修改halcon打开窗口的函数参数OpenWindow(0,0,512,512,0,"visible","",&hv_WindowID); 
将我们控件的句柄作为参数传入便可,因为此函数的第五参数为父窗口句柄类型。 
我们修改图片控件ID为IDC_PIC。可以将其句柄传入,最终修改为 
OpenWindow(0,0,512,512,(Hlong)GetDlgItem(IDC_PIC)->m_hWnd,"visible","",&hv_WindowID); 
执行,结果如下图 
halcon与MFC联合编程 
 
 
 
程序源工程 
      
 |