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

news2024/11/16 16:56:11

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:#left
    
	on ListViewTestWin open do
	(
		--设置ListView的属性
		myList.Fullrowselect = true
		myList.GridLines = true
	    myList.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
		)
		--把数据填充到ListView
	    for 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].text
			print 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:#left
	
	on 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:#left
	
	on 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:#left
	
	on btn1 pressed do
	(
		createDialog CustomPanelWin
	)

)



rollout CustomPanelWin "CustomPanel" width:378 height:221
(
	button 'btn1' "closeWin" pos:[85,142] width:209 height:37 align:#left
	
	label 'lbl1' "This is a Custom win" pos:[17,12] width:166 height:23 align:#left
	colorPicker 'cp1' "ColorPicker" pos:[33,38] width:307 height:30 align:#left
	slider 'sld1' "Slider" pos:[32,83] width:304 height:44 align:#left

	on 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:#left
    
	on ListViewTestWin open do
	(
		--设置ListView的属性
		myList.Fullrowselect = true
		myList.GridLines = true
	    myList.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
		)
		--把数据填充到ListView
	    for 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].text
			print 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:#left
	
	on 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:#left
	
	on btn1 pressed do
	(
		ShowFormFun()
	)

)

rollout CustomPanelTestWin "CustomPanel" width:378 height:80
(
	button 'btn1' "showWin" pos:[78,21] width:209 height:37 align:#left
	
	on btn1 pressed do
	(
		createDialog CustomPanelWin
	)

)



