• <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>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0
            首先聲明講的是思考問題的思路,具體skin無非采用hook subclass技術。對于一個事情全局把握,點到為止,個人覺得順藤摸瓜,抓住有效線索對于學習技術很重要。

            今天無聊,想起BCG有個Skin Application,于是研究了下。
            開始不明白怎么回事,用向導生產了一個Skin,看了下程序結構:
            class?CwlwSkin?:?public?CBCGPVisualManager
            這個是Skin實現應該了,暫且不管,因為主要想看看機制。
            有這些函數:
            CTestSkinApp?theApp;

            CRuntimeClass
            *?__stdcall?BCGCBProGetSkinClass?(int?iIndex)
            {
            ????
            switch?(iIndex)
            ????
            {
            ????
            case?0:
            ????????
            return?RUNTIME_CLASS?(CwlwSkin);

            ????
            //?TODO:?return?other?skin?classes?here
            ????
            ????}


            ????
            return?NULL;
            }

            //*************************************************************************************
            int?__stdcall?BCGCBProGetSkinCount?()
            {
            ????
            return?1;
            }

            //*************************************************************************************
            LPCTSTR?__stdcall?BCGCBProGetSkinName?(int?iIndex)
            {
            ????
            switch?(iIndex)
            ????
            {
            ????
            case?0:
            ????????
            return?_T("wlwSkin");

            ????
            //?TODO:?return?other?skin?names?here
            ????
            ????}


            ????
            return?NULL;
            }

            //*************************************************************************************
            BOOL?__stdcall?BCGCBProGetSkinVersion(int&?iVersionMajor,int&?iVersionMinor)
            {
            ????iVersionMajor?
            =?_BCGCBPRO_VERSION_MAJOR;
            ????iVersionMinor?
            =?_BCGCBPRO_VERSION_MINOR;

            ????
            return?TRUE;
            }

            //*************************************************************************************
            BOOL?__stdcall?BCGCBProIsUNICODE()
            {
            #ifdef?_UNICODE
            ????
            return?TRUE;
            #else
            ????
            return?FALSE;
            #endif
            }

            //*************************************************************************************
            BOOL?__stdcall?BCGCBProPreviewSkin?(CDC*?pDC,?int?iIndex,?CRect?rectPreview)
            {
            ????AFX_MANAGE_STATE(AfxGetStaticModuleState?())

            ????
            switch?(iIndex)
            ????
            {
            ????
            case?0:
            ????????
            {
            ????????????CBitmap?bmpPreview;
            ????????????bmpPreview.LoadBitmap?(IDB_WLWSKIN_PREVIEW);

            ????????????pDC
            ->DrawState?(rectPreview.TopLeft?(),?rectPreview.Size?(),?
            ????????????????????????????
            &bmpPreview,?DSS_NORMAL);
            ????????}

            ????????
            return?TRUE;

            ????
            //?TODO:?preview?other?skins?here
            ????
            ????}


            ????
            return?FALSE;
            }

            //*************************************************************************************
            LPCTSTR?__stdcall?BCGCBProGetSkinAuthor?(int?/*iIndex*/)
            {
            ????
            return?_T("萬連文,?微軟可以么");
            }

            //*************************************************************************************
            LPCTSTR?__stdcall?BCGCBProGetSkinAuthorURL?(int?/*iIndex*/)
            {
            ????
            return?_T("m.shnenglu.com/wlwlxj");
            }

            //*************************************************************************************
            LPCTSTR?__stdcall?BCGCBProGetSkinAuthorMail?(int?/*iIndex*/)
            {
            ????
            return?_T("mail.google.com");
            }

            //*************************************************************************************
            int?__stdcall?BCGCBProGetSkinUpdate?()
            {
            ????
            return?1;
            }

            初一看以為是導出函數(其實確實是,不過導出方法就有點隱晦,下面提到),大概是一個動態庫吧,按照一般Skin都是需要在程序里面初始化,于是匆匆生產一個程序調用。
            結果發現根本沒有導出函數聲明,在回去看看原以為導出的函數,shit,上當了,不是導出函數啊???讀一下函數,BCGCBProGetSkinClass?嫌疑最大,但是怎么調用呢??一時間不可能在化大力氣去研究整個BCG吧。
            突然想到以前看到過BCG帶的一個例子--BCGPSkins在安裝目錄下,于是打開源碼希望有所發現,里面確實實現了幾種Skin風格,然而它是一個完整的exe,在想想我剛生成的第一個skin是否也是一個exe??于是打開Setting,發現link->output file name:F:\Program Files\Common Files\BCGsoft\Skins\TESTSKIN.dll(我的OS是F:),哦,確實是一個dll,那我怎么改造成exe呢??
            思維再次堵住,索性到那個目錄下看看,哦,發現好多Skin啊,放這里做什么??想了一下,是不是BCG有一種機制可以Custom界面成為這些風格啊??于是再次生成一個exe,這一次一步一步細心走向導,終于發現最后一步有一項:Use Skin Manager,勾上,選擇缺省目錄應該就是剛到的那個目錄了吧。
            運行,選擇Customize,找一下,發現了一個按鈕Visualization,按一下,oh yeah,就是了,原來是皮膚插件管理機制,通過那幾個函數實現的。
            至此研究過程基本結束,大概化1.5小時。又思考了下那些函數到底如何導出,開始還以為是BCG那個頭文件里面預定義導出的,于是搜索了一下BCGCBProGetSkinClass?,發現root.def,這個是向導模版里面的文件,打開發現在這里導出的。
            EXPORTS
            ????BCGCBProGetSkinClass????????@
            1
            ????BCGCBProGetSkinCount????????@
            2
            ????BCGCBProGetSkinName????????????@
            3
            ????BCGCBProGetSkinVersion????????@
            4
            ????BCGCBProPreviewSkin????????????@
            5
            ????BCGCBProGetSkinAuthor????????@
            6
            ????BCGCBProGetSkinAuthorMail????@
            7
            ????BCGCBProGetSkinAuthorURL????@
            8
            ????BCGCBProGetSkinUpdate????????@
            9
            ????BCGCBProIsUNICODE????????????@
            10

            開心,覺得有一種成就感!
            posted on 2006-08-25 00:25 萬連文 閱讀(2064) 評論(0)  編輯 收藏 引用 所屬分類: MFC
            簡歷下載
            聯系我

            <2006年8月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产成人久久综合野外| 91精品国产综合久久久久久| 久久久久亚洲?V成人无码| 久久噜噜久久久精品66| 久久频这里精品99香蕉久| 婷婷久久久亚洲欧洲日产国码AV| 精品久久久久久亚洲精品| 国产成人精品综合久久久| 久久久久亚洲国产| 狠狠综合久久综合中文88| 亚洲中文字幕久久精品无码APP| 久久亚洲国产欧洲精品一| 久久精品极品盛宴观看| 93精91精品国产综合久久香蕉 | 久久伊人精品青青草原高清| 久久久久久毛片免费看| 99国产精品久久久久久久成人热| 欧洲性大片xxxxx久久久| 9191精品国产免费久久| 色欲av伊人久久大香线蕉影院 | 国产成人无码精品久久久免费 | 久久久久国产精品人妻| 精品无码久久久久久国产| …久久精品99久久香蕉国产| 午夜精品久久久久久久久| 国产精品一区二区久久精品涩爱| 精品国产婷婷久久久| 国产亚洲色婷婷久久99精品91| 久久精品国产亚洲AV香蕉| 99精品国产免费久久久久久下载| 久久强奷乱码老熟女网站| 久久国产精品偷99| 国产精品99久久久久久www| 日本免费久久久久久久网站| 久久久精品免费国产四虎| 国产精品视频久久久| 国产精品久久久久久福利69堂| AAA级久久久精品无码片| 久久免费视频网站| 狠狠色伊人久久精品综合网| 久久精品这里只有精99品|