软件的选项设置需要项目比较烦多,属性表是很好的选择。但是外观上、操作上都赶不上列表控制的属性表。C瓜哥最近做了一个Demo,给大家分享一下心得。

先看一下效果:

点击查看原图

设置了背景位图

点击查看原图

(demo和源码下载见页面底端)

这个漂亮的列表导航框,是靠自绘了个列表控件(CListBox)实现的。
类名是CTabList,此类的信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//基类:CListBox
//功能:1、专门用来导航的列表类,用于切换属性表的各个子页面;
//		2、支持鼠标滑过效果;
//		3、支持渐变分隔线;
//		4、支持更改列表背景、列表光标、列表选中颜色等多种属性
//
//……
//
//注意:	1、本类提供的所有函数只能在列表框未显示之前调用;
//      2、最好动态创建此类的对象,这样比较好控制。不过若要先在资源里设计好,再
//         关联CTabList的成员变量的话,一定要把控件的属性设置正确:WS_CHILD、
//         WS_VISIBLE、LBS_OWNERDRAWVARIABLE、LBS_NOTIFY、LBS_HASSTRINGS
//		3、SetFont函数必须在Create之前调用才能生效;
//		4、列表的AddString,之后必须要调用SetIconInfo,之后方能AddIcon(当然也
//		   必须要增加每项的图标,且数目与文本项目数应一致);
//		5、做好前3步之后,不调用其它函数即可运行了.不过要DIY的话,就要自己选择了~

具体实现请大家下载源码自己研究下,方法还是自绘控件(用OwnerDraw)的经典方法、经典步骤。调用此类比较简单了,而且我也注释得比较充分,如果还有什么问题,请大家留言,我会耐心解答的。

然后剩下要解决的就是属性对话框的子页面问题。

我在资源里面新增了IDD_PAGE1~IDD_PAGE7七个对话框资源作为演示。把它们的Style设置成Child,Border设置成None,创建它们各自的类,基类都设置成CPage类(具体办法见后)。这个类是派生于CDialog的,主要目的就是方便更改这七个子对话框的共同的一些属性,比如更改背景颜色。当然还可以多在这个类里面花些功夫,自绘对话框,实现更复杂的界面效果。

CDialog构造必须需要一个资源ID,但是这个类不是直接来实现界面的,所以我们不填ID,忽略掉ClassWizard的警告!现在就需要把构造函数改成类似CDialog的那种了,因为是对CDialog的拓展。

声明:CPage(UINT nIDTemplate, CWnd* pParent = NULL);

实现:

1
2
3
4
5
6
7
CPage::CPage(UINT nIDTemplate, CWnd* pParent/* = NULL*/)
			 : CDialog(nIDTemplate, pParent)
{
	//{{AFX_DATA_INIT(CPage)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

DoDataExChange不需要了,因为它上面没有具体的控件。把头文件和cpp文件里面的部分都注释掉!

设置那七个子页面类时,在BaseClass里面看不到CPage?没关系,先设置成CDialog,然后再替换一下即可!

最后的事情就是,在主对话框类中创建CTabList的一个实例(推荐动态创建。不过用关联控件成员变量的方法也可,要注意勾选对对应属性。这在前面已经说过),设置好相应的属性。然后创建7个子页面的实例,把其指针加到CPtrArray对象中去,这样便于管理。

主干部分已经叙述完了,细节详见代码~

————————–

附件下载

List_ProperSheet.rar

附件下载