UIQ3開發(fā)白皮書系列-視圖、命令、資源文件及布局的使用_第1頁
UIQ3開發(fā)白皮書系列-視圖、命令、資源文件及布局的使用_第2頁
UIQ3開發(fā)白皮書系列-視圖、命令、資源文件及布局的使用_第3頁
UIQ3開發(fā)白皮書系列-視圖、命令、資源文件及布局的使用_第4頁
UIQ3開發(fā)白皮書系列-視圖、命令、資源文件及布局的使用_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

一、簡介

在前一個白皮書中(參看[1])討論了:如何使用應用程序框架,最后生成了一個具有空視圖的應用程序。在本文中,繼續(xù)在程序中添加功能。但是首先我們先介紹一些基本的概念,通過\o"英語閱讀網(wǎng)@V"閱讀本文,你可以:

?更好地\o"吾愛英語學習網(wǎng)@V"理解UI配置,

?更好地理解Build塊的概念。

?更好地理解命令處理框架CommandProcessingFramework(CPF)的概念。

?掌握如何從資源文件構造視圖內(nèi)容。

?掌握如何在視圖中處理命令,

?掌握如何在不同的UI配置中調(diào)整視圖.

在前一白皮書中提到的:

?切換模型的\o"韶關人才招聘第一品牌@V"工作方式

?如何在不同的程序之間切換

將放在以后的白皮書中介紹。二、UIQ3中的一些基本概念

2.1簡介

UIQ3引入了一些新的概念,本文檔重點介紹其中的三個,這些背景知識將在下一章中使用。1.第一個概念在前一白皮書中已經(jīng)提到過(參看[1]):UI配置.本文將更詳細地進行討論.

2.第二個概念:命令處理框架CommandProcessingFramework(CPF),該框架取代了以前的菜單系統(tǒng),允許我們以比菜單系統(tǒng)更抽象的方式處理命令。

3.第三個概念是\o"地產(chǎn)匯中國房地產(chǎn)知識平臺@V"管理布局的一種,\o"上海交通大學海外教育學院@V"構建程序的一種方式。在UIQ2.x中,因為所有內(nèi)容必須手工創(chuàng)建,因此程序的布局非常難以處理,現(xiàn)在,我們有三種方式來布局我們的程序:

(a)Listbox:列表框是布局相似\o"2008最新流行時尚資訊@V"信息的一種簡單方式。在UIQ2.x中也可以使用列表框,但是使用起來非常困難,幾乎不可能創(chuàng)建自己的布局。

(b)Layoutmanager:布局管理器在其它的平臺上非常\o"泉州人論壇@V"流行(參看[6]),它允許在一個區(qū)域放置不同的控件,而且大多數(shù)情況下,取代了控件的手工布局。UIQ布局管理器包括:

?行布局管理器

?流布局管理器

?網(wǎng)格布局管理器

?列布局管理器

(c)Buildingblock:Build塊是布局控件的一種新方式,Build塊結(jié)合了布局管理器的強大功能,同時提供了列表框控件。

本文檔不討論listbox和layoutmanager,它們將在以后的白皮書中討論(或者參看[2]).我們只討論buildingblock。

4.第4個概念我們不再詳細介紹了,因為我們整個白皮書都是基于這種概念的:資源文件驅(qū)動的布局,Resource-File-Driven

Layout.

2.2UI配置

2.2.1簡介

UI配置的概念已經(jīng)介紹過了(參看[1]).當時,介紹了模擬器的在2種不同的配置情況:筆風格和軟鍵風格的UI配置。在上一個白皮書中最后完成的程序在這2種配置下均可工作。在筆風格UI配置下,可以看到“后退”按鈕,如果運行在軟鍵風格UI配置下,該按鈕自動消失。對我們的程序來說,這種變化是透明的,在設計程序的時候就應該考慮這個問題,以便找到一個差異最小的設計方案。通常為設備添加一個觸摸屏問題并不大,因此:推薦先針對軟鍵模式開發(fā),然后在觸摸屏模式下進行\(zhòng)o"成都問鼎科技@V"優(yōu)化,這也是本文要做的主要內(nèi)容,因此,先配置模擬器運行在軟鍵UI配置下,在命令行中輸入:QUOTE:cmd>uiqenv-uisoftkey那么不同UI配置的區(qū)別是什么?在不同UI配置下運行UIQ最終意味著什么?接下來我們將要給出一個概括性的概念,你將看到它對程序員的影響。需要注意的是只有特定的配置特性通過UI配置處理,我將還會介紹一些不能被UI配置處理的自定義區(qū)域.

2.2.2一般性介紹

UIQ軟件平臺功能非常強大,可以通過很多高層的配置參數(shù)進行配置。這些參數(shù)目前包括:

Screenmode:屏幕模式是定義屏幕分辨率的方式.目前包括4種已定義的屏幕模式(分辨率如下):

?縱式(QVGA,240x320pixels)

?橫式(QVGA,320x240pixels)

?小型縱式(240x256pixels)

?小型橫式(256x240pixels).

上述的分辨率僅僅是粗略的大小,\o"農(nóng)夫山泉@V"實際屏幕分辨率取決于具體設備,可能有所變化。如果需要知道精確的分辨率,需要查詢\o"黑大創(chuàng)力@V"顯示屏設備的廠商。

屏幕朝向(orientation):表示是否使用正?;蚍聪蚰J剑ㄆ聊恍D(zhuǎn)180度)。通常會以正常模式來開發(fā)應用,因為屏幕的朝向?qū)δ拈_發(fā)不會有多大影響。

觸摸屏:顯示該應用程序能否被優(yōu)化來充分利用數(shù)字轉(zhuǎn)換器。并非所有的應用程序都可受益于此類優(yōu)化(例如動作類游戲),這取決于硬件是否支持。下文會解釋,應用程序?qū)⒁捎玫闹饕换ワL格是決定是否為觸摸屏進行優(yōu)化的更佳依據(jù)。

交互風格:目前有2中不同的交互風格

?筆風格(pen-style),為手寫筆進行優(yōu)化(筆風格用戶界面并不意味著交互必須使用手寫筆進行);

?軟鍵風格(softkey-style),為單手操作進行優(yōu)化。

這些UI參數(shù)結(jié)合起來被稱為UI配置,并可通過唯一地ID辨認。頭文件Qikon.hrh含有一些預設的UI配置,例如:KQikSoftkeyStylePortrait。將來還可能添加其他配置參數(shù)。該文件還說明了這些ID如何使用。

2.2.3UI配置可以提供的內(nèi)容

上面介紹的UI配置參數(shù)僅僅是目前我們用到的,其他的配置用做將來的擴展.UIQ3手機不一定要在單一的UI配置中運行,例如,

SonyEricssonP990可運行在下述六種屏幕模式里:

?KQikSoftkeyStyleLandscape

?KQikSoftkeyStylePortrait

?KQikSoftkeyStyleLandscape180

?KQikSoftkeyStyleSmallLandscape

?KQikSoftkeyStyleSmallPortrait

?KQikSoftkeyStyleSmallLandscape180.

2.2.5其它自定義區(qū)域

注意:并非所有的自定義可以通過UI配置來處理,UI配置只指定高層參數(shù),手機廠家具有風格化UIQ3的高度自由。請勿做以下假設:

?屏幕組件(例如狀態(tài)欄)的具體外觀和位置;

?指令分布——請遵照指南;

?硬件按鈕的映射(例如,假設具有非觸摸屏UI配置的手機應至少提供四個方向的導航及確認按鈕);

?缺省字體大小。

在某部手機上,狀態(tài)欄位于屏幕頂端,在另外一部,可能在底部,而在第三部里,可能在屏幕的邊上。

2.3指令處理框架CommandProcessingFramework(CPF)

2.3.1簡介

如前所述,UIQ允許自定義擴展,軟件在設備上需要能夠變化,因此,需要一些適當?shù)闹С?例如,不必總是需要菜單欄,軟件不能假設擁有這些元素,以及直接處理它們.在沒有觸摸屏的設備上,軟件的按鈕顯然是不太有用,因此,需要有一種方法將"按鈕"轉(zhuǎn)換為其它的元素.所以.軟件不能真地決定指令在哪里執(zhí)行,因為這取決于UI配置,是否擁有菜單欄,按鈕,軟鍵,或者可能是硬鍵.我們必須把指令處理和指令顯示分離開來,這通過指令處理框架(CPF)來完成(參看[10]),系統(tǒng)來決定顯示指令的合理位置.(在特定的設備上提供哪些按鈕,有一些特定的要求,例如:沒有觸摸屏UI配置的設備需要提供至少4中切換方式,一個確認按鈕).

程序只須定義它提供什么指令,這些指令如何顯示由CPF來決定.如果程序運行在軟鍵配置下,這些指令應該總能顯示.因此,這些指令必須能夠反映正確的狀態(tài)(可見,暗化,選中等).所以,當打開菜單面板時,這些指令不可能動態(tài)初始化.DynInitMenuBarL和DynInitMenuPaneL因此不能使用.另外,應該注意新的系統(tǒng)與UIQ2.x中使用的舊的菜單系統(tǒng)之間的兼容性.這樣才能方便移植.重要的特性下面介紹,更多信息參看[2].

篇幅原因,此處僅提供commandprocessingframework的簡要介紹,CPF提供的優(yōu)點包括:

1.分布式指令生成

2.分布式的抽象指令提供

3.分布式指令處理

2.3.2設計概要

指令模型:UIQ通常擁有視圖結(jié)構,每個視圖擁有自己的一系列指令,當進行視圖切換時,指令集進行相應的切換.當彈出對話框時,指令集也進行適當?shù)那袚Q,因此,每個視圖,對話框,或者彈出對象都擁有自己的指令模型.只有在正確指令模型里面的指令才會被顯示.

分布式指令生成及處理:一般,指令模型由幾個控件組成.例如,一個視圖可以擁有一個具有文本的編輯框,用戶應該提供一些指令處理文本,如:“剪切”,“復制”,和“粘貼”.這些指令除了可以被視圖管理,也可以由控件自己直接處理.

CPF允許指令模型由多個控件組成.每個組成構建自己的指令列表.

上述內(nèi)容形成了指令管理器commandmanager(CQikCommandManager),組成了所有功能的入口點(參看下圖).指令管理器只有一個能夠被程序進行全局訪問.(控件棧上的任何控件都有自己的指令模型,只有擁有焦點的激活控件能夠被使用).這使得FEP能夠在當前視圖中添加自己的指令.

未命名.JPG

需要說明的是CQikCommand不是一個抽象接口,而是一個具體的類.從資源文件創(chuàng)建的指令總是從這種類型.,也可以重載這個類以提供其他功能.指令甚至可以自己實現(xiàn)MQikCommandHandler接口,然后自己處理.

組成部件:這里介紹指令模式的參與者,以及相應UIQ接口:

客戶:生成指令并將指令添加到框架的實體.客戶負責設置接收者,也就是每個指令的處理器.在UIQ3框架中客戶是一個CCoeControl對象,并且實現(xiàn)MQikCommandModelOwner接口.

接收器:執(zhí)行與指令相關的動作.接收器實現(xiàn)MQikCommandHandler接口.

激發(fā)器:請求相應的指令發(fā)出執(zhí)行請求.例如,軟鍵欄和程序的標題欄就是激發(fā)器.激發(fā)器實現(xiàn)MQikCommandOperator接口.

注意:不一定要指定指令處理器,這種處理方法與UIQ2.x軟件非常相似,所有的指令在AppUi種處理.

指令操作器:有兩種不同的指令操作器:默認的指令操作器由應用程序框架安裝,自定義的操作器可以在特定的情況下安裝.后者允許以自定義的方式處理指令.自定義的處理器要求確保它能夠在所有的UI配置(甚至是未知的)上正常工作,這使得它們的實現(xiàn)更巧妙,因此,推薦:避免使用自定義的操作器.

注意:指令操作器不必擁有可見的界面.甚至某些硬鍵也是如此處理,例如"后退"或"確認"鍵.其它的鍵通過OfferKeyEventL()函數(shù)處理,不使用CPF操作器處理.

2.4BuildingBlock(BB)

buildingblock是UIQ3引入的新概念,用于加快在視圖中的布局創(chuàng)建.創(chuàng)建視圖時,可以選擇想要使用的buildingblock.每個buildingblock擁有一些空隙,在每個空隙里,可以放置任何控件.每個buildingblock有一個設置,指定其屬性如:頁邊,對齊及大小.簡單點說:選擇buildingblock,使用控件填充空隙,將buildingblocks放進視圖,你的布局就完成了.

Buildingblock的示例如下圖:

未命名.JPG

Buildingblock也是普通的控件,不過沒有可見的界面及狀態(tài)信息,因為它們僅僅是其它控件的容器,僅僅負責這些控件的放置.因此,如果你想要替換視圖的布局,可以使用新的buildingblock替換當前的buildingblock.

在這種布局切換過程中,可能發(fā)生下面3種情況:

1.新布局要求的控件已經(jīng)是舊布局的一部分:這種情況下,該控件應當重用,并且保持其狀態(tài)信息.

2.新布局不需要舊布局中的控件:這種情況下,該控件不再繼續(xù)使用,我們可以隱藏它或者刪除它.

3.新布局要求使用一個舊布局中沒有的控件:這種情況下需要構造控件,如果控件已經(jīng)構造但是不可見,那么設置它可見.

使用buildingblock時,即可以使用系統(tǒng)的buildingblock,也可以自己創(chuàng)建.推薦盡可能使用系統(tǒng)的,優(yōu)點如下:

?所有使用系統(tǒng)buildingblocks能夠獲得一致的外觀

?所有的buildingblocks的行為經(jīng)過了合理定義,使得可以估計可用的字符串空間(對于特定的設備),這可以節(jié)約轉(zhuǎn)換和本地化的時間,因為可以估計字符串被截斷的情況.

如果系統(tǒng)的buildingblock不能滿足需要,可以創(chuàng)建自定義的buildingblock.在示例程序?qū)⑹褂孟到y(tǒng)buildingblocks.如何創(chuàng)建自定義buildingblock參看[2].

前面說過UIQ3也引入了布局管理其,但是它們很少使用.大多數(shù)情況,僅用于布局不同的buildingblocks(通常是行方式).大多數(shù)系統(tǒng)組件在內(nèi)部使用布局管理器,但是沒有給開發(fā)者開放.如果你想要在程序中使用,請參看[7].

三、視圖布局的構造

3.1簡介

本章將重點通過擴展前一白皮書中實現(xiàn)的程序,介紹如何從資源文件構造視圖.上次,我們通過代碼直接構造所有的內(nèi)容,雖然沒有包含任何控件,但是工作的非常好.本章目標是:完全從資源文件構造視圖(包括所有控件及布局).雖然可以直接從代碼中直接創(chuàng)建,但是需要程序員做更多工作,包括:

?控件構造

?控件的擁有關系

?焦點處理

?布局處理

?視圖繪制處理

?屏幕模式切換

資源結(jié)構允許用戶極大的自由,因此剛開始會覺得比較復雜,因為它們可以分解成較小的子結(jié)構,這可能會導致更復雜,但是分割使得我們更容易理解如何創(chuàng)建視圖,參看下圖:展現(xiàn)了資源文件中的不同結(jié)構,以及它們之間的關系.

