这是偶用着的类定义:
/*******************************************************
此类处理树形列表输入,可作为辅助类
********************************************************/
#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不能使用,知道这就可以了,如果不使用它们,当我不说.
阅读(4634) | 评论(0) | 转发(0) |