• <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://www.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)

            隨筆分類

            個人其它博客

            基礎知識鏈接

            最新評論

            閱讀排行榜

            評論排行榜

            av无码久久久久不卡免费网站| 亚洲国产精品久久久久久| 国产精品99久久久精品无码| 日韩欧美亚洲综合久久影院Ds| 久久受www免费人成_看片中文| 久久夜色精品国产噜噜噜亚洲AV | 国产成人精品综合久久久| 久久久久久国产精品无码下载| 亚洲伊人久久精品影院| 久久国产综合精品五月天| 狠狠精品久久久无码中文字幕| 久久精品三级视频| 精品久久人妻av中文字幕| 麻豆久久久9性大片| 国产99久久久国产精免费| 99久久国产热无码精品免费| 国产精品乱码久久久久久软件| 亚洲国产成人久久精品影视| 久久精品国产亚洲AV电影| 亚洲国产婷婷香蕉久久久久久| 久久精品无码专区免费东京热| 欧美亚洲国产精品久久久久| 久久久久无码精品国产app| 久久se精品一区精品二区| 亚洲中文字幕久久精品无码APP| 日韩美女18网站久久精品 | 亚洲伊人久久综合影院| 91性高湖久久久久| 麻豆精品久久久一区二区| 久久精品毛片免费观看| 久久久无码一区二区三区| 亚洲成色WWW久久网站| 狠狠色噜噜色狠狠狠综合久久| 亚洲Av无码国产情品久久| 色青青草原桃花久久综合| 亚洲精品NV久久久久久久久久| 青青青青久久精品国产h久久精品五福影院1421 | 久久精品国产99久久久古代| 国产精品99久久久久久www| 麻豆AV一区二区三区久久| 久久精品国产精品亚洲精品|