如何使用LabVIEW调用C#Winform

界面交互并不是Labview的强项,使用Labview创建UI时候总会受制于VI有限的控件,有限的皮肤和有限的控件事件。而当需要实现UI的多文档的窗口,窗口的浮动停靠,动画等功能时还需要花很大的功夫。因此可以使用其他语言实现界面表达和交互,由LabVIEW调用作为补充。同时,文本编程中(例如C#)中的IDE辅助下,通过交互配置的方式自动生成代码,开发界面程序更高效。

C# 作为面向对象语言,窗口代码封装在System.Windows.Forms.Form类中。LabVIEW通过提供的支持调用.net的节点进行自定义Form1的实例构造,使用Show()或ShowDialog()函数运行并显示自定义窗口。 调用窗口的方式分为模式和非模式两种,同时可以指定拥有者窗体和附属窗体的关系。体现在以下四个Form类提供函数:

public void Show();                         //非模式调用,不指定拥有者窗体和附属窗体的关系
public void Show(IWin32Window owner);       //非模式调用,指定拥有者窗体和附属窗体的关系public void ShowDialog();                   //模式调用,隐式指定拥有者窗体和附属窗体的关系public void ShowDialog(IWin32Window owner); //模式调用,显式鲜指定拥有者窗体和附属窗体的关系

开发者通过C#开发好Winform的代码,发布成.net的dll。然后VI可以通过调用LabVIEW提供的.net函数节点进行调用,调用时请注意:

1.通过Show,ShowDialog方法调用winform需要在单一线程中调用,请把调用VI的属性设置中的VI执行系统设置成User Interface。

2.如果需要显示建立拥有者窗体和附属窗体的关系,需要使用带有IWin32Window owner作入参的重载函数.IWin32Window为接口类型,本质上是实现了获取Win32 HWND handleds的函数。

namespace System.Windows.Forms
{
    // Summary:
    //     Provides an interface to expose Win32 HWND handles.
    [ComVisible(true)]
    [Guid("458AB8A2-A1EA-4d7b-8EBE-DEE5D3D9442C")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IWin32Window
    {
        // Summary:
        //     Gets the handle to the window represented by the implementer.
        //
        // Returns:
        //     A handle to the window represented by the implementer.
        IntPtr Handle { get; }
    }
}

我们可以通过获取调用方的VI窗体的HWND,然后自定义一个适配器类实现该接口。先把获取HWND传入类进行构造,然后调用Show(IWin32Window owner)方法:

public class LabVIEWWin32WindowsAdapter : IWin32Window
    {
        public LabVIEWWin32WindowsAdapter(int handle)
        {
            this.handle = (IntPtr)handle;
        }

        IntPtr handle;
        public IntPtr Handle
        {
            get { return handle; }
        }
    }

代码例子:http://pan.baidu.com/s/1geIt0tH

参考:https://lavag.org/topic/11857-launch-a-floating-windows-form/#comment-71599

时间: 2024-10-25 06:06:37

如何使用LabVIEW调用C#Winform的相关文章

Labview调用Python脚本

Labview程序框图如下: Python脚本如下: #!/usr/bin/env pythonimport sys #Command Line Arguements are stored in list argvnumArgs = len(sys.argv) - 1sum = 0 #Iterate through each element and add to the sumfor n in range (1, len(sys.argv)): sum = sum + int(sys.argv[

labview 调用 matlab script的神坑! Error 1050 occurred at LabVIEW

显示变量没有被定义,原因是clear 关键字的问题,去掉即可!!! 未找到 文件路径,定位: 文件路径中不能有中文路径

LabVIEW如何方便地调用DLL文件

转自:http://bbs.elecfans.com/jishu_469502_1_1.html LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用 LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能. LabVIEW 中是通过Call Library Function Node(CLN)节点来完成DLL文件调用的.

Winform开发框架里面使用事务操作的原理及介绍

在很多情况下,事务是个很有用的东西,可以把一系列的操作组合成一个原子粒度的操作,一旦组合中某个地方出错,可以整个干净的进行滚回,不会留下脏数据:除此之外,事务还能提高批量操作的效率,如在本地SQLite数据库里面,批量插入1万条数据,那么使用事务和没有使用事务,速度上至少差别几十到上百倍的差异.既然事务有完整性和速度性的差异,因此,基于上述原因,我们在很多情况下最好使用事务进行操作.本文主要介绍在开发框架中如何整合事务的操作,并介绍在各个分层中的事务使用案例. 由于我介绍的相关框架,主要是采用了

Winform应用程序实现通用遮罩层

Winform应用程序实现通用遮罩层 在WEB上,我们在需要进行大数据或复杂逻辑处理时,由于耗时较长,一般我们会在处理过程中的页面上显示一个半透明的遮罩层,上面放个图标或提示:正在处理中...等字样,这样用户体验就比较好了,然而如果在Winform客户端程序,通常遮罩层的处理就显得不那么简单或不那么好看,而我今天要说明的是,我实现的这个Winform通用遮罩层,却可以实现类似WEB上的遮罩层,既可以透明,而且还可以显示动态图片以及文字,那如何实现的呢,我现在一一讲解. 首先要明确我们要实现的效果

TestStand与LabVIEW UI 交互

交互起因 客户觉得TestStand界面复杂,希望一个简单的界面即可进行序列执行,采用LabVIEW调用TestStand引擎可实现快速设计,将TestStand拆解到LabVIEW.然而,这样做需要设计大量回调函数,开发较费时间,项目对时间要求很严格,且投入不多,故希望有快速解决方案.为此,设计时希望LabVIEW可以充当一个辅助软件,可配置和控制执行,进行简单数据交互,执行还是TestStand进行 解决方案 TestStand加载LabVIEW界面进行配置后,执行UUT测试,当执行结束后,

WinForm上显示gif动画:转

WinForm上的ProgressBar,老实说,实在是不敢恭维,太死板,太难看了,即使做成实时显示处理进度的,它还是逃离不了“难看”.现 在的web2.0上到处都能看到一个显示正在处理的小圆圈在那转啊转,以表示正在处理,虽然它不是实时的,只是个gif动画,但它的效果总感觉要比 winform上的progressBar要赏心悦目的多.那我在winform 上是否也可以用这种gif动画来显示处理进度呢?答案是显然的,肯定可以,听说pictureBox就可以显示gif动画,只要把该控件的image属

Labview中定时函数之间的区别

第一个定时函数(时间延迟):在VI中插入时间延迟,指定在运行调用VI之前延时的秒数.默认值为1.000. 第一个定时函数(等待(ms)):等待指定长度的毫秒数,并返回毫秒计时器的值.该函数进行异步系统调用,但函数节点却是同步操作的.所以,直至指定时间结束,函数才停止执行:LabVIEW调用VI时,如毫秒计时值为112毫秒,等待时间(毫秒)为10毫秒,则毫秒计时值为122毫秒时,VI执行结束. 等待直至毫秒计时器的值为毫秒倍数中指定值的整数倍.该函数用于同步各操作.在循环中调用该函数可控制循环执行

WinForm中如何判断关闭事件来源于用户点击右上角的“关闭”按钮

在C#的WinForm程序中,有的时候需要判定关闭请求从哪里发出来的.比如是用户点击了右上角的“关闭”按钮,还是调用了WinForm.Close()方法.最典型的是要知道点击右上角的“关闭”按钮发出的事件.下面这个方法可以判断这点: 程序代码 protected override void WndProc(ref Message msg) {         const int WM_SYSCOMMAND = 0x0112;         const int SC_CLOSE = 0xF060