首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

SideShow Gadget 開發實戰 (一):本地 Gadget 與 .NET Micro Framework 實作

     編輯:關於.NET

Windows SideShow 支援兩類 Gadget:本地 Gadget (內建於裝置韌體) 與 常規 Gadget (PC 端動態下發)。本文聚焦本地 Gadget 開發,其本質是運行於 .NET Micro Framework (MF) 上的 SideShow 主程式所載入的 DLL 組件,實現 IDeviceApplication 介面。

平台背景

  • 早期 SideShow 運行於 .NET MF 平台,後移植至 Windows Mobile。
  • MF 僅能運行單一應用程式,SideShow 即為該應用,本地 Gadget 以 DLL 形式被其載入。
  • 與常規 Gadget (SCF/網頁模型) 本質不同:本地 Gadget = 托管代碼直接運行於裝置 CPU,可存取硬體、繪圖、輸入事件。

實戰案例:俄羅斯方塊移植

作者將既有 MF 俄羅斯方塊遊戲在 1 小時內移植為本地 Gadget,展示開發效率。

本地Gadget概念圖 主選單 遊戲界面 程式選單

核心介面實現

1. IDeviceApplication (必要)

public interface IDeviceApplication {
    ApplicationForm GetForm();           // 返回主視窗
    GlanceData GetGlanceData();          // 主選單顯示資料
    void Install(IApplicationCache cache); // 安裝時調用
    void SetShellAttributes(ShellAttributes attributes); // 設定圖示/標題
    void Uninstall();                    // 解除安裝
}

2. ApplicationForm 繼承

public ApplicationForm GetForm() {
    if (form == null) form = new ElsForm(); // 遊戲視窗類
    return form;
}

// 視窗樣式枚舉
public enum Style {
    Default = 0, TitleBar = 1, FullScreen = 2, 
    SizeToContent = 4, Frame = 8, Centered = 16, DimBackground = 32
}

// 繪圖覆寫
public override void OnRender(DrawingContext dc) {
    base.OnRender(dc);
    els.Draw(dc); // 遊戲繪圖邏輯
}

3. 圖示與 GlanceData 設定

public void SetShellAttributes(ShellAttributes attributes) {
    attributes.Name = "Tetris";
    attributes.Icon16Data = Resources.GetBytes(Resources.BinaryResources.ICON_16); // 16x16 標題列
    attributes.Icon32Data = Resources.GetBytes(Resources.BinaryResources.ICON_32); // 32x32 未選中
    attributes.Icon48Data = Resources.GetBytes(Resources.BinaryResources.ICON_48); // 48x48 選中放大
}

public GlanceData GetGlanceData() {
    GlanceData glance = new GlanceData();
    glance.Primary = "YeFan's Tetris";
    if (ElsGame.bGameRunFlag) glance.Secondary = new string[] { "[Run]" };
    return glance;
}

注意:圖示為 BMP 格式原始位元組陣列,非 .ico 檔。

4. 選單實現

public override ArrayList GetMenuItems() {
    ArrayList list = new ArrayList();
    list.Add(new MenuItem("New game", 0));
    list.Add(new MenuItem("Replay game", 1));
    return list;
}

public override void ExecuteMenuItem(MenuItem selected) {
    switch (selected.Id) {
        case 0: ElsGame.bGameRunFlag = false; els.Init(); break; // 新遊戲
        case 1: GameTimer.Start(); break;                        // 繼續遊戲
        case 2: this.GoBack(); break;                            // 返回
    }
}

開發關鍵點總結

  1. 介面契約固定:必須實現 IDeviceApplication,視窗繼承 ApplicationForm,否則平台無法載入。
  2. 繪圖模型同 MF:OnRender 覆寫配合 DrawingContext,與標準 MF 圖形程式設計無異。
  3. 資源嵌入:圖示、字型等資源編譯為二進制資源 (Resources.BinaryResources) 內嵌組件。
  4. 生命週期:Install/Uninstall 可為空,但需實現;SetShellAttributes 只在註冊/更新時調用一次。
  5. 選單 ID 映射:MenuItem.Id 對應 ExecuteMenuItem 邏輯,建議用常數定義。

遷移經驗分享

現有 MF 應用 (遊戲、工具) 移植極簡單:
1. 創建 SideShow 本地 Gadget 專案 (需 SDK 中的 OEM 範本)。
2. 將核心邏輯類複製過來。
3. 實現 IDeviceApplication 介面包裝現有邏輯。
4. 註冊圖示資源。
5. 編譯部署至裝置/模擬器。

現代視角

.NET Micro Framework 與 SideShow 平台已停止更新。現代嵌入式 .NET 開發請關注:
- nanoFramework:MF 社區延續分支,支援 ESP32/STM32 等 MCU。
- Meadow:Wilderness Labs 推出的 .NET Standard 執行環境。
- Windows IoT / UWP:完整 Windows 內核精簡版。
但本地 Gadget 的「介面契約 + 宿主載入」架構思想,在插件系統、模組化韌體設計中仍具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved