第七章使用控件_第1頁(yè)
第七章使用控件_第2頁(yè)
第七章使用控件_第3頁(yè)
第七章使用控件_第4頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第七章 使用控件 1完成本章內(nèi)容之后我們將能夠:掌握控件和相關(guān)的API本 章 目 標(biāo)2控件 在Symbian OS中,控件提供應(yīng)用程序和用戶之間交互的主要方式。應(yīng)用程序大量使用控件:應(yīng)用程序的每個(gè)視圖都是個(gè)控件,控件構(gòu)成全部對(duì)話框和菜單窗格的基礎(chǔ)。 控件占據(jù)屏幕的個(gè)矩形區(qū)域,除了響應(yīng)用戶、應(yīng)用程序和系統(tǒng)產(chǎn)生的事件,它還可以顯示文本和圖像的任意組合?;谔囟ㄓ脩艚缑?,用戶產(chǎn)生的事件可能包括:按鍵(字母數(shù)字或特定設(shè)備的按鈕)。指針事件,用戶用觸筆點(diǎn)擊屏幕產(chǎn)生。3 控件 繪制控件的內(nèi)容可以由應(yīng)用程序本身啟動(dòng),例如當(dāng)控件的可顯示數(shù)據(jù)更改時(shí)。系統(tǒng)也可以啟動(dòng)繪制,例如由于覆蓋控件(可能屬于同一個(gè)或另一個(gè)應(yīng)

2、用程序)的消失,暴露了控件的全部或部分。 記住,Symbian OS是個(gè)完全多任務(wù)處理系統(tǒng),多個(gè)應(yīng)用程序可以并發(fā)運(yùn)行,屏幕是必須在所有這些應(yīng)用程序之間共享的惟一資源。通過關(guān)聯(lián)個(gè)或多個(gè)窗口與每個(gè)應(yīng)用程序,處理控件和屏幕之間的交互,Symbian OS用以實(shí)現(xiàn)這種共享。窗口由窗口服務(wù)器管理,保證個(gè)或多個(gè)正確的窗口顯示,根據(jù)需要管理覆蓋、暴露和隱藏的窗口。4 為了獲得對(duì)屏幕的訪問權(quán),每個(gè)控件必須與一個(gè)窗口關(guān)聯(lián),但是不需要每個(gè)控件都擁有個(gè)單獨(dú)的窗口。一些稱為“擁有窗口的控件(window-owningcontr01)”的控件使用個(gè)完整窗口,但是許多其他稱為“非擁有窗口的控件(non-window-ow

3、ningcontr01)”的控件ConstructL(ClientRect();簡(jiǎn)單控件14 應(yīng)用程序是否需要處理這兩種類型的事件部分依賴于目標(biāo)手機(jī)的UI。Series 60 UI的個(gè)設(shè)計(jì)考慮是,它應(yīng)該支持單手操作。因此,Series 60手機(jī)沒有觸摸屏幕,因此特別為該UI編寫的應(yīng)用程序不需要處理指針事件。運(yùn)行在基于指針的手機(jī)UI(例如UIQ)的應(yīng)用程序,通常應(yīng)當(dāng)處理這兩種類型的事件。這樣的手機(jī)通常使用一些鍵和與手寫識(shí)別或(屏幕上的)虛擬鍵盤等相關(guān)聯(lián)的前端處理器(FEP)來生成鍵事件。 處理鍵和指針事件15 是否選擇處理某一種或全部?jī)煞N類型的事件,可能也取決于應(yīng)用程序的本質(zhì)。一般而言,如果沒有

