> 文章列表 > 阿赵的MaxScript学习笔记分享十五《MaxScript界面的进阶应用》

阿赵的MaxScript学习笔记分享十五《MaxScript界面的进阶应用》

阿赵的MaxScript学习笔记分享十五《MaxScript界面的进阶应用》

MaxScript学习笔记目录
大家好,我是阿赵,之前介绍过MaxScript的各种UI控件的用法,这次介绍一些稍微复杂一点的用法。

一、例子介绍

这次要做的例子,有一部分是使用了dotNet的UI控件,一部分是MaxScript自带的UI用法,可以综合着一起看看。使用了donNet的UI控件,可以做出更复杂的UI展示。先看看例子的截图,下面有每个部分的详细说明,最后有完整的代码
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、详细说明

1、ListView

1.代码

rollout ListViewTestWin "ListViewTestWin" width:247 height:282
(dotNetControl 'myList' "System.Windows.Forms.ListView" pos:[10,10] width:217 height:200 align:#lefton ListViewTestWin open do(--设置ListView的属性myList.Fullrowselect = truemyList.GridLines = truemyList.View = myList.View.Details--添加标题myList.Columns.Add("Name")myList.Columns.Add("Description")--模拟数据local items = #()for i in 1 to 100 do(local tempVal = "Item "+(i as string)append items tempVal)--把数据填充到ListViewfor i = 1 to items.count do(row = dotNetObject "System.Windows.Forms.ListViewItem"row.Text = items[i]row.SubItems.Add("This is item " + i as string)myList.Items.Add(row)))on myList mouseDown arg do(--arg.Clicks判断点击的次数,2就是双击,1是单击if arg.Clicks  == 2 do (--通过点击的位置判断点到的具体格子hit=(myList.HitTest (dotNetObject "System.Drawing.Point" arg.x arg.y))print hit.item.subItems.item[0].textprint hit.item.subItems.item[1].text))
)

2.说明

在这里插入图片描述

(1)这个例子使用了dotNet的ListView组件,所以需要定义控件类型为System.Windows.Forms.ListView
(2)初始化操作,在on open事件里面,给控件填充数据
(3)填充数据部分,和C#本身并没有什么区别
(4)在获取点击数据的地方,由于HitTest 方法需要的传入参数是Point类型的,所以需要定义一下dotNetObject “System.Drawing.Point”
(5)mouseDown 事件会传入参数,可以判断点击的次数

2、ListBox

1.代码

rollout ListBoxTestWin "ListBoxTestWin" width:247 height:282
(dotNetControl 'myList' "System.Windows.Forms.ListBox" pos:[10,10] width:217 height:200 align:#lefton ListBoxTestWin open do(--模拟数据local items = #()for i in 1 to 100 do(local tempVal = "Item "+(i as string)append items tempVal)--填充数据myList.Items.clear()for i in 1 to 100 do(myList.Items.Add(items[i])))on myList mouseDown arg do(--获取当前选择的格子内容print (myList.SelectedItem as string))
)

2.说明

在这里插入图片描述

(1)这个例子使用了dotNet的ListBox组件,所以要定义控件类型为System.Windows.Forms.ListBox
(2)初始化操作,在on open事件里面,给控件填充数据
(3)数据填充和获取部分都可以参考C#

3、Form窗体

1.代码

