万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:
http://weibo.com/wanlianwen
C++博客
首页
新文章
新随笔
聚合
管理
posts - 172, comments - 1253, trackbacks - 0
BCG Skin插件机制研究过程
首先声明讲的是思考问题的思路,具体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
万连文
阅读(2042)
评论(0)
编辑
收藏
引用
所属分类:
MFC
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
VC8中MFC集成ATL组件注册时注意的一个问题
未来界面应该是这样的
纯技术讨论com控件创建过程
界面终于出来一点拉
自己画的好友列表
用WLWUI库描述kugoo界面
上班半个月的总结
用MFC实现WebGUI--(CDHtmlDialog)
闲暇时间做的几个界面
转孙辉老师《十年MFC经历认识的Microsoft技术》
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
简历下载
联系我
<
2006年8月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(66)
给我留言
查看公开留言
查看私人留言
随笔分类
.NET(6)
ACDK(6)
ATL(11)
MFC(29)
richedit(9)
WTL(1)
乱七八糟(61)
模板(8)
小作品(40)
随笔档案
2013年3月 (2)
2012年9月 (2)
2012年8月 (2)
2012年7月 (2)
2012年6月 (3)
2012年5月 (2)
2011年9月 (2)
2011年8月 (1)
2011年6月 (2)
2011年5月 (4)
2011年4月 (2)
2011年3月 (2)
2010年12月 (1)
2009年9月 (1)
2009年8月 (2)
2009年7月 (2)
2009年6月 (2)
2009年5月 (1)
2009年4月 (1)
2009年1月 (1)
2008年12月 (5)
2008年11月 (2)
2008年10月 (1)
2008年9月 (7)
2008年8月 (2)
2008年3月 (3)
2008年2月 (2)
2008年1月 (3)
2007年12月 (6)
2007年11月 (1)
2007年10月 (3)
2007年9月 (1)
2007年8月 (5)
2007年7月 (5)
2007年6月 (3)
2007年5月 (5)
2007年4月 (5)
2007年3月 (4)
2007年2月 (2)
2007年1月 (2)
2006年12月 (4)
2006年11月 (8)
2006年10月 (1)
2006年9月 (9)
2006年8月 (7)
2006年7月 (10)
2006年6月 (1)
2006年5月 (2)
2006年4月 (10)
2006年3月 (3)
2006年2月 (3)
2006年1月 (2)
2005年12月 (8)
相册
new
个人相册
搜索
最新评论
1. re: 用MFC实现WebGUI--(CDHtmlDialog)
前辈好,代码下载之后怎么用啊?我生成的exe打开是空白的页面,菜单新建不知道建的啥,打开一个html页面也没有反应,我的环境是vs2010
--王同林
2. re: 使MFC变漂亮一:MFC与Flash交互示例
能不能把Flash源文件共享一下,要不然Flash端变量不知道怎么操作
--ddd
3. re: 甘特图第一版本发布
你这个附件有什么功能限制?
--xrczld
4. re: 并行编程--MPI开发入门
我是用的vs+MPICH2,用wmpiexec运行我的exe的时候,不能连接到主机是什么鬼啊。。求回复
--M琨M
5. re: 基于Chrome开源提取的界面开发框架 三(.3)
豌豆荚非常不错的应用
--mmocake
阅读排行榜
1. 基于Chrome开源提取的界面开发框架开篇(32318)
2. 用MFC实现WebGUI--(CDHtmlDialog)(25896)
3. 并行编程--MPI开发入门(19123)
4. 使MFC变漂亮二:MFC与HTML交互示例(17352)
5. FreeType2研究(16075)
评论排行榜
1. 我把初恋搞丢了(原创)(55)
2. 一个小型绘图程序(45)
3. 并行编程--MPI开发入门(42)
4. 我得C++学习心得(41)
5. 用MFC实现WebGUI--(CDHtmlDialog)(40)