跳轉到內容

Aros/開發者/ZuneFurther

來自 Wikibooks,開放世界中的開放書籍
Aros 維基百科的導航欄
Aros 使用者
Aros 使用者文件
Aros 使用者常見問題解答
Aros 使用者應用程式
Aros 使用者 DOS Shell
Aros/使用者/AmigaLegacy
Aros 開發文件
Aros 開發者文件
從 AmigaOS/SDL 移植軟體
適用於 Zune 初學者
Zune .MUI 類
適用於 SDL 初學者
Aros 開發者構建系統
特定平臺
Aros x86 完整系統 HCL
Aros x86 音訊/影片支援
Aros x86 網路支援
Aros Intel AMD x86 安裝
Aros 儲存支援 IDE SATA 等
Aros Poseidon USB 支援
x86-64 支援
Motorola 68k Amiga 支援
Linux 和 FreeBSD 支援
Windows Mingw 和 MacOSX 支援
Android 支援
Arm Raspberry Pi 支援
PPC Power Architecture
其他
Aros 公共許可證

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

MUIBuilder

[編輯 | 編輯原始碼]

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

簡單 GUI 佈局

[編輯 | 編輯原始碼]

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 中!

組(將其他 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

區域(所有 GUI 元素的基類)

[編輯 | 編輯原始碼]

每個從 Area 物件繼承的 MUI 物件都在其 GUI 中包含一個暫存器組。

隱藏:物件不會出現在 GUI 中,除非它是視窗中唯一的物件。

停用:物件獲得一個虛影圖案,不響應使用者輸入。

輸入模式:啟用將物件轉換為按鈕。

幻影框架:框架不會出現。

框架:為當前物件定義框架。

背景:定義您希望在物件中使用的背景。

控制字元:啟用給定物件所需的字元。

標題框架:新增到物件框架頂部的標題

某些屬性未提供給某些物件:這不是錯誤...這是一個功能!我不希望使用者能夠在自己的 GUI 中做出錯誤的操作(例如,使用字串框架製作一個按鈕!)。

矩形(間距物件)

[編輯 | 編輯原始碼]

此物件有點複雜,因為它實際上提供了不止一個物件。它可以建立

  • 視窗中的矩形區域
  • 水平條,帶或不帶標題,用於在 GUI 中分隔物件
  • 垂直條,用於在 GUI 中分隔物件

您也可以定義這些物件的寬度和高度。

此物件從 Area 物件繼承。

平衡(平衡分隔條)

[編輯 | 編輯原始碼]

?

影像(影像顯示)

[編輯 | 編輯原始碼]

要為此工具定義影像,您必須選擇要顯示的影像。

可能的選項有

自由垂直:影像將垂直調整大小。

自由水平:影像將水平調整大小。

輸入模式:使用者將能夠選擇影像。

固定高度:將影像高度設定為關聯的字串工具中指定的常數。這使得自由水平變得毫無用處。

固定寬度:將影像寬度設定為關聯的字串工具中指定的常數。這使得自由垂直變得毫無用處。

與其他物件一樣,您必須指定標籤。

關於此 2.2 版本中影像支援的兩個說明

popasl 工具提供了輸入影像檔案的功能(它將使用資料型別進行顯示)

似乎 MUI 中存在動態新增影像的問題:它們似乎沒有正確顯示。因此,當您測試應用程式時,有時影像不會出現。儘管如此,程式碼應該被正確地生成。

此物件從 Area 物件繼承。

[編輯 | 編輯原始碼]

點陣圖(繪製點陣圖)

[編輯 | 編輯原始碼]

主體塊(從 ILBM 主體塊生成點陣圖)

[編輯 | 編輯原始碼]

文字(文字顯示)

[編輯 | 編輯原始碼]

要定義一個文字工具,您必須指定

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);
 }

Boopsi(BOOPSI 工具的介面)

[編輯 | 編輯原始碼]

?

Prop(比例工具)

[編輯 | 編輯原始碼]

設定以下選項

水平:工具必須是水平的

固定寬度:將寬度設定為關聯的字串工具中指定的常數。

固定高度:將高度設定為關聯的字串工具中指定的常數。

然後,您應該指定

