• <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>
            franksunny的個人技術空間
            獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

             完整文檔下載地址http://m.shnenglu.com/Files/franksunny/RNotifier.7z

            如何在S60UI框架程序中彈提示信息

             

            在非依賴于UIS60程序中,也就是不建立在控件環境基礎上的程序,比如控制臺應用程序,獨立的線程等。在這些程序中需要彈提示信息的時候,就不能直接用基于CCoeControl的任何UI類了,因為這些程序中沒有供養CCoeControl生存的CCoeEnv環境,當然不嫌繁瑣,在程序的main函數中像自己創建活動規劃器一樣去創建CCoeEnv環境也是一個可行的方法,但是這超出本文的涉及范圍,本文提出的是不創建CCoeEnv環境情況下,通過RNotifierRNotifier的派生類來實現彈提示信息。

            RNotifier簡單應用

            其實RNotifierRFs一樣都是派生自RSessionBase,所以使用起來也是類似的,下面給出一個最簡單的例子代碼

                   RNotifier vNotifier;

                   User::LeaveIfError(vNotifier.Connect());

                   CleanupClosePushL(vNotifier);

             

                   //title and context

                   TBuf<256> title;

                   TBuf<256> context;

                   title.Copy(_L("info"));

                   context.Copy(_L("data"));

             

                   // Button text

                   _LIT(KYesButton, "Yes");

                   _LIT(KNoButton, "No");

             

                   // Display the dialog

                   TInt button;

                   TRequestStatus status;

                   vNotifier.Notify(title, context, KYesButton, KNoButton, button, status);

                   User::WaitForRequest(status);

             

                   // destroy notifier

                   CleanupStack::PopAndDestroy();

            運行上述代碼可以得到如下的對話框提示

            RNotifier本身和RFs是基于Symbian OS的,而非專屬于S60平臺的,所以在UIQ等平臺上繼續可以使用RNotifier,這在跨平臺開發上相當的便利,省去了移植的苦惱。

            RNotify復雜應用

            上面例子代碼是最簡單的一種RNotifier的應用,為了開發的方便和提高開發效率,S60封裝了一套CAknGlobal*RAknKeyLock等的類供第三方開發者使用,由于在UIQ平臺上我沒有涉及過,而且目前借助S60的開源代碼,我就拿一個S60中的相關類CAknGlobalConfirmationQuery來說明下吧,在源代碼sf\mw\classicui\uifw\AvKon\notifsrc路徑下面有多個類似類的源代碼。其實CAknGlobalConfirmationQuery除了二階段構造外,最主要的就是ShowConfirmationQueryLUpdateConfirmationQueryCancelConfirmationQuery三個函數,這三個函數的代碼羅列如下

                    /**

                    * Shows global Confirmation query synchronously

                    *

                    * @param    aStatus         TRequestStatus which will be completed when user

                    *                               selects one item from the list query.

                    * @param    aPrompt         Prompt text

                    * @param    aSoftkeys       Softkey resource

                    * @param    aAnimation      Animation resource

                    * @param    aTone           Tone id

                    * @param    aDismissWithAllKeys If set ETrue the query gets dismissed with all

                    *                                   keypresses

                    */

            EXPORT_C void CAknGlobalConfirmationQuery::ShowConfirmationQueryL(

                TRequestStatus& aStatus,

                const TDesC& aPrompt,

                TInt aSoftkeys,

                TInt aAnimation,

                const TDesC& aImageFile,

                TInt aImageId,

                TInt aImageMaskId,

                CAknQueryDialog::TTone aTone,

                TBool aDismissWithAllKeys )

            {

                delete iBuffer;

                iBuffer = NULL;

                iBuffer = CBufFlat::NewL(KBufferGranularity);

             

                RBufWriteStream bufStream;

                bufStream.Open(*iBuffer);

             

                CleanupClosePushL(bufStream);

             

                bufStream.WriteInt32L(KAKNNOTIFIERSIGNATURE);

             

                if ( aDismissWithAllKeys )

                {

                    bufStream.WriteInt8L( ETrue );

                }

                else

                {

                    bufStream.WriteInt8L( EFalse );

                }

             

                bufStream.WriteInt32L(aSoftkeys);

                bufStream.WriteInt32L(aAnimation);

                bufStream.WriteInt16L(aImageId);

                bufStream.WriteInt16L(aImageMaskId);

                bufStream.WriteInt16L(aTone);

                bufStream.WriteInt16L(aPrompt.Length());

                bufStream << aPrompt;

                bufStream.WriteInt16L(aImageFile.Length());

                if (aImageFile.Length())

                {

                    bufStream << aImageFile;

                }

             

                bufStream.WriteInt32L(iSkinsMajorId);

                bufStream.WriteInt32L(iSkinsMinorId);

             

                if (iAknSDData)

                {

                    bufStream.WriteInt8L(ETrue);

                    bufStream << *iAknSDData;       

                }

                else

                {

                    bufStream.WriteInt8L(EFalse);           

                }

             

                iBufferPtr.Set(iBuffer->Ptr(0));

                iNotify.StartNotifierAndGetResponse(aStatus, KAknGlobalConfirmationQueryUid,

                    iBufferPtr, iResultBuf);

             

                CleanupStack::PopAndDestroy();  // bufStream

            }

            該函數用于顯示對話框。其主要的實現就是調用RNotifierStartNotifierAndGetResponse函數。

            EXPORT_C void CAknGlobalConfirmationQuery::UpdateConfirmationQuery( TInt aSoftkeys )

            {

                iSoftkeys = aSoftkeys;

                iCmd = EAknUpdateGlobalQuery;

                TPckgBuf<SAknNotifierPackage<SAknGlobalMsgQueryParams> > pckg;

                pckg().iParamData.iCmd = iCmd;

                pckg().iParamData.iSoftkeys = iSoftkeys;

             

                TPckgBuf<TInt> ret;

                iNotify.UpdateNotifier( KAknGlobalConfirmationQueryUid, pckg, ret);

            }

            該函數用于對話框產生后更新對話框,其功能就是使用函數RNotifier::UpdateNotifier

            EXPORT_C void CAknGlobalConfirmationQuery::CancelConfirmationQuery()

            {

                if (iBuffer)

                {

                    iNotify.CancelNotifier(KAknGlobalConfirmationQueryUid);

                    delete iBuffer;

                    iBuffer = 0;

                }

            }

            該函數用于對話框產生后程序取消對話框,其功能就是使用函數RNotifier::CancelNotifier

            RNotifier的實現跟蹤

            通過以上兩個代碼,我們差不多對RNotifier類的使用了解了,但是這個RNotifier到底是如何實現彈出一個對話框呢?

            其實RNotifier的真正實現是通過Symbian OSC/S架構來實現的,這個在文章開篇提到RNotifierRFs一樣派生自RSessionBase就已經埋下了伏筆。

            RNotifier的源代碼實現位于sf\os\kernelhwsrv\kernel\eka\euser\us_ksvr.cpp,這個代碼中還有RChunkRDeviceRHandleBase等等基礎類的實現代碼。

            RNotifier的服務器類CNotifierServer和服務器會話通道類CNotifierSession以及相關的其他類則位于sf\os\kernelhwsrv\kernel\eka\ewsrv\ws_main.cpp中。這些類的聲明則位于sf\os\kernelhwsrv\kernel\eka\include\twintnotifier.h文件中。

            再深入進去,就會了解到RConsole類,這個類的聲明位于sf\os\kernelhwsrv\kernel\eka\include\e32twin.h中,代碼實現位于sf\os\kernelhwsrv\kernel\eka\ewsrv\co_cli.cpp中。搞了半天又遇到一個C/S架構,這個ClientServerCWsServer,其通道為CWsSession,在CWsSession內最主要的類是CWsWindow,這幾個類的聲明位于sf\os\kernelhwsrv\kernel\eka\include\ws_std.h,而這幾個類的實現代碼則又繞回到sf\os\kernelhwsrv\kernel\eka\ewsrv\ws_main.cp中去了。

            好了,自己暫時只能走到這一步了,上面只是簡單給出一些源代碼的路徑,有興趣的同學可以去一探究竟,我才疏學淺就只能點到為止了。

            歡迎對其有更深入挖掘的同學能夠發布新的小結,到時記得分享到我的郵箱frank.sunny@163.com,當然假如我文中有什么錯誤也希望能夠告知我一下,謝謝。

             

             

            posted on 2010-12-17 21:26 frank.sunny 閱讀(2022) 評論(0)  編輯 收藏 引用 所屬分類: symbian 開發

            常用鏈接

            留言簿(13)

            隨筆分類

            個人其它博客

            基礎知識鏈接

            最新評論

            閱讀排行榜

            評論排行榜

            狠狠狠色丁香婷婷综合久久五月| 伊人久久大香线蕉精品| 99精品国产综合久久久久五月天 | 久久激情亚洲精品无码?V| 国产一区二区三精品久久久无广告 | 久久国产视频99电影| 精品国产日韩久久亚洲| 久久无码av三级| 久久久久亚洲AV片无码下载蜜桃| 精品国产一区二区三区久久| 久久只有这精品99| 国产免费久久久久久无码| 久久久久久久久久久精品尤物| 好久久免费视频高清| 无码久久精品国产亚洲Av影片| 久久中文娱乐网| 精品久久久久久无码专区| 久久综合精品国产一区二区三区| 97久久综合精品久久久综合| 99久久国产综合精品女同图片| 无码乱码观看精品久久| 激情五月综合综合久久69| 久久九九亚洲精品| 99久久中文字幕| 狠色狠色狠狠色综合久久| 狠狠色婷婷久久一区二区三区| 亚洲伊人久久精品影院| 国产精品中文久久久久久久| 欧美久久一级内射wwwwww.| 久久精品人妻一区二区三区| 久久亚洲国产欧洲精品一| 青青青国产成人久久111网站| 国产精品无码久久综合| AV无码久久久久不卡蜜桃| 99精品久久精品| 蜜桃麻豆www久久| 久久免费香蕉视频| 一级做a爰片久久毛片看看| 久久毛片一区二区| 久久久无码人妻精品无码| 国产成人精品白浆久久69|