rollout CustomPanelWin "CustomPanel" width:378 height:221
(
	button 'btn1' "closeWin" pos:[85,142] width:209 height:37 align:#left
	
	label 'lbl1' "This is a Custom win" pos:[17,12] width:166 height:23 align:#left
	colorPicker 'cp1' "ColorPicker" pos:[33,38] width:307 height:30 align:#left
	slider 'sld1' "Slider" pos:[32,83] width:304 height:44 align:#left

	on 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
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445876.html

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

相关文章

理解Vuex【Vue】

5. vuex 5.1 理解vuex 5.1.1 vuex是什么 概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式&#x…

AI风范,院士点赞丨北京人工智能峰会暨AI金雁奖颁奖典礼成功举办,实在智能再获AI金雁奖

4月14日,由中国电子商会人工智能委员会主办,中国创业者俱乐部、北京集智未来人工智能产业创新基地联合主办的“2023北京人工智能峰会暨AI金雁奖颁奖典礼”举行,汇聚了人工智能各领域的产学研专家、院士、人工智能企业代表近300人,…

Jenkins自动拉取SVN源代码构建打包vue前端项目

目录 1.功能需求 2.安装插件 2.1 安装NodeJS插件 2.2 安装SVN插件 3.配置环境 3.1 NodeJS环境 4.新建任务配置部署信息 4.1 源代码管理 4.2 构建触发器 4.3 构建环境 4.4 构建步骤 5.构建项目 5.1 点击查看控制台日志 1.功能需求 使用Jenkins从SVN上拉取Vue项…

C#基础学习--异步编程

什么是异步 启动程序时,系统会在内存中创建一个新的进程。进程是构成运行程序的资源的集合。进程是构成运行程序的资源的集合。这些资源包括虚地址空间,文件句柄和许多其他程序运行所需的东西 在进程内部,系统创建了一个称为线程的内核&…

思科实验 EIGRP

1.1.1 实验目的 通过对 CCNA 课程中的 EIGRP 实验部分进行回顾,从而更加准确掌握 EIGRP 路由协议的 配置方法,以及对 network 命令的正确理解。并且学会对 EIGRP 路由协议查看排错的相关命 令。 1.1.2 实验拓扑 拓扑说明:本实验由两台思科路…

ai文案生成器免费-ai文案改写软件免费

让你的文章更加精彩- AI文章润色 在今天的信息化时代,文章编辑变得越来越容易。但是,如何让自己的文章在海量信息中脱颖而出并吸引更多的阅读者却是一项挑战。 如果你是一位写作爱好者或你是一位工作中需要写作的从业者,你会发现你需要让你…

蓝桥杯15单片机--串口通信模块

目录 一、计算机常用通信方式 二、串口通信UART 三、串口通信寄存器 (1)串行口1控制寄存器SCON和PCON ​(2)串行口1数据缓冲器SBUF (3)串行口1辅助寄存器AUXR (4)串行口1中断…

蛇优化算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 蛇优化算法算法流程图初始化进化操作搜索阶段(无食物)——全局搜索搜索阶段(有食物)——局部搜索战斗模式交配模式 备…

SAS学习第9章:卡方检验之适合性检验与独立性检验

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时&#xf…

APP渗透—MobSF安全评估、frida、r0capture抓包

APP渗透—MobSF安全评估、frida、r0capture抓包 1. 前言2. 补充AppInfoScanner相关内容3. MobSF安全评估3.1. 下载MobSF3.2. 安装Docker3.2.1. 查看Linux内核版本3.2.2. 更新yum包3.2.3. 安装Docker软件包3.2.4. 设置yum源3.2.5. 查看Docker版本3.2.6. 安装Docker3.2.7. 设置Do…

计算广告(十六)

营销渠道效果评估与归因 分析背景 营销活动的投放目标通常是品牌知名度和直接效果的结合。除了品牌宣传,受众在品牌指定页面上的浏览、注册、咨询、收藏、成交等,都可作为营销活动的目标转化。衡量投放的渠道各自对目标转化的贡献如何,投入…

成基于时间轮实现的定时器解决方案

文章目录 定时器的使用场景定时器与其他组件的关系定时器与网络事件在一个线程定时器与网络事件在不同线程当中处理大量定时任务怎么处理 定时器设计接口设计数据结构的抉择 时间轮时间轮的概念设计单层级时间轮1、时间轮大小2、时间精度 空推进问题多层时间轮 Skynet定时器实现…

TS-黑马(一)

目录: (1)ts-入门 (2)ts-类型-标注位置 (3)ts-类型-复杂类型 (4)ts-类型-函数类型 (1)ts-入门 我们讲过javaScript语言是动态的语言&#xf…

一次组件化与Android Jetpack的实践

前言 至今为止从事Android开发两年多了,17年开始实习时,恰逢APP刚刚立项不久,当时新项目沿用了旧项目古老的MVC架构。从那之后一直都是根据飘忽不定的需求,没有规则的垒代码。 直到18年中,其他项目组开发的APP要求集…

C语言入门篇——介绍篇

目录 1、什么是C语言 1、C语言的优点 3、语言标准 4、使用C语言的步骤 5、第一个C语言程序 6、关键字 1、什么是C语言 1972年,贝尔实验室的丹尼斯里奇和肯汤普逊在开发UNIX操作系统时设计了C语言,C语言是在B语言的基础上进行设计。C语言设计的初衷…

算法记录 | Day38 动态规划

对于动态规划问题,将拆解为如下五步曲 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509.斐波那契数 思路: 确定dp数组(dp table)以及下标的含义&#x…

Linux应用编程(线程)

与进程类似,线程是允许应用程序并发执行多个任务的一种机制,线程参与系统调度,事实上,系统调度的最小单元是线程、而并非进程。 一、线程概述 什么是线程? 线程是参与系统调度的最小单位。它被包含在进程之中&#x…

shell之自定义mykill(十六)

公众号:Android系统攻城狮 简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】&am…

2023-04-21:用go语言重写ffmpeg的metadata.c示例。

2023-04-21:用go语言重写ffmpeg的metadata.c示例。 答案2023-04-21: 这段 Go 代码演示了如何使用 ffmpeg-go 库中的函数来读取多媒体文件元数据,包括视频、音频等信息。它的大体过程如下: 设置环境变量以加载 FFmpeg 动态链接库…

紫砂壶型和泥料适配茶叶

一、壶型 1、紫砂壶泡茶,一般是壶音频率较高者,适宜配泡重香气的茶叶,如青茶;壶音稍低者较宜配泡重滋味的茶,如乌龙、铁观音。 壶音频率:是将壶盖取下,一手托住壶身一手用壶盖轻敲壶把产生的声音 2、容量在200ml以下…