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

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

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            色婷婷综合久久久中文字幕| 精品国产91久久久久久久a| 香蕉久久夜色精品国产2020| 热99RE久久精品这里都是精品免费| 亚洲欧美精品一区久久中文字幕| 久久亚洲精品成人无码网站| …久久精品99久久香蕉国产| 久久综合色区| 亚洲午夜久久久影院伊人| 免费国产99久久久香蕉| 一级做a爰片久久毛片看看| 久久精品国产亚洲77777| 久久不见久久见免费影院www日本| 久久人人添人人爽添人人片牛牛| 天天综合久久一二三区| 久久精品成人一区二区三区| 久久婷婷色香五月综合激情| 国产精品99久久不卡| 色综合合久久天天给综看| 久久99亚洲网美利坚合众国| 欧美日韩中文字幕久久久不卡| 久久福利青草精品资源站| 2020久久精品亚洲热综合一本| 18岁日韩内射颜射午夜久久成人| 久久亚洲美女精品国产精品| 国产精品久久久久免费a∨| 51久久夜色精品国产| 久久国产精品成人片免费| 深夜久久AAAAA级毛片免费看| 国产AV影片久久久久久| 人人狠狠综合久久亚洲婷婷| 99久久这里只有精品| 97久久超碰国产精品旧版| 亚洲国产精品18久久久久久| 久久AV无码精品人妻糸列| 国产精品久久婷婷六月丁香| 2021国产精品午夜久久| 99久久精品免费看国产一区二区三区 | 国产精品久久久久…| 99久久精品免费看国产一区二区三区| 国产麻豆精品久久一二三|