主要流程:界面使用wpf,然後使用託管c++傳遞halcon句柄到底層
一、新建WPF工程
添加HalconDotNet.dll,xmal代碼
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:HalconShowTest"
xmlns:HalconDotNet="clr-namespace:HalconDotNet;assembly=halcondotnet" x:Class="HalconShowTest.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<HalconDotNet:HSmartWindowControlWPF Name="HimgWnd" HorizontalAlignment="Left" Height="342" Margin="10,10,0,0" VerticalAlignment="Top" Width="450"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="638,176,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<Button x:Name="btSet" Content="設置ID" HorizontalAlignment="Left" Margin="638,224,0,0" VerticalAlignment="Top" Width="75" Click="BtSet_Click"/>
<Button x:Name="btShow" Content="顯示" HorizontalAlignment="Left" Margin="638,284,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.013,-1.029" Click="BtShow_Click"/>
</Grid>
</Window>
CS
using HalconDotNet;
using System.Windows;
using MfcHalcon;
namespace HalconShowTest
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
HObject ho_Image;
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image);
ho_Image.Dispose();
HOperatorSet.ReadImage(out ho_Image ,"F:/1.jpg");
HOperatorSet.DispObj(ho_Image, HimgWnd.HalconWindow);
HimgWnd.HalconWindow.DispObj(ho_Image);
}
private void BtSet_Click(object sender, RoutedEventArgs e)
{
OpCS.SetWndID(HimgWnd.HalconID);
}
private void BtShow_Click(object sender, RoutedEventArgs e)
{
OpCS.ShowImg();
}
}
}
二、C++工程,託管
c++
class halconRead
{
public:
halconRead();
void ReadImageShow();
void SetWndHandle(HTuple inTuple);
private:
HTuple hv_WindowID;//halcon窗口句柄
};
#include "stdafx.h"
#include "halconRead.h"
#include <minwinbase.h>
#pragma comment(lib,"halcon/lib/halcon.lib")
#pragma comment(lib,"halcon/lib/halconc.lib")
#pragma comment(lib,"halcon/lib/halconcpp.lib")
halconRead::halconRead()
{
}
void getExePath(CString& outStr)
{
TCHAR exeFullPath[256]; // MAX_PATH
GetModuleFileName(NULL, exeFullPath, 256);//得到程序模塊名稱,全路徑
CString strPath;
DWORD nLoc;
strPath.Format(_T("%s"), exeFullPath);
nLoc = strPath.ReverseFind('\\');
strPath.Delete(nLoc + 1, strPath.GetLength() - nLoc);
strPath.Replace(_T("\\"), _T("/"));
outStr = strPath;
}
void halconRead::ReadImageShow()
{
HObject ho_Image;
//ReadImage(&ho_Image, "F:/HOSON_ProjectCode/HATC3500NewFrame/trunk/YC3000/Release/Images/Cap.bmp");
CString szFullPath;
getExePath(szFullPath);
USES_CONVERSION;
char* pchar = T2A(szFullPath);
char a[100];
strcpy_s(a, pchar);
strcat_s(a, "Cap.bmp");
ReadImage(&ho_Image, a);
DispObj(ho_Image,hv_WindowID);
}
void halconRead::SetWndHandle(HTuple inTuple)
{
hv_WindowID = inTuple;
}
託管
.h文件
using namespace System;
using namespace System::Collections::Generic;
namespace MfcHalcon
{
public ref class OpCS
{
public:
OpCS();
static void SetWndID(IntPtr inWnd);
static void ShowImg();
};
}
cpp文件
#include "stdafx.h"
#include "OpCS.h"
#include "halconRead.h"
halconRead g_halconRead;
MfcHalcon::OpCS::OpCS()
{
}
void MfcHalcon::OpCS::SetWndID(IntPtr inWnd)
{
long aa = inWnd.ToInt32();
g_halconRead.SetWndHandle(aa);
}
void MfcHalcon::OpCS::ShowImg()
{
g_halconRead.ReadImageShow();
}