4、特別的相反原因,處理兩種類型的事件將使得轉(zhuǎn)換應(yīng)用程序以運(yùn)行在使用不同UI的手機(jī)上更容易。兩種類型的事件有一些基本差別。指針事件發(fā)生在屏幕的特定位置,通常對(duì)應(yīng)個(gè)特定應(yīng)用程序的窗口,更準(zhǔn)確地說,是一個(gè)與該窗口關(guān)聯(lián)的特定控件。鍵事件與特定控件無此內(nèi)在連接。應(yīng)用程序的內(nèi)部邏輯確定這個(gè)連接,并且情況常常是,不同類型的鍵事件可能被應(yīng)用程序內(nèi)不同的控件處理。 處理鍵和指針事件16 這個(gè)基本差別反映在Symbian OS處理兩種類型事件的方式上。 鍵事件由TKeyEvent的一個(gè)實(shí)例和鍵事件類型表示,鍵事件類型可以是EEventKeyDown,EEventKey或EEventKeyUp之一。除非應(yīng)用程序?qū)z測(cè)

5、何時(shí)按下鍵或釋放鍵特別感興趣,否則,可以安全地忽略非EEventKey類型的鍵事件。TKeyEvent類有四個(gè)數(shù)據(jù)成員:iCode、iModifiers、iRepeats和iScanCode。其中包含鍵的字符碼的iCode通常對(duì)應(yīng)用程序最有意義。其他數(shù)據(jù)成員的意義參見表4.2。 鍵事件17 鍵事件表4.2 其他數(shù)據(jù)成員 18 如前所見,控件應(yīng)該通過調(diào)用app UI的AddToStackL()函數(shù),添加到控件棧,注冊(cè)它對(duì)處理鍵事件的要求??丶赡芴幚淼娜挎I事件,無論它們從真實(shí)的按鍵還是從前端處理器(FEP)生成,都由控件棧的OfferKeyL()來處理。這個(gè)函數(shù)調(diào)用控件棧上每個(gè)對(duì)象的Offer

6、KeyEventL()函數(shù),直到下列兩種情況之一發(fā)生:為全部控件提供該鍵事件,并通過返回 EKeyWasNotConsumed指示它們不能處理該事件。控件可以處理該鍵事件,并且通過返回值 EKeyWasConsumed指示它已經(jīng)完成了處理。鍵事件19 由此可見,如果響應(yīng)鍵事件時(shí),控件不做任何事情,它的OfferKeyEventL()實(shí)現(xiàn)必須保證該函數(shù)返回EKeyWasNotConsumed,否則,可能阻止其他控件或?qū)υ捒蚪邮赵撴I事件。CcoeControl的OfferKeyEventL()函數(shù)的默認(rèn)操作正是返回EKeyWasNotConsumed。 鍵事件20 運(yùn)行模擬器中的ConsLaunc

7、her應(yīng)用程序說明,它響應(yīng)指針事件,即使該應(yīng)用程序源沒有顯式代碼處理它們也是如此。 為了驗(yàn)證這一點(diǎn),需要確保在模擬的c:systemprograms目錄(epoc32csystemprograms,其中是wins、winsb或winscw之一,與所使用的編譯器和IDE有關(guān))中存在兩個(gè)或更多.exe文件。然后,你會(huì)發(fā)現(xiàn)可以通過單擊任何列出的項(xiàng)而選擇它。指針事件21 Series 60特定的控件不需要響應(yīng)指針事件,但是Symbian OS中所有可用的通用控件以及UIQ特定的所有控件均響應(yīng)指針和鍵事件。與鍵事件不同,框架代碼將指針事件定向到適當(dāng)?shù)目丶鴽]有應(yīng)用程序本身的任何顯式協(xié)助。 指針事件在數(shù)

8、字化儀(digitizer)驅(qū)動(dòng)器中發(fā)生,數(shù)字化儀驅(qū)動(dòng)器將它們傳遞到窗口服務(wù)器。通常,窗口服務(wù)器關(guān)聯(lián)指針事件和窗口矩形圍繞事件位置的最前面窗口(但是也有例外,我們將在后面描述)。窗口服務(wù)器將事件發(fā)送給擁有包含特定窗口的窗口組的應(yīng)用程序。 指針事件22 在應(yīng)用程序內(nèi),將事件傳遞給app UI的HandleWsEventL()函數(shù)。如前所見,這個(gè)函數(shù)是與處理鍵事件相同的函數(shù)。這個(gè)函數(shù)將該事件識(shí)別為與特定窗口關(guān)聯(lián)的指針事件,并調(diào)用擁有該窗口的控件的ProeessPointerEventL()。該函數(shù)反過來調(diào)用該控件的HandlePointerEventL()函數(shù)。如果該控件有組件,HandlePoi

