Skip to Content
Plugin 開發參考文件API 參考:Widget 與 Canvas

API 參考:Widget 與 Canvas 詞彙

本頁內容與 PDK 內的 docs\NEXUS_TUI_PLUGIN_API_REFERENCE.md 相同(依章節分頁,連結已改成站內連結)。

4.1 NxWidgetEvent 與 NxPropVal

ABI 4.0 的 widget 詞彙整批換成「型別/屬性/事件編號+值容器」:宣告用 .nxlay 檔,狀態用屬性,兩者都不再有逐欄位的結構。編號與值容器在 sdk/nexus_widget_ids.h(由 nx_widget 套件產生,不要手改),nexus 專屬的幾個常數在 sdk/nexus_plugin_api.h。本節說明 Plugin 會碰到的幾個型別;NxPropVal 由套件產生,以整個結構為單位說明;NxWidgetEvent 是手寫結構,逐成員條目接在本節之後。

NxPropVal(屬性值,恆為 24 位元組,x86/x64 相同)

欄位說明
SizeOfStruct呼叫端的 sizeof(NxPropVal);SetWidgetProp()/GetWidgetProp() 都要先填
kindNX_WKIND_*:NONE(取值結果:未設)、I64(含布林與列舉)、U64、F64、STR(UTF-8,len 為位元組數,不含 NUL)、BLOB、COLOR、NODE、ICON_NAME、RES_NAME
flagsNX_WPV_F_*:TOKEN(COLOR 是主題權杖而非 RGB)、BORROWED(指標只在本幀有效)、UNKNOWN(值未知,不得當 0)
u依 kind 選用的內容(i64/u64/f64/str.ptr+len/blob.ptr+len+elem_kind/color/node)

不含 enum 與 #pragma pack;結尾新增欄位只 bump minor,欄位是否存在用 NX_ABI_HAS_FIELD(val->SizeOfStruct, NxPropVal, 欄位名)。

NxWidgetEvent(傳給 on_widget_event,48 位元組,x86/x64 相同)

欄位(偏移)說明
SizeOfStruct(0)Core 寫入端的 sizeof(NxWidgetEvent)
kind(4)NX_WEVT_CHANGED 或 NX_WEVT_ACTIVATED;其他編號保留,Plugin 必須忽略不認得的
prop(6)NX_WEVT_CHANGED 時為變動的 NX_WP_*(目前只有 NX_WP_VALUE),否則 0
modifiers(8)NX_WMOD_* 位元或(Shift/Ctrl/Alt/Win);Host 不回報時為 0(主控台 Host 的滑鼠事件沒有 Alt)
token(12)保留給對話框/選單結果,目前恆為 0
user_data(16)該 widget 的 NX_WP_USER_DATA(未設為 0),為排入佇列當下的值
val(24)新值或位置;kind 為 NX_WKIND_NONE 表示沒有值

事件語意(非同步、尾端合併、作廢規則)見 IcPlugin::on_widget_event。

widget 型別與屬性編號:NX_WTYPE_*(LABEL、VALUE、TEXTBOX、CHECKBOX、DROPDOWN、BUTTON、TABLE、SEPARATOR、METER、SPIN、CHOICE、GROUPBOX、CHART、IMAGE、FILEPICK…,編號 0 ~ 44)與屬性 NX_WP_*、blob 記錄頭(NxItemHead、NxRowHead、NxGuideHead/NxGuideRec、NxSeriesHead)都定義在 sdk/nexus_widget_ids.h;3.x 的 NX_WIDGET_* 與 NX_WF_* 旗標已移除,旗標改為同名的 I64 屬性(NX_WP_OPTIONAL、NX_WP_PASSWORD、NX_WP_ENABLED…)。型別名稱 VALUE_LIST/PROGRESS/RADIO 在 4.0 的編號 6/8/10 分別更名為 TABLE/METER/CHOICE,數值不變。Host 不支援的型別(例如尚未實作者)在版面檔中以 ERR_NOT_SUPPORTED 拒絕。

nexus 專屬常數(sdk/nexus_plugin_api.h)