未命名.JPG

跟我們在UI配置節(jié)看到的以至,視圖外觀根據(jù)運行環(huán)境的UI配置的改變而不同.剛開始,我們只為單個的UI配置定義一個視圖:軟鍵風格.這不代表它不能在其它的UI配置下運行,僅代表該視圖是針對軟鍵風格優(yōu)化的.其它的UI配置,我們沒有精確定義,應用程序框架自動選取合適的風格.第一步,我們將創(chuàng)建一個空的,然后逐步加入更復雜的內(nèi)容.

3.2目錄結(jié)構

按慣例先說明需要添假和修改的文件的目錄結(jié)構,大多數(shù)修改主要是針對資源文件,另外還要添加一些bitmap和一個hrh文件,如下圖:

UIQ3_Whitepaper_02_View_Commands_ResourceFilesLayout.jpg

3.3基本資源文件的修改

3.3.1簡介

先來做一些準備工作.首先,需要定義一個我們視圖所要使用的資源文件結(jié)構(QIK_VIEW_CONFIGURATIONS),它定義了視圖的布局以及指令,指令在下一章討論,現(xiàn)在留空.到后面我們會看到:不在視圖布局中定義控件會帶來的便利性,控件定義在QIK_CONTROL_COLLECTION結(jié)構中.現(xiàn)在我們先提供它,盡管還不使用.定義完這2個結(jié)構(雖然只是空的)后,從資源文件構造視圖.我們應該能夠通過修改資源文件,創(chuàng)建視圖布局的剩余部分.

3.3.2視圖結(jié)構的定義

資源文件結(jié)構應該至少包括下列結(jié)構,QHelloWorld.rss資源文件的內(nèi)容:QUOTE://QHelloWorld.rss

#include<Qikon.hrh>

#include<Qikon.rh>

RESOURCEQIK_VIEW_CONFIGURATIONSr_qhelloworld_view_config

{

configurations=

{

QIK_VIEW_CONFIGURATION

{

ui_config_mode=KQikSoftkeyStylePortrait;

view=0;

command_list=0;

}

};

}

前面說過,我們將在軟鍵風格的UI配置下繼續(xù)演示示例,因此只為KQikSoftkeyStylePortrait定義了一個視圖.

然后定義一個控件集合的結(jié)構,如下:QUOTE://QHelloWorld.rss

RESOURCEQIK_CONTROL_COLLECTIONr_qhelloworld_control_collection

{

items=

{

};

}

顯然,大部分結(jié)構還是空的,但是已經(jīng)足夠我們修改視圖的構造代碼來使用它們.

3.3.3第一次從資源文件構造

視圖的構造代碼原來是:QUOTE://QHelloWorldView.cpp

voidCQHelloWorldView::ViewConstructL()

{

CQikCommandManager&cmdManager=CQikCommandManager::Static();

cmdManager.CreateCommandListL(*this);

}現(xiàn)在修改為:QUOTE://QHelloWorldView.cpp

#include<QHelloWorld.rsg>

voidCQHelloWorldView::ViewConstructL()

{

ViewConstructFromResourceL(R_QHELLOWORLD_VIEW_CONFIG,

R_QHELLOWORLD_CONTROL_COLLECTION);

}

當然,需要在自動創(chuàng)建的資源文件中包含rsg文件,以便能夠找到我們的資源結(jié)構,當從資源文件創(chuàng)建視圖時,視圖保證為我們創(chuàng)建合適的指令列表,所以我們不再需要CreateCommandListL()函數(shù)了.執(zhí)行如下命令重新編譯程序:QUOTE:cmd>abldbuildwinscwudeb因為還沒有定義布局,因此現(xiàn)在還看不到界面上的任何差異,接下來我們將介紹這些內(nèi)容:創(chuàng)建布局.

3.4創(chuàng)建布局

3.4.1簡介

現(xiàn)在可以決定我們的視圖里可以包含什么了.首先我們要添加一個buildingblock,其中包含一個控件.在創(chuàng)始它們之前,需要先定義視圖結(jié)構.

3.4.2定義視圖布局結(jié)構

視圖結(jié)構非常簡單,因為我們將使用大部分默認值QIK_VIEW結(jié)構定義如下:QUOTE://QHelloWorld.rss

RESOURCEQIK_VIEWr_qhelloworld_view

{

pages=r_qhelloworld_viewpages;

}此處聯(lián)接到QIK_VIEW_PAGES結(jié)構:QUOTE://QHelloWorld.rss

RESOURCEQIK_VIEW_PAGESr_qhelloworld_viewpages

{

pages=

{

QIK_VIEW_PAGE

{

page_content=0;

}

};

}

下一節(jié)我們將定義page_content此處留空(定義為0).再重新編譯之前,需要更新QIK_VIEW_CONFIGURATION結(jié)構,聯(lián)接到QIK_VIEW,結(jié)果如下:QUOTE://QHelloWorld.rss

RESOURCEQIK_VIEW_CONFIGURATIONSr_qhelloworld_view_config