9、nterEventL()的默認(rèn)實(shí)現(xiàn)掃描可見的非擁有窗口的組件,定位包含事件位置的組件。如果找到一個(gè)組件,HandlePointerEventL()調(diào)用它的ProcessPointerEventL()函數(shù)。 指針事件23 因此,為了在簡(jiǎn)單控件中自定義對(duì)指針事件的響應(yīng),應(yīng)該重寫它的HandlePointerEventL()函數(shù)。在復(fù)合控件中,通常不重寫這個(gè)函數(shù),但是如果重寫,確保不要阻止指針事件傳遞給組件控件。 指針事件24 常常有必要讓控件將重要的事件通知給某些其他類,做這件事情的標(biāo)準(zhǔn)機(jī)制是使用觀察器界面??丶蚣芏x了CoeControlObserver界面類,它擁有單個(gè)成員函數(shù)HandleC

10、ontrolEventL(),提供接收和處理各種常見控件事件通知的機(jī)制。任何派生于這個(gè)界面的類被稱為控件觀察器??厥驳挠^察器經(jīng)常是該控件的容器,但不一定必須如此。 觀察控件25 控件的觀察器可以使用它的SetObserver()函數(shù)設(shè)置,并在以后通過Observer()函數(shù)引用。希望給它的觀察器報(bào)告事件的控件應(yīng)該調(diào)用ReportEventL(),傳遞下面列出的枚舉事件類型之一。如果控件的觀察器以前已經(jīng)通過調(diào)用SetObserver()進(jìn)行設(shè)置,ReportEventL()將只報(bào)告事件。觀察控件26 HelloBlank和ConsLauncher示例應(yīng)用程序都為它們的視圖使用空白控件。殺三子程序

11、為它的視圖和棋盤的棋格使用自定義控件,兩個(gè)控件都需要繪制自己的特定內(nèi)容。 自定義控件繪制其內(nèi)容的標(biāo)準(zhǔn)方法是實(shí)現(xiàn)Draw()函數(shù),因此,前面的簡(jiǎn)單空白控件的類定義需要更改為: 繪制控件27 class CBlankAppView:public CCoeControlpublic: CBlankAppView(); CBlankAppView(); void ConstructL(const TRect& aRect);private: void Draw(const TRect& aRect)const;繪制控件28 顯然,視圖的ConstructL()函數(shù)不應(yīng)該調(diào)用SetBlank(),因此變

12、為:void CHelloBlankAppView:ConstructL(const TRect& aRect)CreateWindowL(); /創(chuàng)建該控件的窗口SetRect(aRect); /設(shè)置控件的大小ActivateL(); /激活控件,準(zhǔn)備進(jìn)行繪制繪制控件29 Draw()函數(shù)必須能夠繪制到該控件占據(jù)的矩形區(qū)域內(nèi)的每個(gè)像素。擁有窗口空白控件的簡(jiǎn)單實(shí)現(xiàn)可以是:void CHelloBlankAppView:Draw(const TRect& /*aRect*/)constCWindowGc& gc=SystemGc(); /獲取標(biāo)準(zhǔn)圖形上下文gc.Clear(); /清除整個(gè)窗口繪制控件30 繪制需要一個(gè)圖形上下文;通過調(diào)用CCoeControl:SystemGc()找到用于在窗口繪制的適當(dāng)圖形上下文(CWindowGc)。 在這種情況下,Draw()函數(shù)可以忽略作為

溫馨提示

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

評(píng)論

0/150

提交評(píng)論