• <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("www.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 萬連文 閱讀(2057) 評論(0)  編輯 收藏 引用 所屬分類: MFC
            簡歷下載
            聯系我

            <2009年1月>
            28293031123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            婷婷久久五月天| 99久久精品午夜一区二区| 久久无码av三级| 久久免费小视频| 久久乐国产综合亚洲精品| 香蕉久久av一区二区三区| 国产精品久久久久久搜索| 国产69精品久久久久99| 久久无码专区国产精品发布| 久久久久99精品成人片试看 | 欧美午夜精品久久久久免费视| 国产成人无码精品久久久性色| av无码久久久久久不卡网站| 久久久黄片| 精品久久一区二区三区| 亚洲国产一成久久精品国产成人综合| 久久久久人妻一区二区三区vr| 久久99国产精品成人欧美| 久久无码人妻一区二区三区| 久久久久亚洲爆乳少妇无| 精品午夜久久福利大片| 久久久亚洲AV波多野结衣 | 九九久久精品国产| 国产精品久久久久久吹潮| 久久婷婷五月综合色奶水99啪| 久久精品人人槡人妻人人玩AV | 中文字幕人妻色偷偷久久| segui久久国产精品| 2021少妇久久久久久久久久| 国产亚洲精品久久久久秋霞| 色天使久久综合网天天| 精品熟女少妇aⅴ免费久久| 欧美亚洲国产精品久久蜜芽| 亚洲∧v久久久无码精品| 国色天香久久久久久久小说 | 亚洲中文字幕无码久久精品1 | 亚洲国产欧洲综合997久久| 亚洲美日韩Av中文字幕无码久久久妻妇| 99久久免费国产特黄| 久久精品无码午夜福利理论片 | 亚洲国产精品婷婷久久|