fn ShowFormFun = 
(-- 加载.NET Framework集成器dotNet.loadAssembly "System.Windows.Forms"dotNet.loadAssembly "System.Data"-- 新建.NET窗体类local form = dotNetObject "System.Windows.Forms.Form"form.ClientSize = dotNetObject "System.Drawing.Size" 300 200 -- 定义窗体大小form.text = "Test Window"-- 添加.DataGridView控件local myDataGrid = dotNetObject "System.Windows.Forms.DataGridView"myDataGrid.Dock = myDataGrid.Dock.Fill -- 填满整个窗口form.Controls.Add myDataGrid -- 将数据表格添加到窗体中local myDataTable = dotNetObject "System.Data.DataTable"local myDataColumn1 = myDataTable.Columns.Add "姓名"myDataColumn1.DataType = dotNetClass "System.String"local myDataColumn2 = myDataTable.Columns.Add "年龄"myDataColumn2.DataType = dotNetClass "System.Int32"myDataTable.Rows.Add #("张三",18)myDataTable.Rows.Add #("李四",25)myDataGrid.DataSource = myDataTable -- 绑定数据源-- 显示窗体form.ShowDialog()
)rollout DotNetFormTestWin "DotNetFormTestWin" width:378 height:80
(button 'btn1' "showForm" pos:[78,21] width:209 height:37 align:#lefton btn1 pressed do(ShowFormFun()))

2.说明

在这里插入图片描述

(1)这里使用了2个dotNet的内容,第一个是窗体Form,第二个是DataGridView
(2)Form是不能嵌入MaxScript的rollout 的,它是一个独立的窗体,而且在打开的时候,会强制获取最高层的焦点。所以在显示Form的时候,原来的窗体是不能操作的。
(3)由于我们要直接的调用C#的代码,所以使用dotNet.loadAssembly来加载dotNet的库
(4)在调用C#方法的时候,都需要注意传入的数据的类型是什么,比如form.ClientSize 需要传入的类型是Size,所以要定义类型dotNetObject “System.Drawing.Size”
(5)由于Form并不是嵌入到rollout的,所以它需要单独的打开命令
form.ShowDialog()
(6)DataGridView作为数据表显示,通过DataTable赋值给DataSource,进行数据的绑定

4、自定义窗体

1.代码

rollout CustomPanelTestWin "CustomPanel" width:378 height:80
(button 'btn1' "showWin" pos:[78,21] width:209 height:37 align:#lefton btn1 pressed do(createDialog CustomPanelWin))rollout CustomPanelWin "CustomPanel" width:378 height:221
(button 'btn1' "closeWin" pos:[85,142] width:209 height:37 align:#leftlabel 'lbl1' "This is a Custom win" pos:[17,12] width:166 height:23 align:#leftcolorPicker 'cp1' "ColorPicker" pos:[33,38] width:307 height:30 align:#leftslider 'sld1' "Slider" pos:[32,83] width:304 height:44 align:#lefton btn1 pressed do(DestroyDialog CustomPanelWin)
)

2.说明

在这里插入图片描述

(1)这个是maxscript自己的rollout 实现的
(2)当点击按钮的时候,通过createDialog方法动态打开指定的窗体
(3)需要关闭窗体的时候,通过DestroyDialog方法关闭

5、折叠栏

1.代码

local theFloater = newRolloutFloater "Test" 400 400
addRollout ListViewTestWin theFloater rolledup:false
addRollout ListBoxTestWin theFloater rolledup:true
addRollout DotNetFormTestWin theFloater rolledup:true
addRollout CustomPanelTestWin theFloater rolledup:true

2.说明
在这里插入图片描述

(1)这个是MaxScript本身的功能,创建一个newRolloutFloater浮动窗体
(2)通过addRollout方法,把已经做好的rollout 插入到浮动窗体里面
(3)rolledup控制是否折叠的值,当为false时,内容展开,当为true时,内容折叠

三、完整代码

(
local CustomPanelWin
rollout ListViewTestWin "ListViewTestWin" width:247 height:282
(dotNetControl 'myList' "System.Windows.Forms.ListView" pos:[10,10] width:217 height:200 align:#lefton ListViewTestWin open do(--设置ListView的属性myList.Fullrowselect = truemyList.GridLines = truemyList.View = myList.View.Details--添加标题myList.Columns.Add("Name")myList.Columns.Add("Description")--模拟数据local items = #()for i in 1 to 100 do(local tempVal = "Item "+(i as string)append items tempVal)--把数据填充到ListViewfor i = 1 to items.count do(row = dotNetObject "System.Windows.Forms.ListViewItem"row.Text = items[i]row.SubItems.Add("This is item " + i as string)myList.Items.Add(row)))on myList mouseDown arg do(--arg.Clicks判断点击的次数,2就是双击,1是单击if arg.Clicks  == 2 do (--通过点击的位置判断点到的具体格子hit=(myList.HitTest (dotNetObject "System.Drawing.Point" arg.x arg.y))print hit.item.subItems.item[0].textprint hit.item.subItems.item[1].text))
)rollout ListBoxTestWin "ListBoxTestWin" width:247 height:282
(dotNetControl 'myList' "System.Windows.Forms.ListBox" pos:[10,10] width:217 height:200 align:#lefton ListBoxTestWin open do(--模拟数据local items = #()for i in 1 to 100 do(local tempVal = "Item "+(i as string)append items tempVal)--填充数据myList.Items.clear()for i in 1 to 100 do(myList.Items.Add(items[i])))on myList mouseDown arg do(--获取当前选择的格子内容print (myList.SelectedItem as string))
)fn ShowFormFun = 
(-- 加载.NET Framework集成器dotNet.loadAssembly "System.Windows.Forms"dotNet.loadAssembly "System.Data"-- 新建.NET窗体类local form = dotNetObject "System.Windows.Forms.Form"form.ClientSize = dotNetObject "System.Drawing.Size" 300 200 -- 定义窗体大小form.text = "Test Window"-- 添加.DataGridView控件local myDataGrid = dotNetObject "System.Windows.Forms.DataGridView"myDataGrid.Dock = myDataGrid.Dock.Fill -- 填满整个窗口form.Controls.Add myDataGrid -- 将数据表格添加到窗体中local myDataTable = dotNetObject "System.Data.DataTable"local myDataColumn1 = myDataTable.Columns.Add "姓名"myDataColumn1.DataType = dotNetClass "System.String"local myDataColumn2 = myDataTable.Columns.Add "年龄"myDataColumn2.DataType = dotNetClass "System.Int32"myDataTable.Rows.Add #("张三",18)myDataTable.Rows.Add #("李四",25)myDataGrid.DataSource = myDataTable -- 绑定数据源-- 显示窗体form.ShowDialog()
)rollout DotNetFormTestWin "DotNetFormTestWin" width:378 height:80
(button 'btn1' "showForm" pos:[78,21] width:209 height:37 align:#lefton btn1 pressed do(ShowFormFun()))rollout CustomPanelTestWin "CustomPanel" width:378 height:80
(button 'btn1' "showWin" pos:[78,21] width:209 height:37 align:#lefton btn1 pressed do(createDialog CustomPanelWin))rollout CustomPanelWin "CustomPanel" width:378 height:221
(button 'btn1' "closeWin" pos:[85,142] width:209 height:37 align:#leftlabel 'lbl1' "This is a Custom win" pos:[17,12] width:166 height:23 align:#leftcolorPicker 'cp1' "ColorPicker" pos:[33,38] width:307 height:30 align:#leftslider 'sld1' "Slider" pos:[32,83] width:304 height:44 align:#lefton btn1 pressed do(DestroyDialog CustomPanelWin)
)local theFloater = newRolloutFloater "Test" 400 400
addRollout ListViewTestWin theFloater rolledup:false
addRollout ListBoxTestWin theFloater rolledup:true
addRollout DotNetFormTestWin theFloater rolledup:true
addRollout CustomPanelTestWin theFloater rolledup:true
)