用於應用程序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()提供了許多功能供使用.
囉囉嗦嗦寫了一大堆!
感覺好亂,想到哪就寫到哪!
要用的時候再來查吧!