中国C/C++程序员在线培训网
转载:http://www.vckbase.com/index.php/wv/1599.html
基于Win32 SDK的树状控件属性表的封装
老式的经典“软件设置”界面多采用基于SysTabControl32控件的属性表(Windows自带的“文件夹选项”对话框),越来越多的软件,大到VisualStudio,小到Foobar和Kmplayer都开始采用左侧是树状控件,右边是页的软件设置界面,这样能更清晰的为页分类,而且可容纳更多的页.因为这种设置界面的行为很模式化,基本就是处理左侧树状控件与页的对应关系.
一:运行过程.
创建一个Static静态控件做容器, 在其上创建SysTreeView32树状控件与属性页对话框.在Static控件的窗口函数g_BaseFun中处理TreeView树状控件的消息.而所有页的对话框窗口函数均为g_PageFunc统一处理消息.
二:类简介.
数据内容:
//唯一全局变量,处理多个属性页实例并存的情况
vector g_zjlProperty_States;
//CzjlProperty.h
HWND m_hParent; //父窗口
HWND m_hBase; //背景静态控件(容器)
HWND m_hTreeView; //TreeView
vector m_Pages; //所有页
HWND m_hCurrentPage; //当前活动窗口
vector m_TreeItems; //所有创建过的目录子项
//Size
RECT m_RECTBase; //属性表大小
RECT m_RECTLV; //左侧树状控件大小
RECT m_RECTPage; //右侧页大小
//公有变量MESSAGEMAP,供窗口函数调用, 勿自己改动或调用
vector m_ItemMessage; //WM_COMMAND与WM_NOTIFY控件消息
vector m_PagesMessage; //除了控件外的PAGE拦截消息
vector m_LaterRegister;//有些消息需要窗口句柄做标识,创建窗口以后才能绑定
主要类函数:
CzjlProperty::CzjlProperty(HWND hParent,RECT* rect=0,float scaleTV=0.25f);
构造函数,提供一个父窗口句柄,在父窗口内创建一个空的属性表.
二参数:属性表大小,默认大小为占满父窗口全部区域
三参数:左侧树状属性表目录占整个属性表的宽度比例,默认是四分之一
HWND AddPage(TCHAR* _strPath,UINT Dlgid=0,bool bCreateNow=0,bool bEnable=1,bool bVisable=1);
为属性表插入一个页.
//_strPath为该页在左侧TreeView的路径.如DEMO中第一个选项的路径为“"zjlProPerty/页/页设置"
//Dlgid为对话框模板ID;
//bCreateNow为是否立即创建,简易应用默认选择选择用户激活该页时创建
//bEnable与bVisable指明最初是否禁用或隐藏该页
//以下四个为绑定页消息函数
这四个消息调用的用户函数原型均为:void 函数名( HWND hwnd,UINT message,UINT wParam,UINT lParam );
void Message_PageCOMMAND_NOTIFY(UINT Dlgitemid,DWORD commandCode,void* pOnMessage);
void Message_Page(UINT DlgID,UINT message,void* pfunc);
//前者为绑定对话框内的控件消息,包括WM_COMMAND与WM_NOTIFY消息, Dlgitemid为控件ID, commandCode为拦截的控件消息码,pOnMessage为用户函数.
//后卫为拦截所有页对话框消息,如有特殊需要,如美化界面要响应该页的wm_erasebkgnd消息时可用此函数绑定
void Message_PageInit(UINT dlgid,void* pfunc);
void Message_PageShowing(UINT dlgid,void* pfunc);
//前者页创建时初始化控件状态.处理函数运行且只运行一次,(WM_INITDIALOG)
//后者每次切换到该页时更新控件内的数据,每次页显示前调用处理函数,会运行多次,用于刷新控件内数据内容.
三,使用方法(以Demo程序为例):
1.创建属性表.
RECT rect;
//取得父窗口大小
GetClientRect(hWnd,&rect)
//在父窗口的属性表下方留出位置放置按钮
rect.bottom-=60;
//Create,第三个参数指定属性表目录的宽度占整个属性表的比例,范围0-1,默认是1/4;
//将其赋值给一个全局指针g_pProperty:
g_pProperty=new CzjlProperty(hWnd,&rect,0.25);
2.为属性表添加页:
//添加一个页
HWND hCtrlWnd=g_pProperty->AddPage(_T("zjlProPerty/页/页设置"),IDD_DEMO_CTRL);
3.绑定消息:
//每次显示该页时将程序标题名复制到编辑控件.
g_pProperty->Message_PageShowing(IDD_DEMO_CTRL,CtrlPageInit);
//页的改变标题按钮按下
g_pProperty->Message_PageCOMMAND_NOTIFY(IDC_WIN32_CHANGE,BN_CLICKED,OnTitleChange);
4.属性表初始化完毕
//展开属性表所有子项
g_pProperty->ExpandAll();
//默认激活第一页->"页设置"
g_pProperty->ActivePage(_T("zjlProPerty/页/页设置"));
四:其他辅助函数:
//返回目录中当前选中的项的目录路径
CString GetCurrentPath(bool isFullPath=1); //FullPath=1为完整目录路径,FullPath=0为选项名
//返回目录中当前选中的项的TV子项句柄
HTREEITEM GetCurrentHTREEITEM();
//取得已创建的页对话框句柄,参数_str就是创建时的路径名
HWND GetPageCtrl(TCHAR* _str);
//删除页
void DeletePage(TCHAR* _str);
//激活页
bool ActivePage(TCHAR* _str);
//获得页信息
const zjlPAGE* GetPage(HWND hdlg)const; //通过页对话框句柄
const zjlPAGE* GetPage(TCHAR* _str)const; //通过页在目录中路径
const zjlPAGE* GetPage(HTREEITEM htm)const; //通过目录中的TV子项句柄
//显示/隐藏页.不指定参数则为显示当前激活页
void VisablePage(bool Visable,TCHAR* _str=0,HTREEITEM itm=0,HWND dlg=0);
//使用/禁用页.不指定参数则为启用当前激活页.
void EnablePage(bool Enable,TCHAR* _str=0,HTREEITEM itm=0,HWND dlg=0);
//设置TreeView的字体与字体大小
void SetTreeViewFont(TCHAR* _fontname,int fontHeight=20);
//清除属性表的所有内容,但不销毁属性表本身
void ClearProperty();
(全文完)