基于Win32 SDK的树状控件属性表的封装


中国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();

(全文完)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C++代码封装win32操作类, 与MFC相似,对于学习SDK与C++是巨好的参考 Tutorials Menu of tutorials Tutorial 1: The Simplest Window Tutorial 2: Using Classes and Inheritance Tutorial 3: Using Messages to Create a Scribble Window Tutorial 4: Repainting the Window Tutorial 5: Wrapping a Frame around our Scribble Window Tutorial 6: Customising Window Creation Tutorial 7: Customising the Toolbar Tutorial 8: Loading and Saving Files Tutorial 9: Printing Tutorial 10: Finishing Touches Tutorial 1: The Simplest Window The following code uses Win32++ to create a window. This is all the code you need (in combination with Win32++) to create and display a simple window. Note that in order to add the Win32++ code to our program, we use an #include statement as shown below. #include "../Win32++/Wincore.h" INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { //Start Win32++ CWinApp MyApp; //Create a CWnd object CWnd MyWindow; //Create (and display) the window MyWindow.Create(); //Run the application return MyApp.Run(); } This program has four key steps: Start Win32++. We do this here by creating a CWinApp object called MyApp. Create a CWnd object called MyWindow. Create a default window by calling the Create function. Start the message loop, by calling the Run function. If you compile and run this program, you'll find that the application doesn't end when the window is closed. This is behaviour is normal. An illustration of how to use messages to control the windows behaviour (including closing the application) will be left until tutorial 3.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值