万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博: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.cppblog.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 万连文 阅读(2024) 评论(0)  编辑 收藏 引用 所属分类: MFC

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

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

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