天天看點

使用Carbide.vs與VS.NET2003建構Symbian開發平台-S60 平台(五)

5.2 建立登陸框

            在這裡我們要建立一個登陸框,用于生成使用者名和密碼的對話框,按照傳統的Symbian OS C++開發,我們本來應該在HelloWorld.rss 裡定義資源,但是有了Carbide.vs後我們卻可以利用 Carbide.vs提供的功能非常友善地生成我們所要的資源,請打開 HelloWorld.rss 定位到檔案的最後,點選右鍵->Add Fragment 将會出現Carbide.vs提供的生成資源視窗,在Template 處選擇 S60 Multiline query dialog ,在下方會出現此對話框的效果圖,就是我們所要的登陸框樣子,按下一步,指定一個比較有效的名字,r_login_query ,最後按Finish生成資源,你将會發現HelloWorld.rss多了幾行内容,這就是r_login_query的資源定義。

使用Carbide.vs與VS.NET2003建構Symbian開發平台-S60 平台(五)
使用Carbide.vs與VS.NET2003建構Symbian開發平台-S60 平台(五)

 RESOURCE DIALOG r_login_query {

  flags = EGeneralQueryFlags;

 buttons = R_AVKON_SOFTKEYS_OK_CANCEL;

 items = {

  DLG_LINE {

   type = EAknCtMultilineQuery;

   id = EMultilineFirstLine;

   control = AVKON_DATA_QUERY {

    layout = EMultiDataFirstEdwin;

    label = "Username:";

    control = EDWIN { maxlength = 8; };

   };

  },

   id = EMultilineSecondLine;

    layout = EMultiDataSecondSecEd;

    label = "Password:";

    control = SECRETED { num_letters = 8; };

  }

 };

}

 為了要讓程式更通用,本地化起來,我們有必要将UserName與Password的值定義到.loc檔案中,打開HelloWorld.loc檔案,加入以下定義:

 #define qtn_username "UserName:"

 #define qtn_password "Password:"

  接下來我們來編寫代碼讓這個登陸框顯示出來,請打開HelloWorldView.h 先加下以下檔案的引用

 #include <AknQueryDialog.h>

 #include <aknnotewrappers.h>

 #include <StringLoader.h> 

 #include "HelloWorld.hrh"

 再加入處理函數的聲明

 void HandleLoginL();

 接着打開HelloWorld.loc 我們還要定義一些要顯示的文本

 #define qtn_login_success "Congretulation You Have Loged in"

 #define qtn_login_fail "Sorry you have the wrong username or password"

 #define qtn_login_cancel "You have canceled the login"

 分别定義了登陸成功,登陸失敗,與取消登陸的三種顯示文本

 打開HelloWorld.rss檔案,加入資源定義 

 RESOURCE TBUF r_login_success { buf = qtn_login_success; }

 RESOURCE TBUF r_login_fail { buf = qtn_login_fail; }

 RESOURCE TBUF r_login_cancel { buf = qtn_login_cancel; }

 這樣我們就能在程式中動态裝入這些資源了,繼續打開HelloWorldView.cpp檔案,實作HandleLoginL函數的定義

 void CHelloWorldView::HandleLoginL()

 {

     _LIT(KCorrectLogin,"bention");//定義正确的使用者名

     _LIT(KCorrectPwd,"123456");//定義正确的密碼

     //顯示對話框

     TBuf<8> username(_L(""));

     TBuf<8> password(_L(""));

     CAknMultiLineDataQueryDialog* dialog=CAknMultiLineDataQueryDialog::NewL(username,password);//聲明登陸對話框對象

     if (dialog->ExecuteLD(R_LOGIN_QUERY)) {//調用登陸對話框

         if (username.Compare(KCorrectLogin)==0 && password.Compare(KCorrectPwd)==0) {

       //登陸成功

       CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote();//定義一個資訊提示框

       HBufC* notePrompt=StringLoader::LoadLC(R_LOGIN_SUCCESS);//裝載R_LOGIN_SUCCESS文本資源,以顯示登陸成功資訊

       note->ExecuteLD(*notePrompt);//打開對話框

       CleanupStack::PopAndDestroy(notePrompt);

    }

   else {

       //登陸失敗

       CAknErrorNote* note = new (ELeave) CAknErrorNote();//定義一個錯誤提示框

       HBufC*  notePrompt=StringLoader::LoadLC(R_LOGIN_FAIL);//裝載R_LOGIN_FAIL文本資源,以顯示登陸失敗資訊

       note->ExecuteLD(*notePrompt);

   }

 }

 else {

      //取消登陸

      CAknWarningNote* note = new (ELeave) CAknWarningNote();//定義一個警告提示框

      HBufC* notePrompt=StringLoader::LoadLC(R_LOGIN_CANCEL);//裝載R_LOGIN_CANCEL文本資源,以顯示取消登陸警告資訊

      note->ExecuteLD(*notePrompt);

      CleanupStack::PopAndDestroy(notePrompt);

 接下去我們還差啥?就差把HandleLoginL放在處理菜單指令的函數中了,定位到HandleCommandL 中,HandleCommandL 是用來專門處理事件的,我們在switch結構中加入

 case EHelloWorldCmdLogin:

  {

   HandleLoginL();

   break;

 其中的EHelloWorldCmdLogin 就是我們的登陸按鈕啦,這樣就實作了當我們點選了Login按鈕後就會調用HandleLoginL去做相應的處理。

本文轉自peterzb部落格園部落格,原文連結:http://www.cnblogs.com/peterzb/archive/2009/06/11/1501594.html,如需轉載請自行聯系原作者。