條目數量

第一個條目的編號

可見條目數量

一如既往:不要忘記標籤!

此物件從 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 自動文件說這應該是這樣做的,但也許更新的版本不再介意了。

註冊(處理帶標題的頁面組)

[編輯 | 編輯原始碼]

筆調整(調整筆的組)

[編輯 | 編輯原始碼]

虛擬組(處理虛擬組)

[編輯 | 編輯原始碼]

滾動組(帶有捲軸的虛擬組)

[編輯 | 編輯原始碼]

捲軸(傳統的捲軸)

[編輯 | 編輯原始碼]

Listview (listview)

[編輯 | 編輯原始碼]

CheckMark

[編輯 | 編輯原始碼]

您可以指定您是否希望在 CheckMark 之前有一個標題(例如字串和滑塊)。如果您需要一個標題,您可以在 'title' 字串工具中指定它。別忘了指定一個標籤。

此物件從 Area 物件繼承。

Numeric (滑塊工具的基本類)

[編輯 | 編輯原始碼]

Knob (旋轉旋鈕)

[編輯 | 編輯原始碼]

Levelmeter (電平顯示器)

[編輯 | 編輯原始碼]

Numericbutton (節省空間的彈出滑塊)

[編輯 | 編輯原始碼]

Slider (傳統滑塊)

[編輯 | 編輯原始碼]

您可以指定

當前級別是否必須顯示('Slider Quiet')

滑塊是否必須以反向模式顯示

滑塊是否必須有標題

然後您必須指定

最大值

最小值

初始值

您還可以設定

物件的標題

以及它的標籤!

此物件從 Area 物件繼承。

Popstring (彈出物件的基類)

[編輯 | 編輯原始碼]

Popobject (在單獨的視窗中彈出任何東西)

[編輯 | 編輯原始碼]

Popobject 提供了一個列表和一個影像,與您使用 MUIBuilder 建立的任何 MUI 物件相關聯。當您點選彈出影像時,此物件將彈出。它將作為 GUI 中的任何其他物件出現在樹層次結構顯示中,並且可以以通常的方式進行編輯......即使它是一個包含許多其他物件的組。

為了定義這個物件,MUIBuilder 提供了

一個包含可能的影像的列表

一些屬性

  • 跟隨:彈出物件跟隨視窗
  • 燈光:彈出物件在無邊框視窗中顯示
  • 易失:當您點選彈出影像時,物件消失

此處提供的鉤子是

  • 開啟鉤子:在彈出視窗開啟時呼叫
  • 關閉鉤子:在彈出視窗關閉時呼叫

物件的標籤

此物件從 Area 物件繼承。

Poplist (彈出簡單的列表檢視)

[編輯 | 編輯原始碼]

Popscreen (彈出公共螢幕列表)

[編輯 | 編輯原始碼]

此物件允許在您的 GUI 中包含標準的 ASL 請求器。您可以設定的屬性是

您喜歡的影像

請求器的型別,可以是

  • 檔案請求器
  • 字型請求器
  • 螢幕模式請求器

您可以設定一些鉤子

  • 開始鉤子:在請求器建立時呼叫
  • 停止鉤子:在您關閉請求器時呼叫

請求器的標籤

此物件從 Area 物件繼承。

Coloradjust (多個工具來調整顏色)

[編輯 | 編輯原始碼]

Palette (完整的調色盤工具)

[編輯 | 編輯原始碼]

Pendisplay (顯示筆規範)

[編輯 | 編輯原始碼]

Poppen (彈出按鈕來調整筆規範)

[編輯 | 編輯原始碼]

Family (處理多個子項)

[編輯 | 編輯原始碼]

選單可以附加到視窗或應用程式物件。它由多個標題、子選單和專案組成。構建完成後,它類似於樹層次結構,並在選單建立視窗中以這種方式顯示。

唯一的限制是樹的深度限制為 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)),

在程式開頭新增

  1. 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 將使受影響的物件重新佈局,然後觸發繪製方法以使它們在視覺上更新。

您永遠不應該在繪製方法之外繪製。

參考資料

[編輯 | 編輯原始碼]

參見Zune 參考Aros/Developer/Zune

華夏公益教科書