• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            引用自:http://symbian.nbedge.com/article.asp?id=107

            Something From HelloWorldPlus


            對于HelloWorldPlus的分析可以從對象構(gòu)建一步步深入,它和HelloWorldBasic略有不同之處。

            一、AppUi ConstructL() 方法

            void CHelloWorldPlusAppUi::ConstructL()
             {
               // Initialise app UI with standard value.
               // Flag 'EAknEnableSkin' indicating that default skin parameters should be provided
               // by UI controls created within the scope of this AppUi instance.
               //
            用一個標(biāo)準(zhǔn)的值初始化APP UI
              // EAknEnableSkin
            CCoeAppUi的一個枚舉值。它指定默認(rèn)的皮膚參數(shù)必須由
              //
            在這個AppUi實(shí)例作用范圍內(nèi)創(chuàng)建的組件提供
               BaseConstructL( EAknEnableSkin );

               // Create view object
              //
            創(chuàng)建一個視圖對象
               iAppView = CHelloWorldPlusAppView::NewL( ClientRect() );

               // Add to control stack in order to get key presses.
              //
            把視圖對象放入到 控件棧,以便獲得鍵盤事件。
               AddToStackL( iAppView );
             }


            在這個函數(shù)中,首先調(diào)用了 BaseConstructL()方法,使用一個標(biāo)準(zhǔn)值初始化AppUi對象。然后調(diào)用自身的靜態(tài)構(gòu)造方法NewL()方法構(gòu)造自身,這里需要關(guān)注的是它的參數(shù) ClientRect() 方法,雖然這個函數(shù)再這里似乎沒有什么實(shí)際的用處,但是還是需要了解。AddToStackL()方法則把AppView對象放置到控件棧中,以便獲取鍵盤事件。于是我們要問,什么是控件棧 control stack,它是做什么用的?

            [1] CEikAppUi
            BaseConstructL() 方法

            protected: void BaseConstructL(TInt aAppUiFlags=0);


            使用一個標(biāo)準(zhǔn)的值來初始化App Ui對象,這個時候應(yīng)用程序的標(biāo)準(zhǔn)的資源文件被讀取,除非這個函數(shù)被傳入了ENoAppResourceFile ENonStandardResourceFile。這個函數(shù)默認(rèn)參數(shù)值是0,它指定應(yīng)用程序用戶接口標(biāo)志。

            [2] CEikAppUi
            ClientRect() 方法

            TRect ClientRect() const;


            獲得可被應(yīng)用程序獲得用于繪制的屏幕區(qū)域,但是不包括以下這些區(qū)域:非應(yīng)用程序區(qū)域,那些地方一直顯示幾乎不變的內(nèi)容、應(yīng)用程序狀態(tài)欄、應(yīng)用程序按鈕組、應(yīng)用程序菜單欄、應(yīng)用程序標(biāo)題欄和工具欄。

            這里需要重視的是,矩形的直角坐標(biāo)系是和整個屏幕關(guān)聯(lián)的,例如矩形的左上角點(diǎn)的坐標(biāo)值可能是(045)。這里的意思是,這個獲得的矩形在屏幕中的位置是由一個和屏幕對應(yīng)的直角坐標(biāo)系確定的,顯然這個坐標(biāo)系的(0,0)點(diǎn)位于屏幕的左上角,x軸正向向下,y軸正向向右。

            [3] CEikAppUi
            AddToStackL()方法

            void AddToStackL(CCoeControl* aControl,TInt aPriority=ECoeStackPriorityDefault,TInt aStackingFlags=ECoeStackFlagStandard);


            把控件放到控件棧中,這個函數(shù)經(jīng)常被GUI應(yīng)用程序使用,把應(yīng)用程序視圖放置到控制棧中。

            那么,什么是控制棧呢? 一個UI控件同過把自身壓入控制棧注冊到鍵盤事件。典型的只有視圖對象會把自己加入到控制棧中,然后視圖對象通過OfferKeyEventL()函數(shù)再分配鍵盤事件給它的組件控件。

            鍵盤事件被提供給控件棧上的控件,最后一個壓入控制棧的控件通過 OfferKeyEventL()方法首先獲得鍵盤事件,如果這個控件不對這個鍵盤事件做出響應(yīng),那么返回EKeyWasNotConsumed,然后鍵盤事件被傳遞到控件棧的下一個控件。

            AppUi
            通常是控件棧的最底下的一個,所以它也是最后一個獲得鍵盤事件的,如果在它前面的控件都多這個鍵盤事件不趕興趣那就掄到AppUi去作出響應(yīng)了。

            AddToStackL()
            方法有幾個參數(shù)可以看一下:

            CCoeControl* aControl
            將要被壓入控制棧的控件;

            TInt aPriority=ECoeStackPriorityDefault


            控件的棧有限權(quán),這個參數(shù)以及其他一些優(yōu)先權(quán)值都是通過一個匿名的枚舉類型定義的。

            Tint aStackingFlags=ECoeStackFlagStandard


            控件的事件處理行為,這個參數(shù)和上面一個參數(shù)一樣,也是在一個匿名的枚舉類型中定義。

            在上文中提到了OfferKeyEventL()方法,這個方法是CCoeControl的一個成員,關(guān)于這個函數(shù)的相關(guān)知識在下文中再做介紹。

            CCoeControl 類,以及 Draw()方法

            HelloWorldPlus
            是一個以 EIKON 為模板(圖形框架)的應(yīng)用,它的視圖類從 CCoeControl 類繼承。

            class CHelloWorldPlusAppView : public CCoeControl
             {
              ……
              ……
             }


            draw()
            方法有如下代碼:

            // Draw 是一個CCoeControl 類的一個虛函數(shù)
            void CHelloWorldPlusAppView::Draw( const TRect& /*aRect*/ ) const
             {

               // Get the standard graphics context
              //
            獲得圖象環(huán)境,用于繪制圖形
              // CWindowGc
            是一個窗口圖形環(huán)境類
               CWindowGc& gc = SystemGc();

               //
            以默認(rèn)構(gòu)造函數(shù)構(gòu)造一個矩形
              //
            這個矩形包括了屏幕的全部面積
              TRect rect = Rect();

               // Clears the screen
              //
            清楚屏幕(清楚矩形所包含的窗口)
               gc.Clear( rect );

               // Query what the current time is
              //
            獲取系統(tǒng)當(dāng)前時間
               TTime currentTime;
               currentTime.HomeTime();

               // Format the time into a descriptor, and handle any errors
               TBuf<32> timeAsText;
               _LIT ( KTimeFormat, "%H : %T : %S" );

               // Load a string from the resource file.
              //
            從資源文件加載字符串
              //
            當(dāng)前使用的LoadLC是這個函數(shù)的第一個重載版本,傳入一個資源 ID
               HBufC* textResource = StringLoader::LoadLC( R_HEWP_TIME_FORMAT_ERROR );

               //
            格式化時間文本
              TRAPD ( err, currentTime.FormatL( timeAsText, KTimeFormat ) );
               //
            如果格式化時間文本出錯,那么把錯誤信息賦給時間文本
              if ( err != KErrNone )
             {
             timeAsText = *textResource;
             }

               // Write the time to the display
              //
            在屏幕上輸出
              // iCoeEnv
            CCoeEnv 型的一個CCoeControl的一個數(shù)據(jù)成員。
               gc.UseFont( iCoeEnv->NormalFont() );
              //
            繪制無邊框的水平放置的字體
              //
            如果該函數(shù)調(diào)用時,字體未設(shè)置,那么將發(fā)生Panic
               gc.DrawText( timeAsText, TPoint( 55,60 ) );

              gc.DrawText( timeAsText, TPoint( 55,100 ) );

               // Pop HBuf from CleanUpStack and Destroy it.
               CleanupStack::PopAndDestroy( textResource );
             }


            [1] CCoeControl


            控件的基類,所有控件類都從這個類繼承。

            [2] CCoeControl
            類的SystemGc() 方法

            protected: CWindowGc& SystemGc() const;


            獲得標(biāo)準(zhǔn)的圖形環(huán)境,以便在繪制控件時使用。

            所有的圖形函數(shù)都是通過圖形環(huán)境實(shí)現(xiàn)的。

            在圖形環(huán)境被繪制前,它必須已經(jīng)被激活;當(dāng)它不再被需要的時候,圖形環(huán)境應(yīng)該處于一種非活動狀態(tài)。當(dāng)使用 Draw(), DrawNow() DrawDeferred()完成圖形環(huán)境繪制,應(yīng)用程序其實(shí)不需要去做這些事情,圖形繪制在控件框架中被完成 。對于應(yīng)用程序初始化的繪制工作來說,程序并沒有使用DrawNow() DrawDeferred()這些函數(shù),應(yīng)用程序只需要使用ActivateGc() 方法激活圖形環(huán)境或使用 DeactivateGc() 方法使圖形環(huán)境處于非活動狀態(tài)。

            SystemGc()
            方法返回一個 CWindowG 型圖形環(huán)境引用。

            CHelloWorldPlusAppView類的Draw方法中個使用了SystemGc() 方法:

            CWindowGc& gc = SystemGc();


            [3] CWindowGc


            窗口圖形環(huán)境

            絕大多數(shù)的窗口環(huán)境繪制函數(shù)都映射到等價的 CFbsBitGc 類函數(shù)——他們作用于任意屏幕上與窗口左上角關(guān)聯(lián)的直角坐標(biāo)系。

            總體來說, 如果服務(wù)端函數(shù)遇到某些可以使之發(fā)生異常退出的情形時,并不異常退出,而是返回一個錯誤值,以說明函數(shù)發(fā)生異常退出的情況。這樣,leave可以在client/server分界點(diǎn)的適當(dāng)?shù)囊粋?cè)被處理。

            [4] CWindowGc
            類的 UseFont()

            virtual void UseFont(const CFont *aFont);


            設(shè)置環(huán)境(上下文)字體

            字體是用于文本繪制的。如果字體已經(jīng)位于字體位圖服務(wù)器的內(nèi)存中,那么GDI(圖形設(shè)備接口,Graphic Device Interface)就會共享那個拷貝。

            GDI
            可以在不同的上下文中實(shí)現(xiàn)純抽象組件。在它的底部定義了繪圖基本元素以及實(shí)現(xiàn)與設(shè)備無管繪圖的一些。

            UseFont()
            函數(shù)必須在文本繪制之前調(diào)用,否則主調(diào)線程就會發(fā)生Panic

            該函數(shù)需要一個CFont型參數(shù),它是一個設(shè)備字體。

            HelloWorldPlus中,使用iCoeEnv->NormalFont()來獲得設(shè)備字體。

            [5]
            語句:iCoeEnv->NormalFont()

            iCoeEnv
            CCoeEnv 型的一個CCoeControl的一個數(shù)據(jù)成員。CCoeEnvCCoeControlCCoeAppUi一起組成了控件環(huán)境CONEComponent Enviroment)。
            NormalFont()
            這個函數(shù)的作用是獲取標(biāo)準(zhǔn)的環(huán)境字體。這個字體在控件環(huán)境CONE初始化時被創(chuàng)建。

            三、AppView ConstructL() 方法

            void CHelloWorldPlusAppView::ConstructL( const TRect& aRect )
             {
               // Create a window for this application view
              //
            創(chuàng)建一個自己 App View 的窗口
               CreateWindowL();

               // Set the windows size
              //
            設(shè)置自身窗口的尺寸,該函數(shù)的調(diào)用將導(dǎo)致 SizeChangedL()函數(shù)被調(diào)用
               SetRect( aRect );

               // Activate the window, which makes it ready to be drawn
              //
            激活這個窗口,使可被繪制
               ActivateL();
             }


            [1] CCoeControl
            CreateWindowL()

            protected: void CreateWindowL();


            創(chuàng)建一個控件的窗口,被創(chuàng)建的窗口屬于應(yīng)用程序窗口組的子窗口。這個函數(shù)使一個指定控件成為一個窗口擁有的控件,并且通常在控件的 ConstructL()方法中被調(diào)用。

            四、關(guān)于OfferKeyEventL()方法

            // CHelloWorldPlusAppView::OfferKeyEventL()
            // Handles keyevents.
            // ---------------------------------------------------------------------------
            //
            對鍵盤事件的處理
            // TKeyEvent
            鍵盤事件類。它描述了鍵盤事件的細(xì)節(jié)
            //
            說明事件的類型,是Press,keydown還是 keyup 或是其它
            TKeyResponse CHelloWorldPlusAppView::OfferKeyEventL(
             const TKeyEvent& aKeyEvent,TEventCode aType )
             {

             // We only want the key press, not the key up/down event
             if ( aType == EEventKey )
             {
             // Check if the 2 key was pressed
             if ( aKeyEvent.iCode == KDeviceKeyTwo )
             {

             // Load a string from the resource file.
             HBufC* textResource = StringLoader::LoadLC( R_HEWP_KEY_TWO_PRESSED );

             CAknInformationNote* informationNote;
             informationNote = new ( ELeave ) CAknInformationNote;
             informationNote->ExecuteLD( *textResource );

             // Pop HBuf from CleanUpStack and Destroy it.
             CleanupStack::PopAndDestroy( textResource );
             return EKeyWasConsumed;
             }
             }

             // Return the default functionality
             return CCoeControl::OfferKeyEventL( aKeyEvent, aType );
             }


            [1] OfferKeyEventL()

            virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);


            這個函數(shù)專門用于處理鍵盤事件,如果對程序的交互和運(yùn)行需要通過鍵盤控制,那么視圖類就應(yīng)該去實(shí)現(xiàn)這個方法。如果類實(shí)現(xiàn)這個方法,特別需要注意的是,若對象沒有對鍵盤事件作出響應(yīng)那么應(yīng)該返回EKeyWasNotConsumed ,反之,若對象對該鍵盤事件做出了響應(yīng)那么就要返回EKeyWasConsumed。當(dāng)鍵盤事件發(fā)生時,控制框架調(diào)用每一個在控件棧中對象的OfferKeyEventL()函數(shù),直到他們中其中的一個可以處理這個鍵盤事件并返回EKeyWasConsumed

            參數(shù):
            const TKeyEvent& aKeyEvent
            :鍵盤事件。TKeyEvent 類描述了鍵盤事件的細(xì)節(jié),他包括四個屬性,分別是iCode, iModifiers, iRepeats, iScanCode 。當(dāng)處理一個TKeyEvent的時候,TStdScanCode型的iScanCode通常被TKeyCode型的iCode取代。

            TEventCode aType
            :鍵盤事件類型,包括:EEventKey, EEventKeyUp or EEventKeyDown


            返回值指明對象是否處理了這個鍵盤事件。

            任意一個鍵盤的按鍵事件都將導(dǎo)致三個獨(dú)立的事件:EEventKeyDown, EEventKeyEEventKeyUp,事實(shí)上他們觸發(fā)的順序也是這個樣子的。為可以獲得可以被OfferKeyEventL()函數(shù)處理的鍵盤事件,應(yīng)用程序必須調(diào)用CCoeAppUi::AddToStackL()方法,把控件壓入到棧中。這只是對控件起作用,而不是組成控件的控件組件。復(fù)合控件如果有需要的話也可以把鍵盤事件傳遞給他們的組件控件,但是組件控件本身并不可以在控制棧上。

            如果一個類覆蓋了 CCoeControl::OfferKeyEventL() 方法那么他同時也要覆蓋InputCapabilities() 虛函數(shù),返回一個TCoeInputCapabilities 對象,這個對象的屬性符合OfferKeyEventL()函數(shù)的行為。通常沒有必要在內(nèi)部調(diào)用InputCapabilities() 方法,而這個方法也一般被UI控制框架調(diào)用。

             Click Here To Download e.g. Project Files
            posted on 2006-02-25 05:07 移動開發(fā) 閱讀(504) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


             
            久久精品中文无码资源站| 97久久精品午夜一区二区| 亚洲伊人久久大香线蕉综合图片| 久久一本综合| 久久99精品久久久久久水蜜桃| 国产精品青草久久久久福利99| 99久久99久久精品国产| 国产精品久久久久国产A级| 久久精品国产AV一区二区三区| 久久人人爽人人爽人人爽 | 久久精品国产亚洲AV忘忧草18| 狠狠色丁香久久婷婷综合| 奇米影视7777久久精品人人爽| 99久久精品国产一区二区| 久久久久人妻一区二区三区| 亚洲色婷婷综合久久| 777米奇久久最新地址| 精品无码久久久久久国产| 久久影视综合亚洲| 欧美日韩精品久久久久| 无码久久精品国产亚洲Av影片| 欧美精品一区二区精品久久 | 精品综合久久久久久98| 久久性精品| 久久精品免费观看| 久久午夜福利电影| 久久w5ww成w人免费| 欧美日韩成人精品久久久免费看| 亚洲AV无码1区2区久久| 久久精品国产91久久麻豆自制| 日本精品久久久久影院日本| 2021国产精品午夜久久| 久久国产精品久久国产精品| 亚洲欧洲久久久精品| 久久国产精品99久久久久久老狼| 影音先锋女人AV鲁色资源网久久 | 久久天天躁狠狠躁夜夜不卡| 久久久久久精品成人免费图片 | 久久99久久99精品免视看动漫| 狠狠色综合网站久久久久久久| 久久精品亚洲日本波多野结衣 |