7、MFC与Halcon混合编程
一、配置环境
- 把Halcon安装目录下的include文件夹以及所有子文件夹都添加到mfc项目属性-----C/C++常规----附加包含目录中。![]()  
- 把Halcon安装目录下的lib文件夹以及所有子文件夹都添加到mfc项目属性----连接器----常规-----附加库目录。
 
	
- mfc项目属性----连接器---输入-----附加依赖项,添加ahlconcpp.lib
 
	
- 把Halcon安装目录下的bin中的所有子文件夹添加到:菜单----选项---VC++目录----可执行文件下。![]()  
- 把Halcon安装目录下的include中的所有子文件夹添加到:菜单----选项---VC++目录----包含文件。
 
	
- 把Halcon安装目录下的lib中的所有子文件夹添加到:菜单----选项---VC++目录----引用文件。
 
	
- 把Halcon安装目录下的lib中的所有子文件夹添加到:菜单----选项---VC++目录----库文件
 
	
注:通过以上配置后,有时在运行程序时仍然有一些dll无法加载,解决办法:
提示缺少那个dll就到Halcon安装目录中查找,找到后把它复制到工程所在目录(和可执行文件同一个路径下),或复制到C:\Windows\System32目录下即可。
例子测试:
Halcon代码:
list_files ('C:/picture', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.jpg','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
*halcon程序中一定要用代码打开窗口,否则导出的c++程序没有用于显示图片的窗口接口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读入图片并处理
read_image (Image, ImageFiles[Index])
*变灰度图片
rgb1_to_gray (Image, GrayImage)
*显示图片也要用代码实现。否则导出的c++程序中找不到用于显示图片的代码
dev_display (GrayImage)
endfor
*关闭窗口,否则第二次重新执行时无法正常显示
dev_close_window ()
- 导出c++:![]()  
- 分析导出代码。#include "HalconCpp.h" using namespace Halcon; void action() { using namespace Halcon; // 图形变量 Hobject Image, GrayImage; // 控制变量 HTuple ImageFiles, Index, WindowHandle; // 下面是文件的路径,值得注意的是这个路径跟window的路径不一样,用的是 / 而不是 \ list_files("C:/picture", (HTuple("files").Append("follow_links")), &ImageFiles); tuple_regexp_select(ImageFiles, (HTuple("\\.jpg").Append("ignore_case")), &ImageFiles); for (Index=0; Index<=(ImageFiles.Num())-1; Index+=1) { //halcon程序中一定要用代码打开窗口,否则导出的c++程序没有用于显示图片的窗口接口 set_window_attr("background_color","black"); open_window(0,0,512,512,0,"","",&WindowHandle); HDevWindowStack::Push(WindowHandle); //读入图片并处理 read_image(&Image, HTuple(ImageFiles[Index])); //变灰度图片 rgb1_to_gray(Image, &GrayImage); //显示图片也要用代码实现。否则导出的c++程序中找不到用于显示图片的代码 if (HDevWindowStack::IsOpen()) disp_obj(GrayImage, HDevWindowStack::GetActive()); } //关闭窗口,否则第二次执行时无法正常显示 if (HDevWindowStack::IsOpen()) close_window(HDevWindowStack::Pop()); } int main(int argc, char *argv[]) { using namespace Halcon; // Default settings used in HDevelop (can be omitted) set_system("do_low_error","false"); action(); return 0; } 
- 新建mfc程序,并按上面方法配置好:
- 把导出的C++程序的头文件以及命名空间复制到stdafx.h中
#include "HalconCpp.h"
using namespace Halcon;
- 把导出的C++程序声明部分的变量复制到主对话框的(*****Dlg.h)的public下,
public:
// 图形变量
Hobject Image, GrayImage;
// 控制变量
HTuple ImageFiles, Index, WindowHandle;
- 把action()函数体复制到主对话框的(*****Dlg.cpp)下
- 在按钮函数中调用该action()函数。void action() { using namespace Halcon; // 图形变量 Hobject Image, GrayImage; // 控制变量 HTuple ImageFiles, Index, WindowHandle; list_files("C:/picture", (HTuple("files").Append("follow_links")), &ImageFiles); tuple_regexp_select(ImageFiles, (HTuple("\\.jpg").Append("ignore_case")), &ImageFiles); //********************************************************************** 
//打开用于显示图像的窗口
set_window_attr("background_color","black");
open_window(0,0,512,512,0,"","",&WindowHandle);
HDevWindowStack::Push(WindowHandle);
//**********************************************************************
for (Index=0; Index<=(ImageFiles.Num())-1; Index+=1)
{
//读入图片并处理
read_image(&Image, HTuple(ImageFiles[Index]));
//变灰度图片
rgb1_to_gray(Image, &GrayImage);
//显示图片也要用代码实现。否则导出的c++程序中找不到用于显示图片的代码
if (HDevWindowStack::IsOpen())
{
disp_obj(GrayImage, HDevWindowStack::GetActive());
}
}
//关闭窗口
close_window(HDevWindowStack::Pop());
}
void ChalocnmfcDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
action();
}
- 效果:这时发现mfc主界面与显示窗口图片独立。因为在代码中可以看出显示图片的窗口是通过WindowHandle句柄实现的,与主界面没有关联。 
 
	
- 实现图像在mfc主对话框中显示。将打开用于显示图像窗口的代码(//*****包围部分)换成//打开用于显示图像的窗口 CWnd* pWnd=AfxGetMainWnd();//获取主窗口的指针 Hlong MainWndID = (Hlong) pWnd->m_hWnd;//获取句柄 set_window_attr("background_color","black"); open_window(10,10,512,512,MainWndID,"","",&WindowHandle); HDevWindowStack::Push(WindowHandle); 注: open_window()第一二个参数表示图片的左上角坐标(主对话框左上角为原点),三四个参数表示宽度和高度,第四个参数表示主对话框的ID 
效果:

 
                    
                
 
			 
			 
			 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号