当前位置: 首页 > article >正文

阿赵的MaxScript学习笔记分享十六《MaxScript和WinForm交互》

MaxScript学习笔记目录

  大家好,我是阿赵。
  之前有网友给我留言说MaxScript和DotNet的WinForm界面交互有问题。我回头看了一下,发现之前的MaxScript文章是漏了这部分没有说明,这里补充一下。这里的内容主要是用C#写一个WinForm界面,然后导出给MaxScript使用和交互。

一、 WinForm部分

1、建立WinForm界面

  这里我简单的建一个C#的WinForm项目,然后简单的做一个界面:
在这里插入图片描述

  这个界面的名字就叫做Form1,各位也可以根据自己情况起名字。不过这个名字是需要记下来的,因为在MaxScript里面调用,需要这个名字。
  在Form1里面有一个TextBox和2个Button。然后在里面写入一些简单的代码:

using System;
using System.Windows.Forms;

namespace DotnetUITest
{
    public partial class Form1 : Form
    {
        private int num = 0;
        public Form1()
        {
            InitializeComponent();
        }
//获取当前的num值
        public int GetCurrentNum()
        {
            return num;
        }
//获取第二个按钮,用于给MaxScript注册点击事件
        public Button GetButton2()
        {
            return button2;
        }

        //按钮1本地点击功能测试
        private void button1_Click(object sender, EventArgs e)
        {
            num++;
            textBox1.Text = num.ToString();
        }
    }
}

2、 导出dll

  做好界面和代码之后,要把这个界面导出成dll给MaxScript使用。
  先找到项目属性:
在这里插入图片描述

然后把输出类型给出类库:
在这里插入图片描述

最后在生成里面选择生成解决方案:
在这里插入图片描述

  这里要记住自己项目的项目名称,比如我这个项目的名称是:DotnetUITest
  然后在生成的地方可以看到了这个项目的dll文件。
在这里插入图片描述

二、 MaxScript部分

1、 显示WinForm

  先写以下代码,用于显示WinForm
在这里插入图片描述

fn main =(

 dotnet.loadAssembly ("D:/DotnetUITest.dll")
   
	global Form1 = dotnetObject "DotnetUITest.Form1"
	Form1.Show()
)

main()

说明:
我是简单的把dll文件放在了d盘,所以通过:

dotnet.loadAssembly ("D:/DotnetUITest.dll")

就可以把这个指定的dll加载进来。
然后需要加载Form1,需要通过一个全局变量把Form1保存起来:

global Form1 = dotnetObject "DotnetUITest.Form1"

最后把Form1显示出来

Form1.Show()

写好代码之后,按Ctrl+E运行脚本,会看到WinForm的界面显示出来了:
在这里插入图片描述

为了测试一下里面的功能是否正常,之前给button1写了个点击处理方法,每点一下,TextBox里面的数字会加一:
在这里插入图片描述

到这里,界面显示没问题。

2、 找到界面里面的按钮并注册点击事件

接着写代码:
在这里插入图片描述

fn main =(

 dotnet.loadAssembly ("D:/DotnetUITest.dll")
   
	global Form1 = dotnetObject "DotnetUITest.Form1"
	Form1.Show()
)

main()

fn clickBtnHandle sender args = 
( 
	local content = "click from winform"
	messageBox content
	print content
)
				
fn AddBtnHandleFn = 
( 
	local button = Form1.GetButton2()

	dotNet.addEventHandler button "Click" clickBtnHandle 
)

AddBtnHandleFn()

这里做了2个事情:
1. 写一个点击按钮的回调处理方法

fn clickBtnHandle sender args = 
( 
	local content = "click from winform"
	messageBox content
	print content
)

如果按钮被点击,这里会弹窗和打印"click from winform",证明按钮被点击了。
2. 注册点击事件

fn AddBtnHandleFn = 
( 
	local button = Form1.GetButton2()

	dotNet.addEventHandler button "Click" clickBtnHandle 
)

由于Form1我留了个方法叫做GetButton2,会把button2返回,所以这里调用就可以获得button2了
然后通过

dotNet.addEventHandler button "Click" clickBtnHandle 

把这个按钮的点击事件注册为clickBtnHandle
这个时候再运行脚本,点击button2:

在这里插入图片描述

会出现弹窗:
在这里插入图片描述

并且在MaxScript Listener里面出现打印内容:
在这里插入图片描述

3、 修改原有的按钮内容:

继续修改代码,给button2修改一下text:

在这里插入图片描述

运行脚本,会看到button2的文本被改变了:
在这里插入图片描述

4、 新增按钮

接下来不获取button2,而是直接往Form1里面新增一个按钮:
在这里插入图片描述

fn main =(

 dotnet.loadAssembly ("D:/DotnetUITest.dll")
   
	global Form1 = dotnetObject "DotnetUITest.Form1"
	Form1.Show()
)

main()

fn clickBtnHandle sender args = 
( 
	local content = "click from winform"
	messageBox content
	print content
)
				
fn AddBtnHandleFn = 
( 
	--local button = Form1.GetButton2()
	local button = dotNetObject "System.Windows.Forms.Button"
	Form1.controls.add button
	button.text = "new Button"
	button.Location.x = 10
	button.Location.y = 50
	dotNet.addEventHandler button "Click" clickBtnHandle 
)

AddBtnHandleFn()

这里主要改变的代码是:

local button = dotNetObject “System.Windows.Forms.Button”
Form1.controls.add button
button.text = “new Button”
button.Location.x = 10
button.Location.y = 50

新增了一个按钮,并且添加到Form1的controls里面,然后修改它的文本和位置,这时候运行脚本,会看到:
在这里插入图片描述

5、 从WinForm方法获取值

其实之前获取button2的时候,我们就是通过调用GetButton2方法来返回了一个按钮对象。
在这里插入图片描述

fn main =(

 dotnet.loadAssembly ("D:/DotnetUITest.dll")
   
	global Form1 = dotnetObject "DotnetUITest.Form1"
	Form1.Show()
)

main()

fn clickBtnHandle1 sender args = 
( 
	local content = "click from winform"
	messageBox content
	print content
)
	
fn clickBtnHandle2 sender args = 
( 
	local num = Form1.GetCurrentNum()
	print num
)

fn AddBtnHandleFn = 
( 
	local button2 = Form1.GetButton2()
	dotNet.addEventHandler button2 "Click" clickBtnHandle1
	
	local button3 = dotNetObject "System.Windows.Forms.Button"
	Form1.controls.add button3
	button3.text = "new Button"
	button3.Location.x = 10
	button3.Location.y = 50
	dotNet.addEventHandler button3 "Click" clickBtnHandle2 
)

AddBtnHandleFn()

  这里稍微再重复一下,首先把button2和新增的按钮都注册了不同的点击方法,然后新按钮的点击方法,从Form1里面调用GetCurrentNum方法获得一个数值,并且打印出来:
  过程就不再重复,直接运行,可以看到,点button1,num的值会变,然后点新增的按钮,可以把当前的值打印出来:
在这里插入图片描述


http://www.kler.cn/a/468795.html

相关文章:

  • 什么样的人适合从事FPGA开发的工作?
  • 君正T41交叉编译ffmpeg、opencv并做h264软解,利用君正SDK做h264硬件编码
  • 小于n的最大数 - 贪心算法 - C++
  • Coroutine 基础八 —— Flow 操作符(二)
  • 小程序学习06——uniapp组件常规引入和easycom引入语法
  • Prism模块化
  • 【Python系列】Python 中的 `enumerate` 函数及其应用
  • 基于区块链的共享算力系统概念方案
  • Django Admin 以管理 AWS Lambda 函数
  • 深度信念网络 (Deep Belief Network, DBN) 算法详解与PyTorch实现
  • 性能测试04|JMeter:连接数据库、逻辑控制器、定时器
  • Linux中操作中的无痕命令history技巧
  • Sonic:开源Go语言开发的高性能博客平台
  • 第五届神经网络、信息与通信工程国际学术会议(NNICE 2025)
  • Java与AI:构建智能应用的强大组合
  • git使用指南-实践-搭建git私服
  • 【最新版】智慧小区物业管理小程序源码+uniapp全开源
  • 【每日学点鸿蒙知识】模拟器开启网络、长时任务、兼容性测试支持、丢帧定位、SO中访问rawfile等
  • 操作系统大题整理
  • 【Android项目学习】2.抖音二级评论
  • 代码随想录算法训练营第二十四天-回溯算法-78. 子集
  • yolov5核查数据标注漏报和误报
  • Python常用算法
  • WPS计算机二级•数据查找分析
  • jupyter展示图片做法以及为什么会无法展示图片
  • 编辑音频的基本属性