C#,C++聯合調用halcon

主要流程:界面使用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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章