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的資源定義。

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,如需轉載請自行聯系原作者。