{

configurations=

{

QIK_VIEW_CONFIGURATION

{

ui_config_mode=KQikSoftkeyStylePortrait;

view=r_qhelloworld_view;

command_list=0;

}

};

}

為避免重新編譯不必要的內(nèi)容,我們需要將新的結(jié)構添加到資源文件的末尾,如QIK_VIEW_CONFIGURATIONS和QIK_CONTROL_COLLECTION結(jié)構在文件中的位置不變.

然后重新編譯程序,執(zhí)行:QUOTE:cmd>abldresourcewinscwudeb為確保修改是正確的,可以在模擬器中運行程序測試,不過不要期望看到可見的變化.

3.4.3創(chuàng)建buildingblock

現(xiàn)在可以給程序添加可見的修改了.從系統(tǒng)buildingblocks(參看[28])里選擇使用IconCaptionedOnelineBuildingBlock,這個buildingblock帶有一個小圖標,一個標題,一個任意控件.這個buildingblock通過枚舉值EQikCtIconCaptionedOnelineBuildingBlock標識,定義在QikStockControls.hrh文件中.

UIQ提供的大多數(shù)控件又叫做stock控件,通過工廠函數(shù)創(chuàng)建.在UIQ2.x中,這個原則適用于從資源文件創(chuàng)建對話框.在此,該原則用于構造視圖,包括buildingblocks.

首先定義一個

QIK_XXX_CONTAINER_SETTINGS結(jié)構.有兩種選擇:

QIK_CONTAINER_SETTINGS是默認的容器,它不添加任何滾動欄.如果在整個頁面里只想包含一個控件,它就非常方便.任何滾動條可以由容器內(nèi)的控件提供,這類容器的典型的例子就是列表框.如果控件比較多,可能會被放到可見區(qū)域之外,導致不可訪問.

QIK_SCROLLABLE_CONTAINER_SETTINGS適合于不止一個控件的情況,如果控件擁有自己的滾動條,那么就不應當使用該容器,因為你可能會面臨2個滾動條,(一個是容器的,另一個是控件自己的l).

起初,我們只有一個控件,但是后面可能會使用更多的控件,因此我們選用QIK_SCROLLABLE_CONTAINER_SETTINGS結(jié)構(而不是使用缺省值).在此結(jié)構里面,需要分別定義容器的元素.有多個QIK_CONTAINER_ITEM_XXX資源結(jié)構可以使用,允許直接使用結(jié)構或者間接聯(lián)接.可用的結(jié)構包括:

?QIK_CONTAINER_ITEM

?QIK_CONTAINER_ITEM_CI_LI

?QIK_CONTAINER_ITEM_CD_LI

?QIK_CONTAINER_ITEM_LD

?QIK_CONTAINER_ITEM_CI_LD

?QIK_CONTAINER_ITEM_CD_LD

?QIK_CONTAINER_ITEM_NESTED_CONTAINER

?QIK_CONTAINER_ITEM_NESTED_CONTAINER_CI_LI

這些結(jié)構的區(qū)別請參看SDK文檔,或者參看Qikon.hrh文件中的結(jié)構定義.在示例中,我們直接內(nèi)含定義我們的控件,但是不想自定義布局的數(shù)據(jù),因此我們選擇QIK_CONTAINER_ITEM_CD_LI結(jié)構,而留空布局的數(shù)據(jù).第一步,我們不定義任何控件,除了buildingblock.因為

buildingblock不包含任何可見內(nèi)容,因此做了修改之后仍不能看到變化:QUOTE://QHelloWorld.rss

#include<QikStockControls.hrh>

RESOURCEQIK_SCROLLABLE_CONTAINER_SETTINGSr_qhelloworld_page_content

{

controls=

{

QIK_CONTAINER_ITEM_CD_LI

{

type=EQikCtIconCaptionedOnelineBuildingBlock;

control=

{

QIK_SYSTEM_BUILDING_BLOCK

{

content=

{

};

}

};

}

};

}

不要忘記更新QIK_VIEW_PAGE結(jié)構,指定我們使用一個滾動容器EQikCtScrollableContainer),聯(lián)接到其定義(QIK_SCROLLABLE_CONTAINER),它定義了滾動容器的行為,并且指定了使用的頁面內(nèi)容:QUOTE://QHelloWorld.rss

RESOURCEQIK_VIEW_PAGESr_qhelloworld_viewpages

{

pages=

{

QIK_VIEW_PAGE

{

container_type=EQikCtScrollableContainer;

container=r_qhelloworld_container;

page_content=r_qhelloworld_page_content;

}

};

}

//wearehappywiththedefaultbehavīorofthescrollablecontainer

RESOURCEQIK_SCROLLABLE_CONTAINERr_qhelloworld_container

{

}

3.4.4創(chuàng)建標題

現(xiàn)在可以創(chuàng)建控件,創(chuàng)建后就可以看到程序的變化.我們的buildingblock可以容納三個不同的控件,首先定義一個標題,需要填充buildingblock的合適的間隙;因此創(chuàng)建QIK_SLOT_CONTENT_XXX.定義的時候,有幾個變化需要注意,因為只定義標題,所以最合適的就是

