作者:hoolee
创建Internet连接最好的方法
说明:
建立Internet连接的最好的方法是使用Internet Connection Initiator API.
其头文件为Intconninit.h,链接库为Intconninit.lib。
下面是如何使用的示例代码,如果没有默认连接(Preferred Connection),
实际上, 你可以创建一个活动对象(active object)来控制连接的初始化过程.
CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref pref1; CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref pref2; //--- First preference ---- pref1.iRanking = 1; pref1.iDirection = ECommDbConnectionDirectionOutgoing; pref1.iDialogPref = ECommDbDialogPrefDoNotPrompt; CCommsDbConnectionPrefTableView::TCommDbIapBeare bearer1; bearer1.iBearerSet = ECommDbBearerGPRS; bearer1.iIapId = 0x01; pref1.iBearer = bearer1; //---Second preference --- pref2.iRanking = 2; pref2.iDirection = ECommDbConnectionDirectionOutgoing; pref2.iDialogPref = ECommDbDialogPrefDoNotPrompt; CCommsDbConnectionPrefTableView::TCommDbIapBearer bearer2; bearer2.iBearerSet = ECommDbBearerCSD; bearer2.iIapId = 0x04; pref2.iBearer = bearer2; //---Call Initiator--- TRequestStatus status(KRequestPending); CIntConnectionInitiator* initConn = CIntConnectionInitiator::NewL(); CleanupStack::PushL(initConn); initConn->ConnectL(pref1, pref2, status);
热键事件和键位码
说明:
如果您的窗口组没有获得键盘焦点,您可以使用
RWindowGroup::CaptureKey() 来捕捉键盘事件。
应用程序中按键的扫描码(scan code)有着会有下面这样的
名字EStdKeyApplication0。具体可以参看60系列开发工具
中\Epoc32\Include\uikon.hrh 文件的内容。
不綺用户提示创建一个Internet连接
说明:
下面的代码演示了如何创建一个Internet连接,而不提示用户
使用哪种方法连接或者选择哪个GPRS接入点. 你需要知道你想
使用的那个Internet接入点(IAP)的标示(ID)。
RSocketServ socketServ; RConnection connection; User::LeaveIfError(socketServ.Connect()); User::LeaveIfError(connect.Open(socketServ)); TCommDbConnPref pref; pref.SetIapId(4); // IAP ID for connection to be used pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); pref.SetDirection( ECommDbConnectionDirectionOutgoing ); connection.Start(pref);
TInt iNum1(123456789009876);
// 将缓存的内容设置为iNum1
iBuf.Num(iNum1);
// 使用iBuf包含的内容创建TLex对象
// the 15 digit number
TLex iLex(iBuf);
// iNum1
TInt iNum2;
//iNum2现在包含了15位数字
iLex.Val(iNum2);
在一部S60设备上,如何编程中将一个应用程序(如果我知道它的UID)的
快捷方式添加“收藏夹”中呢?这里使用到的类是CPinbLinkBase . 要设置这个
应用程序的UID, 可以使用
CPinbLinkBase::SetApplicationUidL(const TUid& aUid);
询问:
symbian API中提供了使用CAknIconArray读取资源图标供listbox所用的方法。
它使用了AKN_ICON_ARRAY结构,请问能否提供一段代码描述如何使用?
解答:
在资源中有如下描述:
RESOURCE AKN_ICON_ARRAY r_icon_testIcons { type = EAknIconArraySimple; bmpfile = "z:\SYSTEM\DATA\AVKON.MBM"; icons = { AKN_ICON { iconId = EMbmAvkonQgn_indi_checkbox_on; maskId = EMbmAvkonQgn_indi_checkbox_on_mask; }, AKN_ICON { IconId = EMbmAvkonQgn_indi_checkbox_off; maskId = EMbmAvkonQgn_indi_checkbox_off_mask; } }; }
在编写代码时,可以使用CAknIconArray::ConstructFromResourceL()来构造图标
... // CAknSingleGraphicStyleListBox* iListbox; iListbox = new(ELeave)CAknSingleGraphicStyleListBox(); iListbox->SetContainerWindowL(*this); TResourceReader reader; CEikonEnv::Static()->CreateResourceReaderLC(reader, R_LIST); iListbox->ConstructFromResourceL(reader); // Creates a GUI icon array. CAknIconArray* icons =new(ELeave) CAknIconArray(2); CleanupStack::PushL(icons); icons->ConstructFromResourceL(R_ICON_TESTICONS); // Sets graphics as ListBox icon. iListbox->ItemDrawer()->ColumnData()->SetIconArray(icons); CleanupStack::Pop(); // icons CleanupStack::PopAndDestroy(); // reader
如何在程序中启动并显示“设置”程序
说明:
按如下代码所示,可以在程序中启动“设置”程序
// Application UID for Settings Application const TUid KSettingsUid = { 0x100058EC }; // UID of the display view in the Settings Application const TUid KSettListDisplViewId = { 5 }; AppUi()->ActivateViewL( TVwsViewId(KSettingsUid, KSettListDisplViewId));
注意这里的启动是异步的
Series60中如何动态改变按钮或关闭它们
说明:
你可以通过如下方式来改变按钮:
定义一个资源
RESOURCE CBA r_my_cba { buttons = { CBA_BUTTON { id = EMyButton1; txt = "Button1"; }, CBA_BUTTON { id = EMyButton2; txt = "Button2"; } }; }
在代码中调用SetCommandSetL()方法:
iAvkonAppUi->Cba()->SetCommandSetL(R_MY_CBA);
iAvkonAppUi->Cba()->DrawNow();
如果需要关闭按钮,可以使用系统预定义的R_AVKON_SOFTKEYS_EMPTY资源
如何监测名片夹数据库的变化
说明:
下面提供一段代码示例如何监测名片夹的变化
// Application UI owns contact observer class CEventsAppUi : public CEikAppUi { public: void ConstructL(); ~CEventsAppUi(); public: void HandleCommandL(TInt aCommand); private: CEventsAppView* iAppView; // owns CEventsContacts* iContactObserver; }; void CEventsAppUi::ConstructL() { BaseConstructL(); // Call base constructor iAppView = CEventsAppView::NewL(ClientRect()); AddToStackL(iAppView); // Create an observer iContactObserver = new(ELeave) CEventsContacts(iAppView); iContactObserver->ConstructL(); } // CEventsContacts implements MContactDbObserver interface class CEventsContacts : public CBase, public MContactDbObserver { public: CEventsContacts(CEventsAppView* aAppView); void ConstructL(); ~CEventsContacts(); // Override the virtual function of MContactDbObserver void HandleDatabaseEventL(TContactDbObserverEvent aEvent); private: CContactDatabase* iContactDb; CContactChangeNotifier* iNotifier; CEventsAppView* iAppView; }; CEventsContacts::CEventsContacts(CEventsAppView* aAppView) :iAppView(aAppView) { } void CEventsContacts::ConstructL() { // Open the database iContactDb = CContactDatabase::OpenL(); // Register the observer iNotifier = CContactChangeNotifier::NewL(*iContactDb, this); } CEventsContacts::~CEventsContacts() { delete iNotifier; delete iContactDb; } void CEventsContacts::HandleDatabaseEventL(TContactDbObserverEvent aEvent) { // The changed item TContactItemId contactItem = aEvent.iContactId; switch (aEvent.iType) { case EContactDbObserverEventContactChanged: // Handle contact changed event break; case EContactDbObserverEventContactDeleted: // Handle contact deleted event break; ... default: break; } }
如何自定义询问对话框的按钮
说明:
自定义按钮需要先构造资源文件,如下:
[code]
RESOURCE CBA r_my_softkey
{
buttons =
{
CBA_BUTTON
{
id = EAknSoftkeyMaybe;
txt = "Maybe"; // Texts can be defined in .loc file(s)
// to support language localization
},
CBA_BUTTON
{
id = EAknSoftkeyWhy;
txt = "Why?";
}
};
}
[code]
然后取代询问对话框的默认按纽:
RESOURCE DIALOG r_myconfirmation_query { flags = EGeneralQueryFlags; buttons = r_my_softkey; // note that own softkey is // used as lowercase items = { DLG_LINE { type = EAknCtQuery; id = EGeneralQuery; control = AVKON_CONFIRMATION_QUERY; }, ... }
询问对话框的处理和其他对话框一样,可以通过OkToExit()来处理按键:
// class CMyAknQueryDialog: public CAknQueryDialog, ... #include <eikenv.h> TBool CMyAknQueryDialog::OkToExitL(TInt aButtonId) { if (aButtonId == EAknSoftkeyMaybe) // Handle “Maybe” key press else if (aButtonId == EAknSoftkeyWhy) // Handle “Why” key press return ETrue; }
了如何通过修改Bmpmanip例子,来完成从GIF图像文件中读取指定桢的功能。
Series 60 SDK中的CBmpmanipAppView例子(在\Series60Ex\bmpmanip\src\bmpmanipappview.cpp)
并按照如下代码进行修改:
TFrameInfo frameInfo; // 从GIF图像文件中找到指定桢 // 将其定义到gifFrameIndex // 获取桢信息 iConverter->FrameInfo(gifFrameIndex, frameInfo); // 从GIF的大小中创建位图 TInt err = iBitmap->Create(frameInfo.iOverallSizeInPixels, KDeviceColourDepth); if (err == KErrCouldNotConnect) { // 处理错误 } // 把一个GIF桢转换为位图 TRAPD(convertErr, iConverter->ConvertL(*iBitmap, gifFrameIndex));
下面的代码可以得到可用内存的数量。
TMemoryInfoV1Buf info; UserHal::MemoryInfo(info); TInt freeMemory = info().iFreeRamInBytes;
一个基于60系列的手持设备的软件版本的Build,可以通过
使用SysUtil::GetSWVersion() 类来获取:
TBuf<64> swBuf;SysUtil::GetSWVersion(swBuf);
怎样获取可用的堆内存(heap memory)数量
说明:
获取可用堆内存的数量,请参考SDK Help中的User::Available()
和RHeap::Available()两个函数。
如何在程序中启动记事本及图片浏览程序
说明:
我们可以通过下列方式在程序中启动记事本及图片浏览程序
void TTestEmbedApp::EmbedLaunchFileL(const TDesC& aFile) { // iDocHandler is a CDocumentHandler pointer if( !iDocHandler) { iDocHandler = CDocumentHandler::NewL((CEikProcess*)iEikonEnv->Process()); } TDataType empty; iDocHandler->OpenFileEmbeddedL(aFile, empty); }
程序将根据文件类型启动相应的系统程序(记事本或图片浏览器),如果aFile为txt文件
则记事本将启动,并显示这个文件。
如果aFile是jpg文件,则图片浏览器将启动,并显示这张图片。
这里需要用到下列库:
LIBRARYcommonui.lib // Documenthandler
LIBRARYapmime.lib // TDataType
需要包含下列头文件:
#include <DocumentHandler.h>
#include <apmstd.h> // TDataType
如何构造一个能接收多位数字的输入框
说明:
详细描述:
我想向用户提供一个输入框,用户可以输入15位数字。我现在使用
CAknTextQueryDialog,因为CAknNumberQueryDialog虽然能接收数字输入,但不能满足我的位数要求。
如果使用CAknTextQueryDialog虽然可以输入足够15位字符,但很难保证用户输入的就是数字。
请问有没有方法提供一个能接收多位数字的输入框?
解决方案
可以通过指定Edwin editor的flags标记来限定用户的输入,输入对话框的资源看起来如下:
DLG_LINE { type=EEikCtEdwin; id=EMyQuery; control=EDWIN { maxlength=15; }; } ... void CTestDlgDialog::PrepareLC(TInt aResourceId) { CEikDialog::PrepareLC( aResourceId ); // Dialog base class can be CAknDialog //CAknDialog::PrepareLC( aResourceId ); // Pick up the Editor control from the dialog CEikEdwin* control = static_cast<CEikEdwin*>(ControlOrNull(EMyQuery)); // Set the input mode control->SetAknEditorInputMode(EAknEditorNumericInputMode); // Restrict the other input modes control->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode); }
上面的示例提供给用户一个可以输入足够位数数字的对话框。
但是它也允许用户输入"*#pw+"这样的字符——通过使用"*"或
"#"键,我们可以监控用户的按键输入来避免用户输入这些字符。
还可以显示一个警告框提示用户的非法输入。
在应用程序中内置一个摄像头的视图
说明:
详细描述
我怎样可以像我的程序中添加一个内置式的
摄像头的视图(view)呢?比如在'信息'程序
中,选项->添加->新图象,这样的功能。
概况
下面的代码演示了如何在一个应用程序中内
置一个摄像头程序。包括启动摄像头的函数,
MApaEmbeddedDocObserver::NotifyExit()
这一函数也要对其进行实现,以便用户退出
时做出响应。
解决方案
void MyApplication::NewImage() { const TUid KUidCamera = { 0x1000593F }; RApaLsSession apaLs; TApaAppInfo appInfo; CApaDocument* doc = NULL; CEikProcess* process = CEikonEnv::Static()->Process(); User::LeaveIfError(apaLs.Connect()); CleanupClosePushL(apaLs); User::LeaveIfError(apaLs.GetAppInfo(appInfo, KUidCamera)); doc = process->AddNewDocumentL(appInfo.iCaption, KUidCamera); CleanupStack::PopAndDestroy(); // apaLs TApaDocCleanupItem cleanup(process, doc); CleanupStack::PushL(cleanup); doc->NewDocumentL(); CleanupStack::Pop(); // cleanup doc->EditL(this, ETrue); } void MyApplication::NotifyExit(TExitMode aMode) { // camera view has been closed }
怎样检测笔型键("ABC"key)
说明:
详细描述
笔型键("ABC"key)的TKeyEvent.iCode值和iScanCode
的值分别是什么?
解决方案
在60系列手持设备上,笔型键被影射为上档修饰(Shift
Modifier)键。下面的代码演示和如何可以检测他:
TKeyResponse CMyClass::OfferKeyEventL(...) { TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift); ... }
他的键盘码和扫描码(keycode and scancode)取决于按
下SHIFT键的同时还按下了另外哪个键。下面的代码演示
了一个列表框的OfferKeyEventL()函数如何检测
SHIFT+OK组和键,这个组和键被用来标记列表框成员。
TKeyResponse CMyBusinessClass::OfferKeyEventL(...) { TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift); if (shiftKeyPressed && aKeyEvent.iCode==EKeyOK) DoSomething(); ... }
我怎样可以获取一个视图(view)中控件(container)的指针
说明:
你可以通过下面的方法来获取一个视图(view)中控件(container)的指针:
CAknView* view = iAvkonViewAppUi->View(myViewUid);
怎么才能隐藏菜单中的图标
说明:
在AIF资源文件中(.rss)中使用KAppIsHidden标记
RESOURCE AIF_DATA { app_uid=...; num_icons=2; embeddability=KAppNotEmbeddable; newfile=KAppDoesNotSupportNewFile;' hidden=KAppIsHidden; }
如何不让程序显示在任务列表中
说明:
描述:
一个应用程序可以被设为电话程序级别,这样就不会响应关闭程序事件了。
如果要这样做,我们需要调用CEikonEnv::SetSystem(ETrue)。
而另一个相似的函数为CEikonEnv::SetBusy(),它的不同之处在于在关闭时会
显示一个确认对话框,在用户确认之前是不会关闭该程序的。这主要用
于重要任务不能被中断时。
解决方案:
下面的代码展示了如何将程序从任务列表中隐去。
TInt wgId = iEikonEnv->RootWin().Identifier(); RWsSession session = iEikonEnv->WsSession(); CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC(session, wgId); wgName->SetHidden(ETrue); wgName->SetWindowGroupName(iEikonEnv->RootWin()); CleanupStack::PopAndDestroy(); // wgName
结论:
第三方程序切记不要使用隐藏或系统级别处理。除非这样做是十分必须和必要的。
对用户来说,总应该可以看到自己手机上正在运行的程序,并予于关闭、释放内存。
如何隐去等待对话框中的齿轮图标
说明:
详细描述
在等待对话框中我们一般都会看到一个齿轮动籣图标,你也可以定义你自己的图标来取代它。参考SDK中的note例子就可以了解。
在avkon.mbg中有很多图标的id,如EMbmAvkonQgn_note_empty和EMbmAvkonQgn_note_empty_mask,怎么使用它们才能显示一个空白图标呢?
下面的资源示例展示了如何构造一个空白图标的等待对话框:
RESOURCE DIALOG r_aknexnote_wait_note_softkey_cancel { flags = EAknWaitNoteFlags; buttons = R_AVKON_SOFTKEYS_CANCEL; items = { DLG_LINE { type = EAknCtNote; id = EAknExNoteCtrlIdWaitNote; control= AVKON_NOTE { layout = EWaitLayout; singular_label = qtn_aknexnote_wait_prompt; imagefile = AVKON_BMPFILE_NAME; imageid = EMbmAvkonQgn_note_empty; imagemask = EMbmAvkonQgn_note_empty_mask; animation = R_QGN_GRAF_WAIT_BAR_ANIM; }; } }; }
如何在程序中启动安装程序卸载某应用
说明:
下列代码展示了如何在程序中启动安装程序卸载某应用,在“c:\system\install\”下有相应程序.SIS文件,它包含了程序安装的信息。我们要进行的卸载操作就是要将.PKG中所有生成的文件都删除干净,以及c:\system\install\目录下相关的.SIS文件。
#include <apacmdln.h> #include <eikdll.h> #include <instapp.h> CApaCommandLine* cmdLine; cmdLine=CApaCommandLine::NewLC(); cmdLine->SetLibraryNameL( _L("z:\\System\\apps\\instapp\\instapp.app")); cmdLine->SetDocumentNameL( _L("c:\\system\\install\\MyApplication.sis")); cmdLine->SetCommandL(EApaCommandRun); cmdLine->SetTailEndL(KUninstallCommandLineTail); EikDll::StartAppL(*cmdLine); CleanupStack::PopAndDestroy(); // cmdLine
我怎样可以在使用摄像头拍照的时候添加一个快门的
声音呢?
说明:
使用CAknKeySoundSystem类将会在摄像头捕捉籣面的
时候播放声音方面是一个很有效的方法。下面的代码
演示了如何在你的应用程序中实现这个特性:
// myapp.h #include <aknsoundsystem.h> const TInt KSnapSoundId = 2; class MyClass { ... private: CAknKeySoundSystem* iCameraSound; }; void MyClass::ConstructL() { ... iCameraSound = static_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi())->KeySounds(); if (iCameraSound) { TRAPD(error, iCameraSound->AddAppSoundInfoListL( R_CAMERA_SNAP_SOUND)); if ((error != KErrAlreadyExists) && (error != KErrNone)) { User::LeaveIfError(error); } } } void MyClass::PlaySnapSound() { iCameraSound->PlaySound(KSnapSoundId); }
#define KcameraSoundFile "Z:\\system\\sounds\\digital\\Camera1a_2_8kHz.wav" #define KSnapSoundId 2 RESOURCE AVKON_SOUND_INFO_LIST r_camera_snap_sound { list = { AVKON_SOUND_INFO { sid = KSnapSoundId; priority = 45; preference = EAknAudioPrefCamera; // defined in avkon.hrh file = KCameraSoundFile; } }; }