Symbian應用程序UI架構的設計方法

用於應用程序UI的3種常見應用程序架構有:

1.基於控件的傳統Symbian OS架構

AppUi直接擁有視圖控件,控件繼承自CCoeControl,需要自己去完成 

void SizeChanged(); 

TInt CountComponentControls() const;

 CCoeControl* ComponentControl(TInt aIndex) const;

 void Draw(const TRect& aRect) const;等函數

還可自定義 virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,
  TEventCode aType);等函數

如果需要使用到多個視圖,則可以使用AddtoStackL()和RemoveFromStackL()在不同的視圖之間切換

最後加入到Stack中的那個控件在最上面,擁有程序的焦點,即可以捕捉鍵盤按鍵消息

可以通過 MakeVisible( EFalse/ETrue);來控制在最頂上的控件是否顯示,如最頂上的控件設置爲不顯示

則用戶看到的是次頂層的控件,依次類推,但是MakeVisible不會改變程序的焦點,焦點仍然在最頂層控件上

2.基於對話框的架構

其實是上一種架構的一個特例,可以省去很多實現,使用默認的Dialog的架構

當需要增加一個簡單的視圖時可使用無模式的Dialog,也可以就使用一個模式Dialog

將控件放在裏面.執行完後即退出(如簡單的設置屬性的對話框)

動態改變Dialog裏面控件的初始值:

在PreLayoutDynInitL()中使用Control() 或ControlOrNull()+ 控件ID 獲得控件,並修改其屬性

自定義控件:

只需要在資源文件將控件的type設置爲一個非系統的資源type,然後在

CreateCustomControlL()中創建該控件即可,其他地方和普通系統控件無差別.

(  CreateCustomControlL 中用到的結構體 SEikControlInfo 的 iFlags有時設置爲0,

有時設置爲 EEikControlHasEars 二者有何差別沿不清楚)

對話框中動態增加控件(需使用簡單的資源文件):

使用InsertLineL(),同時還可能用到的函數有TryChangeFocusToL()使增加的控件獲得焦點

資源文件示例:

RESOURCE DLG_LINE r_eikline {
type=EEikCtEdwin;
prompt="New Line";
id=32777;
control=EDWIN { width=10; maxlength=8;};
}

動態增加控件的另一種方法(完全不使用資源文件):

使用CreateLineByTypeL ()

3 AVkon視圖切換架構 

採用了所謂的MVC(Mode_View_Controller)設計模式

其中Mode,View,Controller封閉應用程序的不同部分,可分別對應Document,View,UI.

Mode主要用來儲存數據,並封裝對數據的操作。

View負責顯示,並將用戶輸入發送給Controller

Controller定義程序的行爲,將用戶的動作映射爲Mode的更新.

對多視圖的程序,Controller還要進行View的選擇和管理。

一般在實際應用中一個View對應一個Controller,但也可以是多個View對應一個Controller.

  應用程序一般如此組織:

首先,定義一個繼承自CAknViewAppUi的AppUi,在其 Contruct的時候便new出所要用到的各個View

並將其ownership轉交給CAknViewAppUi,然後指定一個默認的View,程序加載的時候就會先加載這個

默認的View.

其次, 在View DoActivateL的時候new 其對應的Container 並通過AppUi()->AddToStackL將

Container加載到Stack的頂部,使其擁有程序焦點,可以獲得用戶的輸入.

相應的,在DoDeactivate的時候,執行DoActivateL時的反操作

再次, 在Container Contruct時new Mode.

在View 的HandleCommandL中處理用戶的各個菜單命令,DynInitMenuPaneL中動態改變菜單

並且可以重寫Container的OfferKeyEventL()以獲取用戶的鍵盤輸入.

View中可以使用AppUi()將命令傳遞給AppUi來處理.

亦可使用全局的iAvkonViewAppUi來獲得AppUi(不太好,儘量少用)

CCoeEnv::Static()提供了許多功能供使用.

囉囉嗦嗦寫了一大堆!

感覺好亂,想到哪就寫到哪!

要用的時候再來查吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章