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

news2025/2/27 2:07:29

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.coloradmin.cn/o/2270285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

出海新势力:巴西短剧的崛起与出海系统开发平台的赋能

在全球短剧蓬勃发展的浪潮中,巴西短剧宛如一颗耀眼的新星,迅速在拉美文娱的天空中崭露头角,成为备受瞩目的潜力股,正以独特的魅力吸引着越来越多观众的目光,在国际舞台上绽放出属于自己的光彩。 巴西短剧缘何火爆&…

HTML5新特性|01 音频视频

音频 1、Audio (音频) HTML5提供了播放音频文件的标准 2、control(控制器) control 属性供添加播放、暂停和音量控件 3、标签: <audio> 定义声音 <source> 规定多媒体资源,可以是多个<!DOCTYPE html> <html lang"en"> <head><…

多模态论文笔记——Coca

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型Coca&#xff0c;在DALLE 3中使用其作为captioner基准模型的原因和优势。 文章目录 ALBEF论文模型结构组成训练目标 CoCa​论文模型结构CoCa…

Flutter 调试环境下浏览器网络请求跨域问题解决方案

本篇文章主要讲解&#xff0c;Flutter调试环境情况下&#xff0c;浏览器调试报错跨域问题的解决方法&#xff0c;通过本篇文章你可以快速掌握Flutter调试环境情况下的跨域问题。 日期&#xff1a;2024年12月28日 作者&#xff1a;任聪聪 报错现象&#xff1a; 报文信息&#xf…

在K8S中,如何部署kubesphere?

在Kubernetes集群中&#xff0c;对于一些基础能力较弱的群体来说K8S控制面板操作存在一定的难度&#xff0c;此时kubesphere可以有效的解决这类难题。以下是部署kubesphere的操作步骤&#xff1a; 操作部署&#xff1a; 1. 部署nfs共享存储目录 yum -y install nfs-server e…

2024-12-29-sklearn学习(25)无监督学习-神经网络模型(无监督) 烟笼寒水月笼沙,夜泊秦淮近酒家。

文章目录 sklearn学习(25) 无监督学习-神经网络模型&#xff08;无监督&#xff09;25.1 限制波尔兹曼机25.1.1 图形模型和参数化25.1.2 伯努利限制玻尔兹曼机25.1.3 随机最大似然学习 sklearn学习(25) 无监督学习-神经网络模型&#xff08;无监督&#xff09; 文章参考网站&a…

数据挖掘——决策树分类

数据挖掘——决策树分类 决策树分类Hunt算法信息增益增益比率基尼指数连续数据总结 决策树分类 树状结构&#xff0c;可以很好的对数据进行分类&#xff1b; 决策树的根节点到叶节点的每一条路径构建一条规则&#xff1b;具有互斥且完备的特点&#xff0c;即每一个样本均被且…

数据仓库建设方案和经验总结

在做数据集成的过程中&#xff0c;往往第二步的需求就是建设数仓由于数据分散在不同的存储环境或数据库中&#xff0c;对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理&#xff0c;造成资源和人力的浪费。同时&#xff0c;目前的系统架构&#xff0c;无…

迈向AGI,3、2、1,2025上链接!

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年&#xff0c;旨在发扬科学思辨精神&#xff0c;邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索&#xff0c;加强思想碰撞&#xff0c;链接全…

云效流水线使用Node构建部署前端web项目

云效流水线实现自动化部署 背景新建流水线配置流水线运行流水线总结 背景 先来看看没有配置云效流水线之前的部署流程&#xff1a; 而且宝塔会经常要求重新登录&#xff0c;麻烦的很 网上博客分享了不少的配置流程&#xff0c;这一篇博客的亮点就是不仅给出了npm命令构建&…

计算机网络 (14)数字传输系统

一、定义与原理 数字传输系统&#xff0c;顾名思义&#xff0c;是一种将连续变化的模拟信号转换为离散的数字信号&#xff0c;并通过适当的传输媒介进行传递的系统。在数字传输系统中&#xff0c;信息被编码成一系列的二进制数字&#xff0c;即0和1&#xff0c;这些数字序列能够…

【Leecode】Leecode刷题之路第97天之交错字符串

题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; class Solution {public boolean isInte…

【Python】闭包

闭包&#xff08;Closure&#xff09;是指一个函数记住了并可以访问它的词法作用域&#xff08;lexical scope&#xff09;&#xff0c;即使这个函数在词法作用域之外执行。 闭包其实就是延伸了作用域的函数&#xff0c;包括被延伸函数主体中引用的非全局变量和局部变量。这些…

【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用

&#x1f31f; 关于我 &#x1f31f; 大家好呀&#xff01;&#x1f44b; 我是一名大三在读学生&#xff0c;目前对人工智能领域充满了浓厚的兴趣&#xff0c;尤其是机器学习、深度学习和自然语言处理这些酷炫的技术&#xff01;&#x1f916;&#x1f4bb; 平时我喜欢动手做实…

信息系统项目管理师——第8章章 项目整合管理 笔记

8 项目整合管理&#xff08;最后反过来看&#xff09; 项目整合过程&#xff1a;①制定项目章程&#xff08;启动过程&#xff09;、②制订项目管理计划&#xff08;规划过程&#xff09;、③指导和管理项目工作、管理项目知识&#xff08;执行过程&#xff09;、④监控项目工…

机器学习 学习知识点

机器学习 学习知识点 什么是消融实验&#xff08;Ablation experiment&#xff09;&#xff1f;num_step与batch_size的区别python glob.glob()函数认识python的条件判断之is not、is not None、is Nonetqdm介绍及常用方法softmax 激活函数。type_as(tesnor)Python OpenCV cv2.…

【论文+源码】一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统

为了实现一个基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;的公寓电能计量系统&#xff0c;我们需要创建一个简单的Web应用程序来记录和显示每个公寓的电能使用情况。以下是一个基本的实现示例。 我们将包括以下几个部分&#xff1a; 数据库表设计实体类DAO层…

【74LS160+74LS273DW锁存器8位的使用频率计】2022-7-12

缘由 想知道这个数字频率计仿真哪里出现错误了&#xff0c;一直无法运行哎&#xff0c;如何解决&#xff1f;-运维-CSDN问答

redux react-redux @reduxjs/toolkit

redux团队先后推出了redux、react-redux、reduxjs/toolkit&#xff0c;这三个库的api各有不同。本篇文章就来梳理一下当我们需要在项目中集成redux&#xff0c;从直接使用redux&#xff0c;到使用react-redux&#xff0c;再到react-redux和reduxjs/toolkit配合使用&#xff0c;…

Visual Studio 2022安装教程

1、下载网址 Visual Studio 2022 IDE安装网址借助 Visual Studio 设计&#xff0c;具有自动完成、构建、调试、测试功能的代码将与 Git 管理和云部署融为一体。https://visualstudio.microsoft.com/zh-hans/vs/ 点击图片所示 双击运行 2、安装 点击C桌面开发&#xff08;右边…