QIK_SLOT_CONTENT版本:QUOTE://QHelloWorld.rss

RESOURCEQIK_SCROLLABLE_CONTAINER_SETTINGSr_qhelloworld_page_content

{

controls=

{

QIK_CONTAINER_ITEM_CD_LI

{

type=EQikCtIconCaptionedOnelineBuildingBlock;

control=

{

QIK_SYSTEM_BUILDING_BLOCK

{

content=

{

QIK_SLOT_CONTENT

{

slot_id=EQikItemSlot1;

caption="HelloWorld";

}

};

}

};

}

};

}

3.4.5創(chuàng)建位圖

現(xiàn)在添加圖標.首先要創(chuàng)建一個mbm文件,與第一個白皮書中介紹的方法一樣.首先在mmp文件中定義mbm文件:QUOTE://QHelloWorld.mmp

STARTBITMAPqhelloworld.mbm

TARGETPATH\private\E1000001

HEADER

SOURCEPATH..\data\image

SOURCEc16GoldStar.bmp

SOURCE8GoldStar_mask.bmp

END

bitmap文件存儲在私有的數(shù)據(jù)緩沖目錄里.這可以避免任何名字沖突,可以避免別人誤用.我們創(chuàng)建自己的mbm文件,但是不添加到已有的mbm文件中,盡管那樣做是可行的.首先使用更新的mmp文件創(chuàng)建新的mbm文件,確保編譯正確,然后創(chuàng)建資源,執(zhí)行下列命令:QUOTE:cmd>abldmakefilewinscw

cmd>abldresourcewinscwudeb現(xiàn)在可以使用圖標了,首先將圖標的mbg文件包含到資源文件,通過創(chuàng)建CEikImage控件,并放入buildingblock的EQikIconSlot1間隙中.因為要內(nèi)含創(chuàng)建控件,因此使用QIK_SLOT_CONTENT_DIRECT,現(xiàn)在buildingblock的定義如下:QUOTE://QHelloWorld.rss

#include<QHelloWorld.mbg>

QIK_SYSTEM_BUILDING_BLOCK

{

content=

{

QIK_SLOT_CONTENT

{...},

QIK_SLOT_CONTENT_DIRECT

{

slot_id=EQikIconSlot1;

type=EEikCtImage;

control=QIK_IMAGE

{

content=QIK_CONTENT_MBM

{

bmpfile=\\private\\E1000001\\QHelloWorld.mbm;

bmpid=EMbmQhelloworldGoldstar;

bmpmask=EMbmQhelloworldGoldstar_mask;

};

};

}

};

}

重新編譯資源文件,啟動模擬器,現(xiàn)在只能看到布局的第一行,第二行的控件還沒有添加(在下一節(jié)中介紹).如下圖:

UIQ3_Whitepaper_02_View_Commands_ResourceFilesLayout.jpg

因為繪制矩形的代碼沒有刪除,因此截圖中仍然可以看到,通過對比,也可以看到UIQ3和UIQ2.x的基本差別.

添加控件的方法非常簡單,復制已有的圖標或標題,作為第2個控件,不過不能交互,因為用戶不會和標題進行交互.因此,下面我們要介紹允許交互的控件的添加,例如編輯窗口.

3.4.6創(chuàng)建控件

下面將要為buildingblock添加一個edwin(editorwindow),僅僅需要添加一個QIK_SLOT_CONTENT_DIRECT,而且是一個edwin.QUOTE://QHelloWorld.rss

QIK_SYSTEM_BUILDING_BLOCK

{

content=

{

QIK_SLOT_CONTENT

{

slot_id=EQikItemSlot1;

caption="HelloWorld";

},

QIK_SLOT_CONTENT_DIRECT

{

slot_id=EQikIconSlot1;

type=EEikCtImage;

control=QIK_IMAGE

{

content=QIK_CONTENT_MBM

{

bmpfile=\\private\\E1000001\\QHelloWorld.mbm;

bmpid=EMbmQhelloworldGoldstar;

bmpmask=EMbmQhelloworldGoldstar_mask;

};

};

},

QIK_SLOT_CONTENT_DIRECT

{

slot_id=EQikItemSlot2;

type=EEikCtEdwin;

control=EDWIN

{

};

}

};

}

重新編譯后執(zhí)行,就可以看到結(jié)果:

1.buildingblock被高亮顯示(如下圖a),高亮部分包含了2行,這也是為什么不使用兩個簡單的IconOnelineBuildingBlocks的原因,雖然外觀是一樣的,但是行為不同,因為那樣高亮部分只包含一行.高亮行為是自動添加的,現(xiàn)在可以與buildingblock交互,或者與控件交互.

2.有一行虛線,看上去象是編輯窗口,但是它不是,因為那里沒有顯示允許用戶輸入的光標.(a).

3.即使沒有光標,文本輸入也是可能的,因為右側(cè)有一個三角,說明系統(tǒng)可以識別手寫(a).

4.自動擁有一個軟鍵—唯一的一個,因為我們并沒有添加(a).

5.可以通過下列方式,激活buildingblock:

?選擇適當?shù)能涙I(確認鍵)

?輸入一些文本,與輸入系統(tǒng)獨立(例如:鍵盤,手寫識別,預測文本輸入,...)

