编写可复用性更好的C++代码:Band对象和COMToys(1)
源码下载
本文假设你熟悉C++,COM,IE。
第一部分 Band 对象介绍
译者注:
很难将 "Band" 一词与某个中文词语对应起来,所以本文不打算刻意将"Band"这个词语翻译成中文。只要理解Band是Windows外壳扩展(Shell)中的一种应用就行了。如果非要译出来,我比较倾向于把它译成"区带对象"。看一下注册表中的CATID,如果你的机器中安装了Desk Band或者ExplorerBar之类的Band应用程序,那么运行一下CatView.exe程序(这是一个例子程序,可以从VCKBASE在线杂志第十一期的文章《理解COM编程中的“种类”(Category)概念 》中下载)便会看到微软对其的称呼,在“category name”栏中把Desk Bands称为“桌面区”,把Explorer Bars 称为“浏览器区”。还有一个了解Band名称的地方是下面注册表入口处的表项目值:
HKCR\Compborder="0" alt="编写可复用性更好的C++代码:Band对象和COMToys(1)(图一)" width="323" height="308" />
图一 任务栏中的Web搜索框
- 如何重装xp系统图解
- 下载Flash播放插件
- 巧妙清除Windows 2000/XP登录密码
- 如何利用路由器设置局域网
- QQ空间打不开
- 开机后鼠标不动怎么办
- Excel密码保护的解除方法与解除原理
- Windows XP注册表详解
- 3dmax不锈钢金属材质的制作方法
- 硬盘变成raw格式怎么办
图二 任务栏中的Web搜索框变成了一个普通对话框
实现Web搜索框的程序是 Mybands.dll,它是一个DLL。聪明人肯定会问,这个DLL的名字怎么有复数形式?因为它实现了所有三种类型的Band应用。这三种Band对象就是本文前面提到过的:Desk Bands,info/comm和Tools Bands。注意:IE5之后,微软将info/comm类型的Bands统称为ExplorerBars——浏览栏——用于IE或资源管理器--它包括垂直型和水平型,IE以及资源管理器"查看"菜单中"浏览栏"的"历史记录","收藏夹","搜索"(如图三)都属于info类型或者Explorer Bar类型的Bands应用。Tool Bands是IE5新增加的一种Band类型----工具栏Bands。
图三 其它形式的Bands
安装Mybands.dll的方法如下:下载源代码,编译后将dll拷到Windows的系统目录(system或system32),然后将它注册到系统中,方法是:
regsvr32.exe Mybands.dll
注册成功后,在IE或资源管理器的"查看"=〉"工具栏"和"浏览栏"菜单中会出现Bands的菜单项,如图三所示。显示Desk Band需要一点小技巧:必须重新启动资源管理器进程(针对Windows 9x。Windows 2000,Windows XP不需要)。方法是:按组合键"Ctrl+Atl+Del",删除掉资源管理器进程,重启之后你就可以在任务栏的上下文菜单的"工具栏"中看到Desk Band菜单项了如图四:
- 如何重装xp系统图解
- 下载Flash播放插件
- 巧妙清除Windows 2000/XP登录密码
- 如何利用路由器设置局域网
- QQ空间打不开
- 开机后鼠标不动怎么办
- Excel密码保护的解除方法与解除原理
- Windows XP注册表详解
- 3dmax不锈钢金属材质的制作方法
- 硬盘变成raw格式怎么办
图四
使用BandObj编写band对象是很容易的,就以MyBands为例,它由几个模块组成,但只有一个模块是编写band对象的重点,那就是主模块:MyBands.cpp。MyBands由一个叫的App类,它派生于CBandObjDll(BandObj.h),而CBandObjDll又派生于MFC的COleControlModule。它们之间的派生关系为:
CWinApp
COleControlModule
CBandObjDll
CBandObjDll 与普通的MFC应用一样,CBandObjDll有一个InitInstance函数:
BOOL CMyBandsDll::InitInstance()
{
AddBandClass(CLSID_MYINFOBAND,
RUNTIME_CLASS(CMyInfoBand),
CATID_InfoBand,
IDR_INFOBAND);
AddBandClass(CLSID_MYCOMMBAND, ...);
AddBandClass(CLSID_MYDESKBAND, ...);
return CBandObjDll::InitInstance();
} 它类似于DOC/VIEW,只是DOC/VIEW调用的是AddDocTemplate,而不是AddBandClass。对于每一个Band类,必须提供这个类的ID(GUID),MFC运行时类,种类(category)和资源IDs。种类ID就是一个GUID,它告诉Windows你的类是哪一种Band--是info,comm(ExplorerBar)还是Desk Band。从代码中不难看出,MyBands使用单独的类来处理每一种Band。CMyInfoBand,CMyCommBand,和 CMyDeskBand,它们都派生于CBandObj,并且都使用DECLARE/IMPLEMENT_DYNCREATE,这样MFC就能用其通常的运行时机制和COleObjectFactory来动态创建实例。它们都具有构造函数来负责初始化DESKBANDINFO结构中有关Band的信息及CBandObj::m_dbiDefault。例如,Desk Band有一个默认的宽度(100)及变高。
CMyDeskBand::CMyDeskBand() : CBandObj(CLSID_MYDESKBAND)
{
m_dbiDefault.ptActual = CPointL(100,0);
m_dbiDefault.dwModeFlags = DBIMF_VARIABLEHEIGHT;
} Explorer Bar 有固定高度30个像素,且没有标题。
进入讨论组讨论。CMyCommBand::CMyCommBand() : CBandObj(CLSID_MYCOMMBAND)
{
m_strTitle.Empty();
m_dbiDefault.ptMinSize = CPointL(0,30);
m_dbiDefault.ptMaxSize = CPointL(-1,30);
} 不管你相不相信,MyBands中真正与Band对象有关的东西就这些。剩下的内容无非就是实现Band行为以及一些常规的MFC应用处理。如:CMyDeskBand中OnCreate处理函数的作用是创建编辑框控制,CMyCommBand中WM_PAINT处理函数的作用是绘制有关信息:
void CMyCommBand::OnPaint()
{
CPaintDC dc(this);
dc.DrawText("欢迎访问VC知识库!");
} Band对象不像框架有最上层菜单,但如果你愿意的话可以为它添加上下文菜单。繁琐的细节都由CBandObj来处理。这时MyBands必须用与Band类相同的资源ID来创建菜单。命令会神奇般地通过所有正常渠道到达MyBands的ON_COMMAND处理函数。如果不是有GUIDs和种类(category)IDs,你很难了解MyBands是一个COM对象。CBandObj隐藏了全部的细节,留下一个自由的空间让你编写自己的Band。这就是我的最终目的所在。(待续)
- 用Photoshop给漂亮的烫发MM抠图
- Photoshop透明婚纱抠图大法
- Photoshop:让MM做个“变色龙”
- 用Photoshop来制作一款精美的宝宝照片墙
- Photoshop绝色美女通道抠图法
- 用Photoshop教你打造绚丽光芒效果
巧巧读书:
进入讨论组讨论。- 最新文章
- 编写可复用性更好的C++代码:Band对象和COMToys(..[01-03]
- 编写可复用性更好的C++代码:Band对象和COMToys(..[01-03]
- C++引用计数的智能指针有效回收方法[01-03]
- 如何用C++编程获得某台机器的IP地址?[01-03]
- 一组实现邮件发送功能的C++封装类-SMailer[01-03]
- 高质量C++/C编程指南--文件结构[01-03]
- 相关文章
