青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

引用自:http://symbian.nbedge.com/article.asp?id=107

Something From HelloWorldPlus


對于HelloWorldPlus的分析可以從對象構建一步步深入,它和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.
   //
用一個標準的值初始化APP UI
  // EAknEnableSkin
CCoeAppUi的一個枚舉值。它指定默認的皮膚參數必須由
  //
在這個AppUi實例作用范圍內創建的組件提供
   BaseConstructL( EAknEnableSkin );

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

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


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

[1] CEikAppUi
BaseConstructL() 方法

protected: void BaseConstructL(TInt aAppUiFlags=0);


使用一個標準的值來初始化App Ui對象,這個時候應用程序的標準的資源文件被讀取,除非這個函數被傳入了ENoAppResourceFile ENonStandardResourceFile。這個函數默認參數值是0,它指定應用程序用戶接口標志。

[2] CEikAppUi
ClientRect() 方法

TRect ClientRect() const;


獲得可被應用程序獲得用于繪制的屏幕區域,但是不包括以下這些區域:非應用程序區域,那些地方一直顯示幾乎不變的內容、應用程序狀態欄、應用程序按鈕組、應用程序菜單欄、應用程序標題欄和工具欄。

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

[3] CEikAppUi
AddToStackL()方法

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


把控件放到控件棧中,這個函數經常被GUI應用程序使用,把應用程序視圖放置到控制棧中。

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

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

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

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

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

TInt aPriority=ECoeStackPriorityDefault


控件的棧有限權,這個參數以及其他一些優先權值都是通過一個匿名的枚舉類型定義的。

Tint aStackingFlags=ECoeStackFlagStandard


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

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

CCoeControl 類,以及 Draw()方法

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

class CHelloWorldPlusAppView : public CCoeControl
 {
  ……
  ……
 }


draw()
方法有如下代碼:

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

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

   //
以默認構造函數構造一個矩形
  //
這個矩形包括了屏幕的全部面積
  TRect rect = Rect();

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

   // Query what the current time is
  //
獲取系統當前時間
   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.
  //
從資源文件加載字符串
  //
當前使用的LoadLC是這個函數的第一個重載版本,傳入一個資源 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的一個數據成員。
   gc.UseFont( iCoeEnv->NormalFont() );
  //
繪制無邊框的水平放置的字體
  //
如果該函數調用時,字體未設置,那么將發生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;


獲得標準的圖形環境,以便在繪制控件時使用。

所有的圖形函數都是通過圖形環境實現的。

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

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

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

CWindowGc& gc = SystemGc();


[3] CWindowGc


窗口圖形環境

絕大多數的窗口環境繪制函數都映射到等價的 CFbsBitGc 類函數——他們作用于任意屏幕上與窗口左上角關聯的直角坐標系。

總體來說, 如果服務端函數遇到某些可以使之發生異常退出的情形時,并不異常退出,而是返回一個錯誤值,以說明函數發生異常退出的情況。這樣,leave可以在client/server分界點的適當的一側被處理。

[4] CWindowGc
類的 UseFont()

virtual void UseFont(const CFont *aFont);


設置環境(上下文)字體

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

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

UseFont()
函數必須在文本繪制之前調用,否則主調線程就會發生Panic。

該函數需要一個CFont型參數,它是一個設備字體。

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

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

iCoeEnv
CCoeEnv 型的一個CCoeControl的一個數據成員。CCoeEnv、CCoeControlCCoeAppUi一起組成了控件環境CONEComponent Enviroment)。
NormalFont()
這個函數的作用是獲取標準的環境字體。這個字體在控件環境CONE初始化時被創建。

三、AppView ConstructL() 方法

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

   // Set the windows size
  //
設置自身窗口的尺寸,該函數的調用將導致 SizeChangedL()函數被調用
   SetRect( aRect );

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


[1] CCoeControl
CreateWindowL()

protected: void CreateWindowL();


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

四、關于OfferKeyEventL()方法