?點擊buildingblock

可以點擊buildingblock可能會比較令人意外,即使我們正在運行的UI配置沒有包含觸摸屏.就象前面提到的(參看2.2節(jié)),UI配置中的“touch”參數(shù)并不代表沒有數(shù)字轉(zhuǎn)換器.顯然模擬器上有一個活動的數(shù)字轉(zhuǎn)換器,因此可以直接與屏幕直接交互(b).

6.一旦激活buildingblock就可以與它交互了.現(xiàn)在我們真正看到了edwin.可以輸入文本,并且可以移動光標,也可以關閉它(c).

7.可以看到一個自動彈出的buildingblock標題(c).

8.如果edwin里沒有文本,軟鍵就非常簡單,唯一能做的就是就是關閉edwin.也可以通過點擊浮動欄的外面來關閉(c).

9.輸入文本后,自動產(chǎn)生了更多的指令(d).

10.關閉浮動欄后,文本出現(xiàn)在buildingblock中,替換了原來的虛線(e).

11.如果輸入過多的文本,末尾將會被截斷.現(xiàn)在應該明白為什么這個buildingblock叫做OnelineBuildingBlock.因為它只能顯示一行文本.TwolineBuildingBlock允許換行一次,然后才截斷.(f).

未命名.JPG

3.4.7其它的布局

其它控件的創(chuàng)建方法類似.建議使用不同的buildingblocks體會一下.例如:

?復制已有的buildingblock

?從復制結(jié)果中刪除圖標

?將buildingblock類型從EQikCtIconCaptionedOnelineBuildingBlock改為EQikCtCaptionedHalflineBuildingBlock

?為buildingblock添加一個標志以便擁有一個分割條.

修改后的內(nèi)容如下:QUOTE://QHelloWorld.rss

RESOURCEQIK_SCROLLABLE_CONTAINER_SETTINGSr_qhelloworld_page_content

{

controls=

{

QIK_CONTAINER_ITEM_CD_LI

{...},

QIK_CONTAINER_ITEM_CD_LI

{

type=EQikCtCaptionedHalflineBuildingBlock;

control=

{

QIK_SYSTEM_BUILDING_BLOCK

{

flags=EQikBuildingBlockDividerBelow;

content=

{

QIK_SLOT_CONTENT

{

slot_id=EQikItemSlot1;

caption="HelloWorld!";

},

QIK_SLOT_CONTENT_DIRECT

{

slot_id=EQikItemSlot2;

type=EEikCtEdwin;

control=EDWIN

{

};

}

};

}

};

}

};

}

結(jié)果如下圖,我們不需要擔心焦點處理,它已經(jīng)自動實現(xiàn)了.第二個buildingblock與第一個有明顯的區(qū)別.示例說明:在一個視圖中使用混合buildingblocks時,應當保持視圖清晰,并容易使用.在以后的白皮書中,我們將會詳細介紹什么時候應該/不應該使用混合的buildingblocks.

UIQ3_Whitepaper_02_View_Commands_ResourceFilesLayout.jpg

現(xiàn)在第二個buildingblock已經(jīng)顯示了,并且仍然可以看到紅色的矩形.顯然,控件只重繪了它需要繪制的部分.并且高亮是半透明的,因此我們可以看見矩形.

在UIQ2.x中控件繪制時,通常用背景色清除矩形.不應該再繼續(xù)這樣實現(xiàn),因為背景可能不是單色.另外,這使得不同的控件很好地混合,就象示例那樣.一般,控件僅需要刪除ClearRect()函數(shù).應用程序框架保證重繪正確處理,并且更新背景.

3.5使用新的布局

除了上節(jié)已經(jīng)介紹的控件創(chuàng)建,交互之外,控件指令的添加也是自動處理的.但是,我們怎么在程序中訪問從資源文件中創(chuàng)建的控件呢?我們需要考慮兩種情況:

1.獲取控件以便設置或獲取一些值

2.控件發(fā)生改變時獲取通知消息(以便能夠檢查發(fā)生了什么改變)

3.5.1訪問控件

前面沒有討論控件的標識,如果我們有多個同類型的控件,該怎么辦?因此,需要給每個控件一個識別符.在源代碼中,使用相同的標識符.為了保證正確使用,可以創(chuàng)建一個通用的頭文件,即hrh文件.在示例中創(chuàng)建文件QHelloWorld.hrh,里面包含了一些用于標識控件的枚舉值.我們并對所有的控件定義標識,只標識我們需要的;我們將只使用如下unique_handle來標識兩個edwinith.QUOTE://QHelloWorld.hrh

enumTQHelloWorldControls

{

EFirstEdwin=1,

ESecondEdwin

};然后就可以使用這些枚舉值來標識控件:QUOTE://QHelloWorld.rss

#include"QHelloWorld.hrh"

QIK_SLOT_CONTENT_DIRECT

{

unique_handle=EFirstEdwin;

slot_id=EQikItemSlot2;

type=EEikCtEdwin;

control=EDWIN

{

};

}

[...]

QIK_SLOT_CONTENT_DIRECT

