Aros/开发者/ZuneFurther
Zune 类由尾随的 .mui 标识
Family.mui | Application.mui | Window.mui | Area.mui |
---|---|---|---|
Menustrip | Aboutmui | Rectangle | |
Menu | Balance | ||
Menulist | Image | ||
Menubar | |||
Bitmap | |||
Text | |||
Gadget | |||
Gauge | |||
Scale | |||
Colorfield | |||
List | |||
Numeric | |||
Pendisplay | |||
Group |
MUI-Builder 允许您创建应用程序的完整界面。例如,此应用程序的所有窗口都是使用 MUI-Builder 创建的。
每个应用程序都由界面对象的层次结构组成。例如,以下图表描述了一个可能的应用程序。
Application -> One or more Windows -> One or More Objects (maybe in groups)
MUI-Builder 的目标是让您通过使用简单的用户友好图形界面来创建此树。我们将逐步构建一个小型的 GUI,其目标是在我们点击某些按钮时显示简单的文本。
MUIBuilder -> MIUB generic text file -> View to test GUI -> Object Code -> create Guide Docs
MUIBuilder 2.3 应用程序具有 Windows 和 Creation Control 部分。
首先,我们必须通过点击 Creation Control 标题下的 **新建窗口** 来创建一个窗口,这将打开 Windows 属性窗口,该窗口包含 Creation Control 选项卡和属性选项卡。
中间部分的 **添加子元素** 按钮。
在对象选择(即 GUI 对象列表)中选择,然后点击 **文本** 选项按钮(位于底部附近)。
通常会定义其参数(目前您无需修改任何内容),然后点击 **确定**。
- 我们将在未来设置更多窗口和按钮内的选项,例如标签等。
您的文本对象现在已插入 GROUP_ROOT 下,名为 G TX_label_0。
现在,再次通过对象选择添加一个组(通过勾选属性选项卡中的水平组将其设置为水平组)。
如果一切顺利,您将看到组名称位于文本对象下方,例如 H GR_grp_0
选择此组,添加三个按钮(每次选择 GR_grp_0 并 **添加子元素** 和 KeyButton)。只需定义它们的标题“第一个按钮”、“第二个按钮”和“第三个按钮”,以及它们的快捷键“1”、“2”和“3”。
- 您的简单 GUI 现在已完成!现在我们将定义这些对象上的通知。
在 Windows 属性中选择第一个按钮,然后点击 MUIBuilder 窗口底部的 **通知** 按钮。
在出现的窗口中,选择 **释放按钮** 事件,然后选择您之前创建的文本对象(TX_label_0),最后选择 **放置一个常数值** 操作。只需双击操作名称或点击 **添加通知** 即可添加此通知。MUIBuilder 将要求您输入一个字符串。输入“选择第一个按钮”。添加完成后,退出通知窗口。
在其他两个按钮上重复上述操作:输入“选择第二个按钮”和“选择第三个按钮”作为常量字符串。
- 查看按钮
返回创建窗口后,只需按下 **测试** 按钮,然后点击 GUI 上的按钮。
项目菜单中的保存和加载将分别将您正在创建的应用程序的界面保存到文件(#?.MUIB)和从文件加载。使用这些按钮,您可以继续之前未完成的应用程序,或修改现有的应用程序。保存文件是一个 ASCII 文件,因此使用文本编辑器可以轻松地编辑它。请不要以这种方式修改它们:您很可能会损坏文件...
重复上述示例的开头,直到添加文本对象后。
点击 GROUP ROOT(GR_grp_0),而不是 TX_Label,然后点击添加子元素,选择组对象(最上面的选项)
这将自动打开一个 **组选择** 窗口,用于新的 GR_grp_1。
勾选水平组、相同大小、列和水平间距框。将行/列数设置为 5,水平间距设置为 3。点击确定
现在点击这个新添加的选项一次,再次点击添加子元素,选择 Keybutton 添加,重复四次。
单点击 GR_grp_1 并使用 **复制 ->** 按钮将组(带按钮)复制到 tmp 窗口(右侧)
在 tmp 窗口中单击顶部的条目(例如 GR_grp_1)。单击<-Copy按钮四次以复制回
单击Test(底部三个按钮的中心),您现在应该有一个横跨整个宽度且下方有 25 个按钮(5x5)的文本窗口。
(查看结果时,它会在下面添加对象,而不是在旁边)以及
- 代码按钮
单击 MUI-Builder 主窗口的“代码”按钮时,您将开始生成源代码。
MUI-Builder 会验证您是否没有为两个不同的对象使用相同的标签两次。代码选项卡中有两个列表(并排)
- 一个包含您应用程序中所有对象的名称(对象标签列表)
- 一个包含将在您的源代码中生成的标签的名称。(生成的标签列表)
您将能够非常精确地控制 MUI-Builder 在您的代码中生成标签的方式。如果您不关心此选项,MUI-Builder 将自动为您完成所有操作!
在生成源代码之前,您需要在选项选项卡中定义选项。该软件实际上创建的是通用代码,更像是程序的描述,而不是真正的可编译源代码。
创建此通用代码后('T:'中的临时文件),MUIBuilder 会执行一个代码生成模块(位于 'modules' 目录中),该模块使用临时文件。实际上大多数语言都可用。
- 声明:在您的源代码中获取声明和初始化
- 环境:如果您想为包含、事件循环、过程声明等生成代码,请选择它
- 代码:如果您想生成 MUI 代码,请选择它
- 生成 ID
- 通知:生成通知源代码
- 语言环境:生成本地化代码
- 选项选项卡中的语言环境复选框
当您在代码窗口和选项选项卡中选择语言环境框时,您选择生成本地化源代码。实际上,所有字符串和快捷方式都将被调用 'GetString' 函数(它应该从您的目录文件返回语言环境字符串)所替换。
许多程序能够为您生成此函数(例如 Catcomp 和 Flexcat)。'GetString' 函数的名称可以在首选项窗口或代码生成窗口中选择。如果您不知道如何使用这些功能,请查看 MUIBuilder 存档中包含的示例。
请注意,每个选项都可以独立于其他选项选择。您还可以创建您想要的代码的任何部分...
示例
您已创建了一个窗口,并且想要在您的代码中添加一个按钮。仅选择“代码”选项并创建它将创建按钮代码!将此文本插入程序后,您需要在源代码中声明对象按钮。选择“声明”... 并将生成的文本直接插入到您希望在源代码中插入的位置!
- 代码按钮
- 应用程序代码按钮
此按钮使您能够生成整个应用程序的源代码。生成的源代码将取决于您之前选择的选项。
- 对象代码按钮
此按钮使您能够生成您之前在“对象标签”列表中选择的对象的源代码。如果您希望能够创建独立的 MUI 对象,此操作实际上很有意义:例如,您能够独立地生成每个窗口,或者通过调用创建此对象的函数,将一个对象包含在多个窗口中。
通过选择此按钮,您可以停用为“生成的标签”列表中选定的对象生成代码。
MUI-Builder 自动知道它是否必须生成每个对象的标签。例如,保留指向 MUI-Group 的指针变量通常没有用,除非您想在程序执行期间动态地将对象添加到此组中。
删除标签和添加标签按钮使您能够更改 MUI-Builder 对对象的标准定义。
单击此按钮,表示您告诉 MUI-Builder 生成所选对象的标签。
- 目录按钮
生成目录之前必须给出 '.cd' 文件的名称。
以下是对目录描述文件('xxxx.cd' 文件)的必要信息的总结
您将在该文件中找到您的程序的所有字符串(默认语言)。
借助该文件,您可以自动创建(使用 Catcomp 或 Flexcat)
翻译文件('xxxxx.ct' 文件),其中包含外语的字符串。
与您最喜欢的语言相对应的程序源文件。
对于仍然不知道如何本地化程序的所有初学者,我建议使用现在众所周知的 Flexcat 程序(由 Jochen Wiedmann 开发),它将为您提供生成大多数语言代码的可能性。
MUIBuilder 使您能够创建您希望在应用程序中包含的任何 MUI 对象。这些对象可以在主创建窗口(在您按下了主窗口中的“新建窗口”按钮之后)中创建或修改。
要将一些对象对齐,您只需将它们包含在一个多列(垂直对齐)或多行(水平对齐)组中(大多数时候是多列)
一些对象(滑块、复选框、字符串)具有 MUIBuilder 提出的标题。这些标题在 MUI 中不存在:为了给您提供这种可能性,MUIBuilder 将对象及其标题包含在一个水平组中。因此,如果您使用此功能,您将无法将这些对象对齐:只需在一些多列组中使用一些标签 + 无标题对象。
一个经常被问到的问题是:“在我将一些对象添加到我的窗口中之后,GUI 就不再可调整大小了”:只有一个答案:使用空格对象并将它们添加到您的 GUI 中!
组是将所有其他对象放置在其中的基本元素。每次创建对象时,您都需要将其声明为特定组的子级。您可以在列表小部件中选择该组以指定该组。
当您创建一个新窗口时,它已经有一个默认的子级组。此子级对象是根组。您可以通过将子级附加到此根组来定义窗口。请注意,其他组也可能是根组的子级。您必须定义每个组的属性
- 水平:组中的对象将水平放置。
- 注册:该组一次只显示其子级之一。选择此属性后,您必须转到“注册”条目页面以选择注册页面的名称。
- 相同高度:该组的所有子级将具有相同的高度。
- 相同宽度:该组的所有子级将具有相同的宽度。
- 相同大小:该组的所有子级将具有相同的大小。
- 虚拟:该组将是虚拟的。
- 列:将组格式化为列。在字符串小部件中输入列数。
- 行:将组格式化为行。在字符串小部件中输入行数。
- 间距
- 水平
- 使您能够控制对象之间的水平间距。
- 垂直
- 使您能够控制对象之间的垂直间距。此对象继承自 Area 对象。
要获取子级,可以使用 MUIA_Group_ChildList。使用 NextObject() 遍历列表。
要获取父级,可以使用 MUIA_Parent。
如果您不知道子级的数量,或者它是一个变量,您将不得不为方法结构分配一些内存 (sizeof(struct MUIP_Group_Sort) + sizeof(Object *) * num_children),然后使用 DoMethodA(obj, alloced_method) 调用它。然后再次释放方法结构。
num_children = 对子级列表成功调用 NextObject() 的次数。
MUIA_Application_Sleep。嵌套也有效。阻止窗口中所有输入处理。包括调整大小(因为它需要输入处理)。将其设置为 FALSE 恢复工作。
您的应用程序是表示您完整图形界面的依赖树的根节点。通过单击 MUI-Builder 主窗口中的“应用”按钮,您可以设置
- 应用程序的基准,即应用程序的 AREXX 服务器的名称
- 作者的姓名
- 应用程序的名称
- 版本
- 版权文本
- 应用程序的描述
此外,您还会在此窗口的底部找到其他按钮
- 通知在应用程序中添加通知的可能性。它只能有一种子对象
- 窗口。
- 菜单按钮,用于打开菜单创建窗口,您可以在其中创建应用程序菜单。此菜单无法从 MUIBuilder 中测试,因为它必须附加到应用程序!而且我无法在 MUIBuilder 应用程序本身中创建新应用程序!
您都已知道什么是窗口!但问题是如何使用 MUI-Builder 创建窗口……
点击新建窗口按钮后,窗口属性窗口有两个选项卡,一个名为“创建控制”,另一个名为“属性”。
- 创建页面包含 2 个列表
- 在第一个列表中,您构建自己的 GUI。显示提供一个层次结构树。要折叠或展开树的节点,只需双击对象左侧的小箭头即可。借助两个列表之间的按钮,您可以编辑/复制/移动 GUI 对象。此外,菜单提供两个项目“折叠”和“展开”,它们可以使您完全折叠或展开整个树。
- 在最左边的两列中出现两个字母:H(表示帮助)和 G(表示生成):它们分别控制指南文档中的节点生成和源代码中的标签生成。如果您双击其中一个字母,它将切换生成,无论是 AmigaGuide 节点,还是源代码中的标签。
最右侧列表的目的是临时存储一些对象。
- 在“属性”页面中,您可以找到
- 窗口标签和标题。窗口属性本身
- 应用程序窗口:如果您希望窗口成为应用程序窗口
- 无边框:如果您不想要边框
- 深度工具:如果您希望有一个深度工具
- 大小工具:如果您希望有一个大小工具
- 背景:在背景中拥有一个窗口
- 关闭工具:在窗口中放置一个关闭工具
- 拖动条:使窗口可拖动
- 初始化时打开:(重要)这指定了您是否希望在创建应用程序时打开窗口。
繁忙窗口指针使用 MUIA_Window_Sleep 将其设置为 TRUE
每个从 Area 对象继承的 MUI 对象都在其 GUI 中包含一个寄存器组。
隐藏:对象不会出现在 GUI 中,除非它是窗口中唯一的对象。
禁用:对象获得一个虚影图案,不响应用户输入。
输入模式:启用将对象转换为按钮。
幻影框架:框架不会出现。
框架:为当前对象定义框架。
背景:定义您希望在对象中使用的背景。
控制字符:激活给定对象所需的字符。
标题框架:添加到对象框架顶部的标题
某些属性未提供给某些对象:这不是错误...这是一个功能!我不希望用户能够在自己的 GUI 中做出错误的操作(例如,使用字符串框架制作一个按钮!)。
此对象有点复杂,因为它实际上提供了不止一个对象。它可以创建
- 窗口中的矩形区域
- 水平条,带或不带标题,用于在 GUI 中分隔对象
- 垂直条,用于在 GUI 中分隔对象
您也可以定义这些对象的宽度和高度。
此对象从 Area 对象继承。
?
要为此工具定义图像,您必须选择要显示的图像。
可能的选项有
自由垂直:图像将垂直调整大小。
自由水平:图像将水平调整大小。
输入模式:用户将能够选择图像。
固定高度:将图像高度设置为关联的字符串工具中指定的常数。这使得自由水平变得毫无用处。
固定宽度:将图像宽度设置为关联的字符串工具中指定的常数。这使得自由垂直变得毫无用处。
与其他对象一样,您必须指定标签。
关于此 2.2 版本中图像支持的两个说明
popasl 工具提供了输入图像文件的功能(它将使用数据类型进行显示)
似乎 MUI 中存在动态添加图像的问题:它们似乎没有正确显示。因此,当您测试应用程序时,有时图像不会出现。尽管如此,代码应该被正确地生成。
此对象从 Area 对象继承。
要定义一个文本工具,您必须指定
Text_SetMax:工具的最大尺寸将是其初始尺寸。
Text_SetMin:工具的最小尺寸将是其初始尺寸。
标签:在生成的源代码中的标签
文本必须写入关联的字符串工具中,并且可以包含您可以在 C 源代码中找到的任何特殊字符。
此对象从 Area 对象继承。
将所有简单按钮替换为文本对象(和控制字符),因此现在每个人都可以使用数字键盘!:)
TextObject, ButtonFrame, MUIA_Font, MUIV_Font_Button, MUIA_Text_HiCharIdx, '_', MUIA_Text_Contents, text, MUIA_Text_PreParse, "33c", MUIA_InputMode , MUIV_InputMode_RelVerify, MUIA_Background , MUII_ButtonBack, MUIA_CycleChain, 1, End
使字符串编辑框处于活动状态。使用 MUIA_Window_DefaultObject 将确定按钮设置为默认按钮。
(参见 WBRename 工具)
--- a/workbench/system/Wanderer/Tools/WBNewDrawer/main.c +++ b/workbench/system/Wanderer/Tools/WBNewDrawer/main.c @@ -25,7 +25,7 @@ #include <stdio.h> #include <string.h> -char versionstring[] = "$VER: WBNewDrawer 0.6 (09.03.2010) ©2010 AROS Dev Team"; +char versionstring[] = "$VER: WBNewDrawer 0.7 (06.04.2011) ©2011 AROS Dev Team"; static STRPTR AllocateNameFromLock(BPTR lock); static void bt_ok_hook_function(void); @@ -138,7 +138,7 @@ static void MakeGUI(void) set(str_name, MUIA_CycleChain, 1); set(window, MUIA_Window_Open, TRUE); set(window, MUIA_Window_ActiveObject, str_name); - set(window, MUIA_Window_DefaultObject, str_name); + set(window, MUIA_Window_DefaultObject, bt_ok); DoMethod(app, MUIM_Application_Execute); }
?
设置以下选项
水平:工具必须是水平的
固定宽度:将宽度设置为关联的字符串工具中指定的常数。
固定高度:将高度设置为关联的字符串工具中指定的常数。
然后,您应该指定
条目数量
第一个条目的编号
可见条目数量
一如既往:不要忘记标签!
此对象从 Area 对象继承。
要定义一个仪表,您必须设置
其方向(水平或垂直)
如果您希望将仪表的高度设置为常数值,则必须在关联的字符串工具中指定该值。这在水平仪表中特别有用。
如果您希望将仪表的宽度设置为常数值,则必须在关联的字符串工具中指定该值。这在垂直仪表中特别有用。
如果其值必须“除以”(那么给出关联的值)
其最大值
仪表信息测试:此简短文本将显示在仪表本身内。要在此文本中包含仪表的当前级别,只需在信息文本中添加 %ld 即可。
它的标签
此对象从 Area 对象继承。
此对象允许您在两个其他对象之间插入空格,以便窗口可以调整大小。它可以是水平的,垂直的或垂直和水平的。您可以输入水平和垂直空格的间距值。
比例小工具必须与仪表小工具一起使用,以便在其旁边显示刻度。
您只需要指定它的方向。请注意,目前 MUI 中只有水平方向可用。
此对象从 Area 对象继承。
这个简单对象旨在显示屏幕上的颜色。您只需要定义
是否要固定其高度
是否要固定其宽度
字段的颜色
此对象从 Area 对象继承。
要完全定义一个列表,您必须指定
它的标签
是否启用“双击”
是否启用多选
列表是否处于输入模式
是否在创建时调整垂直大小
是否在创建时调整水平大小
您想要向用户显示(激活)的列表部分:- 无特殊定位 - 显示第一个条目 - 显示最后一个条目
列表的类型 - 标准列表
- 浮动文本列表,允许显示文本。您可以在相应的字符串小工具中输入文本
- 卷列表(卷 + 分配)
函数挂钩也可以定义,但它们不是让列表可用的绝对必要条件(参见 MUI-Autodocs!)
- 构造:当您在列表中插入对象时调用
- 销毁:当您从列表中删除对象时调用
- 比较:当您对列表进行排序时调用
- 显示:当您显示对象时调用
- 多重测试:当您执行多选时调用
列表的格式允许定义多列列表(在 MUIBuilder 中未直接测试)。
列表标题。请注意,还有另一种类型的列表称为 DirList。可以通过单击“对象选择”窗口中的按钮来创建此类型的列表。此对象继承自 Area 对象。
目录列表显示选定目录中的文件和目录。可能的选项是
仅抽屉:仅显示目录
仅文件:仅显示文件
多选:启用列表中文件的多个选择
拒绝图标:不显示“ .info”文件
排序高到低:反向排序顺序
排序类型:排序键的选择(名称、日期、大小)
排序目录:三种可能性
- 目录出现在列表的开头
- 目录出现在列表的结尾
- 目录与文件混合(遵循排序类型选项)
要读取的目录
要接受的模式
要拒绝的模式
此对象从 Area 对象继承。
在此列表中,您可以放置要从一个组移动到另一个组,或从一个窗口移动到另一个窗口的对象。当您删除应用程序或加载新应用程序时,列表内容不会被删除。这样,您就可以将对象从一个应用程序传输到另一个应用程序...
要完全定义一个字符串小工具,您必须指定
它的标题(您可以用自己的标题替换它)
它的标签
字符串小工具的初始内容
一个包含小工具接受的所有字母的字符串
一个包含小工具拒绝的所有字母的字符串
字符串的最大长度
此对象从 Area 对象继承。
要完全定义一个按钮,您必须指定
它的标签
将显示在其中的文本
此对象从 Area 对象继承。
要完全定义一个标签小工具,您必须指定
它的标签
显示在屏幕上的文本
此对象从 Area 对象继承。
要完全定义一个循环小工具,您必须指定
它的条目列表
它的标签
如果您为循环小工具指定了控制字符,请添加具有相同控制字符的标签,以便用户可以看到他们需要使用哪个字符!
此对象从 Area 对象继承。
要完全定义一个单选小工具,您必须指定
按钮列表:要添加、删除、重命名此列表的条目,只需使用列表右侧的按钮即可。
它的标签
此对象从 Area 对象继承。
在其他 AmigaOS 中,MUI 提供了很好的两行(在我的代码中为 MUIA_Group_Columns, 3)
MUIA_Group_Child, data->settings[RESOLUTION_RADIO] = NewObject(MyRadioClass->mcc_Class, NULL, MUIA_Radio_Entries, Radio_DPI, MUIA_Group_Columns, 3, MUIA_Radio_Active, 2, TAG_END),
但在 Aros 中,我只有一行
我在此代码中添加了 MUIA_ShowSelState, FALSE,因为在 MorphOS 中,背景被选中并改变状态。这可能也是 ZUNE 的错误,也许应该在 ZUNE 源代码中修复:)。
IPTR muiscanMyRadio_New(struct IClass *cl, Object *obj, struct opSet *msg) for (i = 0; i < entries_num; i++) { state = (entries_active == i) ? TRUE : FALSE; buttons[i] = HGroup, MUIA_ShowSelState, FALSE, Child, (IPTR)ImageObject,
尝试向组中添加另一个不可见对象(子对象,HVSpace),以便组中的对象数量可以被行数平均除尽。MUI 自动文档说这应该是这样做的,但也许更新的版本不再介意了。
您可以指定您是否希望在 CheckMark 之前有一个标题(例如字符串和滑块)。如果您需要一个标题,您可以在 'title' 字符串工具中指定它。别忘了指定一个标签。
此对象从 Area 对象继承。
您可以指定
当前级别是否必须显示('Slider Quiet')
滑块是否必须以反向模式显示
滑块是否必须有标题
然后您必须指定
最大值
最小值
初始值
您还可以设置
对象的标题
以及它的标签!
此对象从 Area 对象继承。
Popobject 提供了一个列表和一个图像,与您使用 MUIBuilder 创建的任何 MUI 对象相关联。当您点击弹出图像时,此对象将弹出。它将作为 GUI 中的任何其他对象出现在树层次结构显示中,并且可以以通常的方式进行编辑......即使它是一个包含许多其他对象的组。
为了定义这个对象,MUIBuilder 提供了
一个包含可能的图像的列表
一些属性
- 跟随:弹出对象跟随窗口
- 灯光:弹出对象在无边框窗口中显示
- 易失:当您点击弹出图像时,对象消失
此处提供的钩子是
- 打开钩子:在弹出窗口打开时调用
- 关闭钩子:在弹出窗口关闭时调用
对象的标签
此对象从 Area 对象继承。
此对象允许在您的 GUI 中包含标准的 ASL 请求器。您可以设置的属性是
您喜欢的图像
请求器的类型,可以是
- 文件请求器
- 字体请求器
- 屏幕模式请求器
您可以设置一些钩子
- 开始钩子:在请求器创建时调用
- 停止钩子:在您关闭请求器时调用
请求器的标签
此对象从 Area 对象继承。
菜单可以附加到窗口或应用程序对象。它由多个标题、子菜单和项目组成。构建完成后,它类似于树层次结构,并在菜单创建窗口中以这种方式显示。
唯一的限制是树的深度限制为 2。(事实上:子菜单不能有子菜单)
此外
标题、子菜单和项目可以使用启用复选框启用或禁用
项目可以访问一些更多属性
- 它可以是可选择的
- 如果可以选择,您可以设置其初始状态
- 您可以为任何菜单项定义快捷键
在我看来,事件通知是 MUIBuilder 2.0 中提供的最好的新功能。这是 Amiga 历史上第一次在界面构建器中包含此类功能。:-)
目标是提供定义事件和动作之间链接的可能性。事件来自 MUI 对象:您将为给定事件定义将执行的动作,以及将在哪个对象上执行该动作。
构建事件-动作链接后,可以通过点击创建窗口上的测试按钮直接在 MUIBuilder 中进行测试。每个不使用应用程序对象和/或外部程序变量的动作都可以在 MUIBuilder 中毫无问题地进行测试。
通知窗口提供
由对象生成的可能事件的列表,该对象的名称出现在窗口顶部
可以执行操作的对象列表。为了帮助您找到特定对象,列表条目按层次结构组织。包含您正在编辑的对象的窗口将首先出现在此列表中,然后是应用程序对象,最后是应用程序中的所有其他窗口。
选择目标对象后,第三个列表将包含可以对该对象执行的所有操作。某些操作需要一些参数...MUIBuilder 可以在需要时询问这些参数。
要向您当前正在编辑的对象添加通知,您需要双击操作列表中的元素,或选择“添加通知”按钮。
应用程序对象收集对您的程序本身执行的所有操作(例如外部变量修改、函数调用...)。
验证操作后,它可能需要参数:如果是,程序将打开一个请求窗口。参数可以是以下类型:
- 函数 - 选择函数名称。
- 变量 - 选择变量名称。
- 常量 - 提供一个常量。
选择要添加通知的对象可以通过两种不同的方式完成:
- 对于窗口:单击“属性”页面上的“通知”按钮
- 对于对象:在创建窗口中选择给定对象,然后单击“通知”按钮。
函数
[edit | edit source]如果操作参数是函数 Hook,MUIBuilder 会询问您函数名称。它将打开一个窗口,其中显示所有现有函数。您可以选择现有函数之一,也可以创建一个新函数。生成源代码时,MUIBuilder 将生成引用这些函数所需的代码。
变量
[edit | edit source]某些操作需要变量作为参数。要获取此变量名称,MUIBuilder 将打开一个窗口,您可以在其中找到现有变量的列表。您可以选择现有函数之一,也可以创建一个新函数。
常量
[edit | edit source]常量可以有多种类型
- 布尔值:2 个可能的 True/False 值
- 字符串
- 整数
- 字符
根据常量的类型,请求窗口中的一个工具将被激活。您需要在此工具中输入所需的值。
MUIBuilder 偏好设置
[edit | edit source]此配置面板提供了许多程序参数选项。所有选项都将保存在环境变量(ENV:MUIBuider.env)中,该变量在您安装 MUIB 时创建。
以下是可用的选项:
1. 幽灵窗口:一次只显示一个 MUIBuilder 窗口。(对于速度慢的计算机以及不喜欢在屏幕上显示太多窗口的人来说非常有用!)
2. 图标:如果您希望使用保存文件创建图标,请选择此选项。
3. 请求:如果您想要所有警告请求器,请选择此选项。
4. 测试:如果您选择此选项,您将在构建 GUI 时看到工作结果。
5. 代码:选择您的生成器模块。
6. 编辑器:您必须在此处指定您最喜欢的编辑器的名称。此编辑器应该以同步方式运行!(即,不作为后台任务)。以下编辑器应该可以正常工作:
7. GetString:如果您在此处输入字符串,它将是用于本地化程序的“GetString”函数的默认名称。如果此字符串为空,则 MUIBuilder 将使用应用程序名称创建名称(“GetApplicationNameString”)。
8. 深度:允许您定义在创建窗口中显示树层次结构时使用的最小深度。
9. 字符:此字符插入树显示中,以使层次结构更易于阅读。
10. 标签:如果设置此选项,将显示对象的名称,以使热键可见。
11. 列:用于显示图像对象的列数。
12. 图像位置:您可以找到对象图像的目录。
选择完这些选项后,您可以选择相应的按钮保存它们。保存首选项时,还会保存工作目录(当然,保存在环境变量中)。
杂项
[edit | edit source]为什么 Zune 使用这种奇怪的 get() 宏?例如
#define get(obj, attr, storage) \ ({ \ union { \ IPTR __zune_get_storage; \ typeof(*storage) __zune_val_storage; \ } __tmp; \ __tmp.__zune_val_storage = *storage; \ ULONG __zune_get_ret = GetAttr((attr), (obj), &__tmp.__zune_get_storage); \ *(storage) = __tmp.__zune_val_storage; \ __zune_get_ret; \ })
为什么不简单地
#define get(obj,attr,store) GetAttr(attr,obj,(IPTR *)store)
??
第一个宏的问题在于它访问指针的内容,因此像这样的代码
int x; get(listview, MUIA_NList_Active, &x);
会引发大量的“函数中使用未初始化的变量'x'”警告,因为宏从指针中读取...但它不应该这样做,因为调用 get() 时“x”中的内容无关紧要。
我认为原因是最近 GCC 版本中的严格别名“问题”。(至少这是我记得的)。我认为想法是让这样的代码
ULONG var; get(obj, attr, &var);
在 64 位 AROS 上运行,无需“ULONG -> IPTR”源代码更改。但我认为它在大端 64 位 CPU 上不会起作用。
它仍然很尴尬,因为它甚至会破坏一些代码。例如,以下代码无法与新的 get() 宏一起使用
ULONG *rgb; get(obj, MUIA_XXX_Picture, (ULONG) &rgb);
ULONG 转换在这里会导致 gcc 错误。我必须删除它才能构建它或切换到旧宏。非常烦人...
有没有办法让 Network Prefs 用于输入接口详细信息的子窗口更大?我现在为此添加了第二个类似的窗口来指定无线网络,问题更严重,因为用于输入加密密钥的框太小了。我已经尝试过使用 MUI 标签指定更大的尺寸或添加一个调整大小的工具,但失败了。这是程序中的错误还是 Zune 中的错误?
这是因为 MUI/Zune 用于计算最小/最大尺寸的规则。来自 MUIdev.guide
- 垂直组 - 垂直组的最小高度是其所有子级的最小高度之和。垂直组的最大高度是其所有子级最大高度之和。垂直组的最小宽度是其所有子级中最大的最小宽度。
垂直组的最大宽度是其所有子级中最小最大宽度。
因此,如果您有一个垂直组,其中包含一个或多个(水平)可调整大小的对象,以及一个或多个具有固定宽度的对象,则该组将获得一个固定的最大宽度,即不可调整大小。
因此,请确保 vgroup 的所有子对象在水平方向上都是可调整大小的
Index: netpeditor.c =================================================================== --- netpeditor.c (revision 35370) +++ netpeditor.c (working copy) @@ -373,11 +373,15 @@ MUIA_Window_CloseGadget, FALSE, WindowContents, VGroup, GroupFrame, - Child, ImageObject, - MUIA_Image_Spec, (IPTR)"3:Images:interface", - MUIA_FixWidth, 52, - MUIA_FixHeight, 48, - End, + Child, HGroup, + Child, (IPTR)HVSpace, + Child, ImageObject, + MUIA_Image_Spec, (IPTR)"3:Images:interface", + MUIA_FixWidth, 52, + MUIA_FixHeight, 48, + End, + Child, (IPTR)HVSpace, + End, Child, (IPTR)ColGroup(2), GroupFrame, Child, (IPTR)Label2(_(MSG_IFNAME)),
在程序开头添加
- define MUIMASTER_YES_INLINE_STDARG
您不需要在 MUI_Request 中添加额外的参数。
恕我直言,最好研究相关 MUI 类的实际行为,找出应该发生的事情以及我们为什么/如何有所不同,并相应地修复 Zune。
MUI 和 zune 之间的区别在于,MUI 将所有重绘消息都推入并稍后重绘,在弹出所有消息时一次重绘,并避免双重重绘。AROS 立即重绘。将 AROS 更改为执行相同操作的问题是,如果推送重绘并且类已删除,该怎么办。对象应该知道已推送的重绘,并且应该在自身删除时将其删除。
Morphos 在子类化方面有一些细节。
似乎是 MUI 数据空间的“设计问题”,配置数据被存储和加载为字节流,此时原始类型未知。muimaster/classes/dataspace.c 和 notify.c 例如,另一方面,BetterString 将所有配置数据存储为字符串。
在 zune 偏好设置中选择 NListTree,选择“示例”选项卡,然后选择任何其他类 -> 崩溃。
这可能是这个长期存在的bug。Georg 给出了一些建议,但我无法实现它们。
我有一个针对该问题的解决方案。它需要一个新的属性 MUIA_Group_InExchange。在 MUIM_Group_InitChange 中,我们检查是否存在父级,以及它或其父级之一是否处于交换状态。如果是,我们不设置交换状态标志,因为重算显示将由对象的父级之一完成。如果不是,我们为当前对象设置交换状态标志,并且重算显示将在 MUIM_Group_ExitChange 时发生。我绝对是 mui 编码新手,但通常在 OOP 中,在同一个类中完全处理某件事是最佳实践。
Init/Exit Change 可能对您有所帮助。
如果更改 GUI 元素,请先调用父组,并在修改后调用 MUIM_Group_ExitChange。
您也可以在初始化和退出之间强制刷新,而无需任何内容:DoMethod(groupobj, MUIM_Group_InitChange); DoMethod(groupobj, MUIM_Group_ExitChange);
没错,Zune 的设计是自动定位/调整对象的大小。因此,您必须告诉父对象您要更改自身,最后还应该使其他“子对象”相应调整。这就是必须进行 initchange/exitchange 操作的全部目的。
Zune 将使受影响的对象重新布局,然后触发绘制方法以使它们在视觉上更新。
您永远不应该在绘制方法之外绘制。