Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1001936
  • 博文数量: 177
  • 博客积分: 3629
  • 博客等级: 中校
  • 技术积分: 1839
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-23 21:21
文章分类

全部博文(177)

文章存档

2021年(1)

2020年(5)

2019年(4)

2018年(7)

2017年(1)

2016年(4)

2014年(1)

2013年(8)

2012年(10)

2011年(50)

2009年(12)

2008年(10)

2006年(56)

2005年(8)

分类: C/C++

2006-05-03 21:56:55

这是偶用着的类定义:
 
/*******************************************************
此类处理树形列表输入,可作为辅助类
********************************************************/
#include "SelGroup.h"
#include "registry.h"
#include "popMenu.h"
class CMyTreeView: public CWindowImpl
{
public:
 
 BEGIN_MSG_MAP(CMyTreeView)
  MSG_WM_NOTIFY(OnNotify)
  MSG_WM_RBUTTONDOWN(OnRButtonDown)
  MSG_WM_COMMAND(OnCommand)
 END_MSG_MAP()
 
 void Init();
 LRESULT OnNotify(UINT wParam, LPNMHDR lParam);
 LRESULT OnRButtonDown(UINT wParam,CPoint pt);
 void SetHWND(HWND h);
 BOOL GetGroupName();
 BOOL CreateNewGroup(char *pGroupName,char *pGroupDir,BOOL &isExited_);
 LRESULT OnCommand(UINT HwParam, int LwParam, HWND lParam);
protected:
 HWND m_hDir;
 HKEY m_hkey;
 LPCTSTR m_lpSubKey;
 CMenu m_popMenu; 
};
 
一开始是受到一些教程的影响,写了如下定义(第一种写法):
class CMyTreeView: public CWindowImpl
只知道中的CTreeViewCtrlEx类将做为CWindowImpl的父类.后来一看代码才知道CTreeViewCtrlEx做为TBase模板参数传了两三次最终和CMessageLoop类一起成为CWindowImplRoot的父类,如下:
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap
这里的TBase就是传过来的CTreeViewCtrlEx了.
 
突然想起多重继承,改为如下(第二种写法):
class CMyTreeView: public CWindowImpl,CTreeViewCtrlEx
 
编译一看,出现四处错误,提示差不多,举SendMessage为例,编译错误,说是此函数有两义性.仔细一想才明白,CWindowImpl/CTreeViewCtrlEx这两个类有一个共同的祖先类:CWindow.
这样CWindow的成员函数都会有两义性.看来只能按第一种写法了.
 
但偶想这两种写法有时可以,有时不可以.
如果用第一种写法,CWindowImpl的基类CWindow会被改写.这里就是问题所在了.所以对CTreeViewCtrlEx这样的也是以CWindow为基类的类应该按第一种写法.
如果两个类没有共同基类,还是用第二种写法吧.
 
附相关资料 :
 
 
还有篇汇编语言有关的文章,竟然说得比MSDN好看多了.
WIN32汇编: 19.树型视图控件
好象是罗云彬的书里的?如链接失效,GOOGLE吧.
 
 
补充一些:
 
Tree View与ImageList是配合使用的.
ImageList是一堆ImageList_*之类的API组成的.一般需要一个image资源句柄.先创建,再添加资源.
创建时可以指定资源长,宽,初始imagelist数量,最大imagelist数量.
添加资源后有一个 
ImageList_SetOverlayImage
是可选的.用于指定overlay image.指imagelist可以覆盖TreeView项的图标.不过这是可选的.
ImageList里面可有多个Image,以0开始索引.每个Image里的多个图标也以0开始索引.
 
TreeView每个节点对应一个结构,TVITEMEX/TVITEM,修改TreeView外观其实就是修改这个结构.这个结构里关于image的部分和上面的ImageList结合紧密.需要理解一点图像索引的问题:
如果使用overlay image和 state image的话,ImageList里面的第一个索引为0的Image不能使用,知道这就可以了,如果不使用它们,当我不说.
 
 
阅读(4518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~