{

unique_handle=ESecondEdwin;

slot_id=EQikItemSlot2;

type=EEikCtEdwin;

control=EDWIN

{

};

}

通常在激活視圖的時候顯示視圖內(nèi)容,因此ViewActivatedL()函數(shù)是最適合查找控件的位置.對LocateControlByUniqueHandle()的調(diào)用將遍歷視圖的控件,然后找到我們需要的控件:QUOTE://QHelloWorldView.cpp

#include<EikEdwin.h>

#include"QHelloWorld.hrh"

voidCQHelloWorldView::ViewActivatedL(constTVwsViewId&,TUid,constTDesC8&)

{

_LIT(KFirstEdwinText,"First");

_LIT(KSecondEdwinText,"Second");

CEikEdwin*firstEdwin=LocateControlByUniqueHandle<CEikEdwin>(EFirstEdwin);

firstEdwin->SetTextL(&KFirstEdwinText);

CEikEdwin*secondEdwin=LocateControlByUniqueHandle<CEikEdwin>(ESecondEdwin);

secondEdwin->SetTextL(&KSecondEdwinText);

}

上述代碼查找兩個edwin控件,然后為它們設置文本.然而代碼中有2個問題需要小心.因為,我們不能保證控件確實存在.可能程序員想修改布局,不想再繼續(xù)使用第二個edwin.因此上述代碼需要重寫,以檢查LocateControlByUniqueHandle()的返回值,以便只處理確實存在的控件.另一個問題是每次激活視圖時都為它設置文本,因此,我們所做的修改可能會丟失,例如,離開程序,然后又切換回來.

另一種情況是,當需要保存控件內(nèi)容時,怎么訪問控件,適合的位置是SaveL()函數(shù),這個函數(shù)每次在需要保存視圖內(nèi)容十,由應用程序框架調(diào)用.例如:QUOTE://QHelloWorldView.cpp

voidCQHelloWorldView::SaveL()

{

CEikEdwin*firstEdwin=LocateControlByUniqueHandle<CEikEdwin>(EFirstEdwin);

HBufC*buffer=firstEdwin->GetTextInHBufL();

User::InfoPrint(*buffer);

deletebuffer;

}

3.5.2獲得修改通知消息

每次控件內(nèi)容發(fā)生改變時,控件向它的MCoeControlObserver發(fā)送事件消息.該事件然后被傳送到視圖,因此需要做的就是重載視圖的HandleControlEventL()函數(shù).通常唯一比較感興趣的是EEventStateChanged,通常使用視圖的默認行為就足夠了,因此確保給它傳遞所有的事件.QUOTE://QHelloWorldView.cpp

voidCQHelloWorldView::HandleControlEventL(CCoeControl*aControl,TCoeEventaEventType)

{

_LIT(KInfo,"Controlchanged");

if(aEventType==EEventStateChanged)

{

iEikonEnv->InfoMsg(KInfo());

}

CQikViewBase::HandleControlEventL(aControl,aEventType);

}

大多數(shù)情況,控件發(fā)生變化后,不需要立刻知道.因此推薦使用上面介紹的SaveL()函數(shù).在UIQ2.x中,常常實現(xiàn)HandleControlEventL()函數(shù),因為焦點處理是手工處理的.現(xiàn)在,UIQ3的焦點處理是自動的,焦點策略由布局管理器決定.如果沒有安裝布局管理器,焦點移動到給定方向的最近一個控件上.(參看[9])在這個函數(shù)里,可以使用定義的唯一識別符,判斷是哪個控件發(fā)生了變化.QUOTE:switch(aControl->UniqueHandle())

{

caseEFirstEdwin:

//Dosomethingwiththefirstedwin

break;

caseESecondEdwin:

//Dosomethingwiththesecondedwin

break;

default:

//allothercontrols(notnecessarilyidentifiable)

break;

}

四、視圖指令

4.1簡介

本節(jié)為視圖添加一些指令.前面已經(jīng)看到一些自動添加的指令,因此我們只需要關注其它的指令.資源文件結(jié)構的圖中已經(jīng)告訴我們應該在哪里添加指令,我們首先來介紹第一個,其它的以后介紹.本章,我們將討論:

1.添加指令

2.初始化指令,

3.處理指令

4.改變指令狀態(tài)

4.2目錄結(jié)構

UIQ3_Whitepaper_02_View_Commands_ResourceFilesLayout.jpg

4.3創(chuàng)建指令

QikCommand.rh頭文件定義了指令列表和指令的資源結(jié)構.因此我們只需使用它們創(chuàng)建指令列表,并添加到視圖結(jié)構即可.首先,添加一個關閉指令,用于在測試環(huán)境下檢查內(nèi)存泄露.關閉指令的標準IDEEikCmdExit定義在uikon.hrh文件中,同時需要設置狀態(tài)標志為EQikCmdFlagDebugOnly,以便該指令僅在debug編譯版本中可見.

為指令定義文本時,注意文本不能太長,因為指令可能出現(xiàn)在軟鍵上,空間非常有限.在示例中,我們使用“Close(debug)”文本,但是,在軟鍵上,顯然太長了,因此另外定義一個短的文本“Close”,在軟鍵上出現(xiàn)時

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論