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

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

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

1、创建WinForm界面

  这里我简单的建一个C#的WinForm项目,然后简单的做一个界面:

  这个界面的名字就叫做Form1,各位也可以根据本身环境起名字。不过这个名字是需要记下来的,因为在MaxScript里面调用,需要这个名字。
  在Form1里面有一个TextBox和2个Button。然后在里面写入一些简单的代码:
  1. using System;
  2. using System.Windows.Forms;
  3. namespace DotnetUITest
  4. {
  5.     public partial class Form1 : Form
  6.     {
  7.         private int num = 0;
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }
  12. //获取当前的num值
  13.         public int GetCurrentNum()
  14.         {
  15.             return num;
  16.         }
  17. //获取第二个按钮,用于给MaxScript注册点击事件
  18.         public Button GetButton2()
  19.         {
  20.             return button2;
  21.         }
  22.         //按钮1本地点击功能测试
  23.         private void button1_Click(object sender, EventArgs e)
  24.         {
  25.             num++;
  26.             textBox1.Text = num.ToString();
  27.         }
  28.     }
  29. }
复制代码
2、 导出dll

  做好界面和代码之后,要把这个界面导出成dll给MaxScript使用。
  先找到项目属性:

然后把输出范例给出类库:

最后在生成里面选择生成解决方案:

  这里要记着本身项目的项目名称,比如我这个项目的名称是:DotnetUITest
  然后在生成的地方可以看到了这个项目的dll文件。

二、 MaxScript部分

1、 显示WinForm

  先写以下代码,用于显示WinForm

  1. fn main =(
  2. dotnet.loadAssembly ("D:/DotnetUITest.dll")
  3.    
  4.         global Form1 = dotnetObject "DotnetUITest.Form1"
  5.         Form1.Show()
  6. )
  7. main()
复制代码
阐明:
我是简单的把dll文件放在了d盘,以是通过:
  1. dotnet.loadAssembly ("D:/DotnetUITest.dll")
复制代码
就可以把这个指定的dll加载进来。
然后需要加载Form1,需要通过一个全局变量把Form1保存起来:
  1. global Form1 = dotnetObject "DotnetUITest.Form1"
复制代码
最后把Form1显示出来
  1. Form1.Show()
复制代码
写好代码之后,按Ctrl+E运行脚本,会看到WinForm的界面显示出来了:

为了测试一下里面的功能是否正常,之前给button1写了个点击处置惩罚方法,每点一下,TextBox里面的数字会加一:

到这里,界面显示没问题。
2、 找到界面里面的按钮并注册点击事件

接着写代码:

  1. fn main =(
  2. dotnet.loadAssembly ("D:/DotnetUITest.dll")
  3.    
  4.         global Form1 = dotnetObject "DotnetUITest.Form1"
  5.         Form1.Show()
  6. )
  7. main()
  8. fn clickBtnHandle sender args =
  9. (
  10.         local content = "click from winform"
  11.         messageBox content
  12.         print content
  13. )
  14.                                 fn AddBtnHandleFn =
  15. (
  16.         local button = Form1.GetButton2()
  17.         dotNet.addEventHandler button "Click" clickBtnHandle
  18. )
  19. AddBtnHandleFn()
复制代码
这里做了2个变乱:
1. 写一个点击按钮的回调处置惩罚方法
  1. fn clickBtnHandle sender args =
  2. (
  3.         local content = "click from winform"
  4.         messageBox content
  5.         print content
  6. )
复制代码
如果按钮被点击,这里会弹窗和打印"click from winform",证实按钮被点击了。
2. 注册点击事件
  1. fn AddBtnHandleFn =
  2. (
  3.         local button = Form1.GetButton2()
  4.         dotNet.addEventHandler button "Click" clickBtnHandle
  5. )
复制代码
由于Form1我留了个方法叫做GetButton2,会把button2返回,以是这里调用就可以获得button2了
然后通过
  1. dotNet.addEventHandler button "Click" clickBtnHandle
复制代码
把这个按钮的点击事件注册为clickBtnHandle
这个时间再运行脚本,点击button2:

会出现弹窗:

并且在MaxScript Listener里面出现打印内容:

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

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

运行脚本,会看到button2的文本被改变了:

4、 新增按钮

接下来不获取button2,而是直接往Form1里面新增一个按钮:

  1. fn main =(
  2. dotnet.loadAssembly ("D:/DotnetUITest.dll")
  3.    
  4.         global Form1 = dotnetObject "DotnetUITest.Form1"
  5.         Form1.Show()
  6. )
  7. main()
  8. fn clickBtnHandle sender args =
  9. (
  10.         local content = "click from winform"
  11.         messageBox content
  12.         print content
  13. )
  14.                                 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
  15. )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方法来返回了一个按钮对象。

  1. fn main =(
  2. dotnet.loadAssembly ("D:/DotnetUITest.dll")
  3.    
  4.         global Form1 = dotnetObject "DotnetUITest.Form1"
  5.         Form1.Show()
  6. )
  7. main()
  8. 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的值会变,然后点新增的按钮,可以把当前的值打印出来:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表