WEB开发网
开发学院软件开发VC 编写可复用性更好的C++代码:Band对象和COMToys 阅读

编写可复用性更好的C++代码:Band对象和COMToys

 2006-07-21 11:44:13 来源:WEB开发网   
核心提示: 图三 其它形式的Bands安装Mybands.dll的方法如下:下载源代码,编译后将dll拷到Windows的系统目录(system或system32),编写可复用性更好的C++代码:Band对象和COMToys(4),然后将它注册到系统中,方法是:regsvr32.exe Mybands

图三 其它形式的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菜单项了如图四:

图四 

使用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(Explorer Bar)还是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。这就是我的最终目的所在。(待续)

上一页  1 2 3 4 

Tags:编写 复用 更好

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接