常數值說明
NX_WIDGET_ROOT0xFFFF面板根的 widget_id(一個 GROUPBOX;面板級屬性設在它上面;CreateWidget() 的 parent_id)
NX_LAYOUT_F_FILE0x1LoadLayout() 的 flags:name 是相對於 Plugin DLL 目錄的檔案路徑
NX_LAYOUT_MAX_BYTES131072一份 .nxlay 的位元組上限(資源、檔案、記憶體三種來源共用)
NX_WLABEL_MAX_BYTES31LABEL/AUX 每段上限(不含 NUL)
NX_WDROPDOWN_ITEM_TEXT_MAX/NX_WTABLE_ROW_TEXT_MAX255ITEMS 每項文字/ROWS 每列名稱與值的上限(不含 NUL)
NX_MAX_WIDGETS_PER_PANEL256每面板 widget 數上限
NX_WPOS_KEYBOARD0x80008000鍵盤觸發 NX_WEVT_ACTIVATED 的位置封裝

NxWidgetEvent::SizeOfStruct

型別:NxDword

意義:Core 寫入端的 sizeof(NxWidgetEvent)(48 位元組),供 Plugin 在結尾新增欄位後判斷欄位是否存在。

合法值/哨兵:Core 填入,Plugin 只讀;判斷後續欄位是否存在用 NX_ABI_HAS_FIELD(evt->SizeOfStruct, NxWidgetEvent, 欄位名),不比較 abi_minor。

何時填:每次 Core 呼叫 IcPlugin::on_widget_event 前。

NxWidgetEvent::kind

型別:NxWord

意義:事件種類,NX_WEVT_*。

合法值/哨兵:NX_WEVT_CHANGED(使用者改了值)或 NX_WEVT_ACTIVATED(widget 被觸發);其他編號保留,Plugin 必須忽略不認得的種類。

何時填:Core 在排入事件佇列時填入。

NxWidgetEvent::prop

型別:NxWord

意義:NX_WEVT_CHANGED 時為變動的屬性編號 NX_WP_*。

合法值/哨兵:目前 NX_WEVT_CHANGED 只會是 NX_WP_VALUE;NX_WEVT_ACTIVATED 一律為 0。

何時填:Core 在排入事件佇列時填入。

NxWidgetEvent::modifiers

型別:NxDword

意義:事件發生當下的修飾鍵。

合法值/哨兵:NX_WMOD_* 的位元或(Shift/Ctrl/Alt/Win);Host 不回報時為 0(主控台 Host 的滑鼠事件沒有 Alt)。

何時填:Core 在排入事件佇列時填入。

NxWidgetEvent::token

型別:NxDword

意義:保留給對話框、選單結果的關聯值。

合法值/哨兵:目前恆為 0,Plugin 不得依賴其他值。

何時填:Core 在排入事件佇列時填入。

NxWidgetEvent::user_data

型別:NxU64

意義:該 widget 的 NX_WP_USER_DATA,為事件排入佇列當下的值(之後 Plugin 再改,這一筆不變)。

合法值/哨兵:未設為 0。

何時填:Core 在排入事件佇列時填入。

NxWidgetEvent::val

型別:NxPropVal

意義:新值或位置。NX_WEVT_CHANGED 為新值;NX_WEVT_ACTIVATED 一律是 NX_WKIND_U64 的位置封裝 (v << 16) | h。

合法值/哨兵:kind 為 NX_WKIND_NONE 表示沒有值;字串值(u.str.ptr)指向 Core 的緩衝,只在 callback 期間有效,要保留請自行複製。

何時填:Core 在排入事件佇列時填入。

4.2 NxCanvasCell

NxCanvasCell::ch

型別:char

意義:該格的字元。

合法值/哨兵:任意字元;'\0' 視為空白。

何時填:呼叫 NxHostApi::DrawRegion 前,依 w * h(逐列排列)逐格填入。

NxCanvasCell::fg

型別:NxByte

意義:前景語意色。

合法值/哨兵:NX_COLOR_* 值域內的合法值。

何時填:同 NxCanvasCell::ch,呼叫 NxHostApi::DrawRegion 前填入。

NxCanvasCell::bg

型別:NxByte

意義:背景語意色。

合法值/哨兵:NX_COLOR_* 值域內的合法值。

何時填:同 NxCanvasCell::ch,呼叫 NxHostApi::DrawRegion 前填入。

NxCanvasCell::reserved

型別:reserved0:NxByte(結構結尾)。

意義:保留給日後在結構結尾追加欄位使用。

合法值/哨兵:一律填 0。

何時填:建構本結構時;Core 不讀取這個欄位的內容。