原文:【原创】Matlab.NET混合编程调用Figure窗体

1.前言

做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用。特别是在C#调用Matlab函数这方面,积累了比较多的经验,和使用经验密切相关。根据很多朋友经常遇到的WinForm窗体混编调用Matlab的Figure的问题,花了一些功夫,把这个封装为C#控件,使得大家可以很容易调用Matlab的Figure了。

2.Matlab.NET混合编程概述

这方面就不仔细阐述了,主要是利用Matlab的Deploytool工具将m函数编译为.NET程序集,然后在C#中调用的过程。然后程序可以在安装MCR的机器上运行,这个过程如果懂Matalb和C#的人,其实看看帮助很容易理解,也有例子。在这里不仔细讲解。2012年,我录制过国内第一套Matlab.NET混合编程视频教程,与ILoveMatab论坛的管理员Math商量之后,已经免费开放,大家去论坛下载即可。

混合编程最重要的是利用matlab的科学计算功能和强大的工具箱函数。但目前很多学生做这个,都只是为了简单的绘图,.NET绘图其实也很强大。很多人混编,就想把Matlab绘图产生的Figure在WinForm窗体中显示,但是Matlab并没有提供直接的解决方法。只能找另外的方法,我目前想到的有2种:

1.先把Figure保存为图片,然后WinForm窗体去读取图片;

2.利用Windows API 技术,动态的获取窗体句柄,然后嵌入到WinForm中。

第一种方法很容易想到,也很容易解决,就不仔细讲了。

第二中方法懂开发的人一般能想得到,但是学生一般不是很容易想到,即使想到,做出来也很难。

下面我就把第二种方法的实现过程讲解一下。

3.MatlabFigure控件的封装过程

控件的设计思想:

1.能够在WinForm桌面程序调用Matlab混编产生的Figure,主要是根据Figure的标题文字

2.Figure嵌入在控件C中,C的大小应该和Figure的大小一致,程序只需要关心控件的大小状态就可以

3.初始化的时候,Figure的大小根据控件C的大小进行调整

4.Figure的大小将随着控件的大小改变而改变

其实根据上面阐述的原理,精通Windows API的人很快就可以解决,主要就这么几个函数,我贴一下代码:

 DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); [DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
} [DllImport("user32.dll")]
public static extern int GetClientRect(IntPtr hwnd, ref RECT rc); [DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); /// <summary>最大化窗口,最小化窗口,正常大小窗口
/// nCmdShow:0隐藏,3最大化,6最小化,5正常显示
/// </summary>
[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow); [DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect); public class _SW
{
public const int SW_HIDE = ;
public const int SW_SHOWNORMAL = ;
public const int SW_SHOWMINIMIZED = ;
public const int SW_SHOWMAXIMIZED = ;
public const int SW_MAXIMIZE = ;
public const int SW_SHOWNOACTIVATE = ;
public const int SW_SHOW = ;
public const int SW_MINIMIZE = ;
public const int SW_SHOWMINNOACTIVE = ;
public const int SW_SHOWNA = ;
public const int SW_RESTORE = ;
}

在Figure窗体显示后,通过FindWindow("SunAwtFrame", figureTitleName);来动态获取窗体的句柄,注意Figure的类型都是”SunAwtFrame”,这个要专业点的软件查出来。获取窗体之后,然后通过 SetParent和MoveWindow来设置子窗体,并改变窗体的大小。控件的详细代码就不贴了,主要是上面的封装过程吧,把逻辑搞懂了,很容易。由于源代码是给商业项目使用,暂时不开放。贴一段窗体寻找的代码,为了防止Figure还未显示,程序已经在寻找,特意加了一个延时:

 #region 寻找窗体
int num = ;
while (num < )
{
num++;
//若找不到窗体,循环5次,每次100ms
if (wf == IntPtr.Zero)
{
wf = FindWindow("SunAwtFrame", figureTitleName);
Thread.Sleep(timeSpan);
}
else
{ //找到隐藏起来
ShowWindow(wf, _SW.SW_HIDE);break;
}
}
if (wf == IntPtr.Zero)
{
MessageBox.Show("无法获取Figure窗体,请确认信息是否正确");
return;
}
#endregion

看看效果图:

特意新建了一个混编QQ交流群:154957583,有经验的朋友可以一起探讨。

Matlab.NET混合编程调用Figure窗体的更多相关文章

  1. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  2. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  3. C#和MatLab的混合编程(充分利用二者的优势)

    C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010:Ma ...

  4. Matlab.NET混合编程技巧之——找出Matlab内置函数

    原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...

  5. matlab和C/C++混合编程--调用opencv

    最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...

  6. 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...

  7. 基于引擎的matlab+vc混合编程的配置

    前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...

  8. vs2010 matlab混合编程调用matlab引擎

    // matlab_engine.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "engine.h" ...

  9. matlab c# 混合编程

    MWArray错误: matlab 64位 vs 32位 1. visual studio没有专门的64位版.但32位版可以在64位系统上面正常使用.2.安装VS2010的时候,在安装选项里面,选择了 ...

随机推荐

  1. 足球和oracle列(4):巴西惨败于德国,认为,差额RAC拓扑控制!

    足球与oracle系列(4):从巴西慘败于德国,想到,差异的RAC拓扑对照! 前期回想: 本来想说今晚,回头一想,应该是今早第二场半决赛就要开战了!先来回味一下之前的比赛,本届8支小组赛第一名已经所有 ...

  2. Test SRM Level Three: LargestCircle, Brute Force

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3005&rd=5858 思路: 如果直接用Brute F ...

  3. C#判断操作系统是32位还是64位(超简单)

    由于项目需要在64位和32位系统运行,需要判断当前系统是32位还是64位. 网上很多方法,但是都感觉不是很简洁,最后发现可以使用int的长度来判断:看代码 /// <summary>    ...

  4. 解决编译时出错提示: 'error: array must be initialized with a brace-enclosed initializer' 的错误

    编译出现这个错误的原因非常简单编译的标准不相同.如果用stdc90,这个就可以直接编译通过了. 下面是代码例子: ...... ] = NULL;或者 :char cmd[256] = '\0'; . ...

  5. BAE3.0搭建wordpress注意

    仅仅是mark一个注意的点,数据库连接时,主机是: /** MySQL主机 */ define('DB_HOST', 'sqld.duapp.com:4050');

  6. 修改字符串中特定的内容,用于OpenRecovery Script

    下面的是实例内容 目标是把OpenRecovery Script输入的内容进行修改 当有下面的输入:(作用是安装/emmc目录下面的update-signed.zip 刷机包) install /em ...

  7. Directx11学习笔记【五】 基本的数学知识----向量篇

    本文参考dx11龙书 Chapter1 vector algebra(向量代数) 要想学好游戏编程,扎实的数学知识是尤为重要的,下面将对dx11龙书中有关向量的数学知识做一下总结. 在数学中,几何向量 ...

  8. sql pivot、unpivot和partition by用法

    原文:sql pivot.unpivot和partition by用法 演示脚本 from sys.sysobjects where name = 'Student' AND type = 'U') ...

  9. java提高篇(十四)-----关键字final

    在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了.final是java的关键字,它所表示的是"这部分是无法修改的".不想被改变的原因有两个:效 ...

  10. [Apache Spark源代码阅读]天堂之门——SparkContext解析

    略微了解Spark源代码的人应该都知道SparkContext,作为整个Project的程序入口,其重要性不言而喻,很多大牛也在源代码分析的文章中对其做了非常多相关的深入分析和解读.这里,结合自己前段 ...