• <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
            簡歷下載
            聯系我

            <2006年7月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产精品青草app| 久久久久亚洲av综合波多野结衣| 99久久精品毛片免费播放| 99久久综合国产精品二区| 久久久久国产| 久久99精品国产麻豆| 久久精品无码专区免费| 久久久久久久久无码精品亚洲日韩 | 午夜天堂精品久久久久| 久久国产精品一区二区| 偷偷做久久久久网站| 精品免费tv久久久久久久| 久久婷婷五月综合97色直播| 久久99久久99小草精品免视看| 久久受www免费人成_看片中文| 久久99精品久久久久久hb无码| 伊人久久大香线蕉成人| 久久91精品国产91久久户| 无码人妻久久久一区二区三区 | 久久天天日天天操综合伊人av| 亚洲狠狠婷婷综合久久蜜芽| 久久中文精品无码中文字幕 | 99久久精品免费看国产一区二区三区 | 久久青青草原精品影院| 狠狠综合久久AV一区二区三区| 国内精品久久久久久麻豆| 999久久久无码国产精品| 亚洲国产精品无码久久98| 久久精品桃花综合| 亚洲国产成人精品女人久久久| 亚洲国产精品一区二区久久| A狠狠久久蜜臀婷色中文网| 人妻精品久久久久中文字幕一冢本 | 久久精品国产亚洲欧美| 亚洲日本va中文字幕久久| 国内精品伊人久久久久妇| 亚洲а∨天堂久久精品9966| 亚洲国产综合久久天堂 | 精品久久久久久无码人妻热| 久久精品国产精品青草| 很黄很污的网站久久mimi色 |