// CHelloWorldPlusAppView::OfferKeyEventL()
// Handles keyevents.
// ---------------------------------------------------------------------------
//
對鍵盤事件的處理
// TKeyEvent
鍵盤事件類。它描述了鍵盤事件的細節
//
說明事件的類型,是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);


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

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

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


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

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

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

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲免费在线视频一区 二区| 欧美精品在线观看一区二区| 久久久久91| 狂野欧美激情性xxxx| 欧美一区二区视频97| 欧美一区二视频| 久久av最新网址| 麻豆成人在线播放| 欧美日韩精品综合| 国产欧美一区二区视频| 好男人免费精品视频| 亚洲精品一区二区三| 亚洲主播在线观看| 久久尤物电影视频在线观看| 欧美激情国产精品| 亚洲一区二区三区午夜| 久久一区激情| 欧美体内she精视频在线观看| 国产精品久久久久一区| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲人成精品久久久久| 欧美一区二区播放| 亚洲福利视频免费观看| 亚洲国产免费看| 欧美伊人精品成人久久综合97 | 亚洲一区在线播放| 久久久久久伊人| 国产精品久久久久aaaa九色| 一区二区三区久久久| 久久久久久伊人| 国产女人aaa级久久久级| 99国产精品视频免费观看| 欧美一区亚洲二区| 亚洲六月丁香色婷婷综合久久| 久久成人精品无人区| 欧美精品在线观看| 一区免费视频| 欧美亚洲系列| 一本色道久久综合亚洲精品按摩 | 一区二区不卡在线视频 午夜欧美不卡在 | 久久精品国产亚洲5555| 亚洲毛片在线看| 久久九九电影| 国产精品网曝门| 亚洲图片欧洲图片av| 久久裸体视频| 亚洲综合首页| 久久亚洲精选| 国产日韩欧美麻豆| 亚洲在线观看免费视频| 亚洲激情一区| 欧美bbbxxxxx| 在线免费不卡视频| 免费日韩av片| 久久天堂av综合合色| 黄色欧美日韩| 久久综合国产精品台湾中文娱乐网| 亚洲欧美日韩一区| 国产女主播一区二区| 亚欧成人在线| 欧美一区视频| 欧美一区三区三区高中清蜜桃| 国产精品国产三级国产aⅴ无密码| 欧美午夜电影一区| 亚洲一区二区成人| 一区二区激情| 国产精品区二区三区日本| 亚洲一级片在线观看| 亚洲性感激情| 国产一区二区三区免费不卡| 毛片一区二区三区| 男女av一区三区二区色多| 亚洲国产精品视频| 亚洲精品在线视频| 国产精品白丝jk黑袜喷水| 在线午夜精品| 亚洲免费在线视频| 狠狠色丁香婷综合久久| 亚洲国产黄色片| 欧美日韩亚洲一区二区三区在线观看 | 亚洲激情在线视频| 亚洲激情在线| 国产精品theporn| 欧美在线影院在线视频| 久久精品免视看| 亚洲第一狼人社区| 亚洲免费av观看| 国产精品亚洲网站| 蜜桃精品一区二区三区| 欧美日韩国产成人| 久久精品91| 欧美日韩国产在线播放| 久久超碰97人人做人人爱| 久久精品国产清高在天天线| 伊人成人在线| 亚洲美女区一区| 国产乱码精品一区二区三区五月婷| 久久久天天操| 欧美精品观看| 久色成人在线| 欧美精品一区二区精品网| 午夜精品久久久久久久久久久久久| 欧美精品成人在线| 香蕉成人啪国产精品视频综合网| 午夜精品久久久久久久白皮肤 | 欧美国产日韩一区二区在线观看 | 欧美国产一区二区| 国产精品美女久久久久久2018| 欧美成人tv| 国产精品日韩一区二区| 欧美凹凸一区二区三区视频| 国产精品久久国产精品99gif| 欧美国产日产韩国视频| 国产亚洲综合性久久久影院| 一本久道久久综合婷婷鲸鱼| 亚洲第一网站| 久久久国产成人精品| 欧美一级二级三级蜜桃| 欧美激情在线免费观看| 久久午夜精品| 国产女人水真多18毛片18精品视频| 91久久黄色| 亚洲欧洲日本专区| 久久久久国产一区二区三区| 久久av一区二区三区漫画| 欧美视频在线观看视频极品| 亚洲国产欧美在线人成| 在线观看欧美亚洲| 午夜伦理片一区| 亚洲欧美成人网| 欧美日韩另类字幕中文| 亚洲黄一区二区| 亚洲人线精品午夜| 久久偷窥视频| 久久影院午夜论| 精品二区视频| 久久精品91| 麻豆91精品91久久久的内涵| 午夜精品理论片| 欧美一区二区三区在线观看| 国产精品videosex极品| 一本色道久久综合亚洲精品婷婷| 在线中文字幕不卡| 欧美性一区二区| 亚洲免费一在线| 久久国产精品高清| 韩国三级电影一区二区| 欧美一级大片在线免费观看| 亚洲欧美在线免费观看| 国产精品99免视看9| 亚洲视频在线观看一区| 久久精品观看| 亚洲国产合集| 欧美精品免费看| 一区二区三区免费观看| 亚洲欧美国产一区二区三区| 国产精品伊人日日| 亚洲二区在线| 亚洲欧美一区二区三区久久| 国产精品毛片一区二区三区| 久久成人18免费观看| 另类av导航| 亚洲免费精品| 欧美性感一类影片在线播放| 性色av一区二区怡红| 久久婷婷蜜乳一本欲蜜臀| 免费黄网站欧美| 亚洲狼人综合| 欧美精品色综合| 99精品免费网| 久久精品久久综合| 亚洲成人在线网站| 亚洲自拍偷拍视频| 欧美+亚洲+精品+三区| 亚洲巨乳在线| 国产欧美一区二区三区久久人妖| 久久大逼视频| 99精品国产福利在线观看免费| 欧美一区二区三区在线视频 | 国产亚洲一区二区精品| 欧美成人精品1314www| 一本色道久久综合狠狠躁的推荐| 久久精品国产欧美激情| 宅男噜噜噜66一区二区| 一区二区在线视频播放| 国产精品久久久久9999高清| 久久久久一区二区三区| 一区二区三区免费看| 亚洲国产欧美一区| 久久一区二区三区超碰国产精品| 日韩视频一区二区三区在线播放免费观看 | 久久久久国内| 中文精品99久久国产香蕉| 韩国精品主播一区二区在线观看| 欧美日韩精品三区| 久久亚洲春色中文字幕久久久| 亚洲午夜激情网页| 91久久久久久久久久久久久| 欧美成人四级电影| 久久久www成人免费毛片麻豆|