作者:吴磊
源代码下载摘要
WINDOWS应用程序的创建一般都需要使用控件,像VB、DELPHI等编程环境都提供了相当多的控件供程序员调用,这些控件基本上能满足程序开发的要求,但有时也会有些不尽如意的地方,因此学会创建自定义控件有一定的重要性。本程序实现了一个可以折叠、可以更换成员类型的特效列表控件。
关键字 特效列表控件
一、创建目标
- 建立类似于Windows XP窗口中左部的列表控件,如下图所示

- 用户可自由添加列表成员
- 控件可以折叠和伸展,折叠时只显示标题栏
- 控件可显示在由CWnd派生的窗口类中
- 每个成员可响应鼠标事件,并向用户提供编程接口
二、设计与实现
1、对象
特效列表控件(TaskListBox)——提供用户编程接口,处理与窗口对象衔接。
特效列表(TaskList)——受特效列表控件委托,实现控件的所有功能。
成员(Item)——代表每个列表成员,可以响应鼠标事件。
边框(TaskFrame)——处理特效列表控件的标题与边框绘制。
折叠按钮(PuckerBtn)——实现特效列表控件的折叠动作。
2、对象结构如下图所示

3、本程序综合使用了设计模式,详细实现见源代码。下面是TaskListBox部分实现代码:
bool CTaskListBox::CreateTaskList()
{
UINT id = this->GetDlgCtrlID();
CString str;
GetWindowText(str);
m_pTaskList = new CTaskList(this, new CTaskFrame(str), new CPuckerBtn(this), new CTaskItem(this, id));
ASSERT(m_pTaskList);
return m_pTaskList != NULL;
}
bool CTaskListBox::CreateColorList()
{
UINT id = this->GetDlgCtrlID();
CString str;
GetWindowText(str);
m_pTaskList = new CTaskList(this, new CTaskFrame(str), new CPuckerBtn(this), new CColorItem(this, id));
ASSERT(m_pTaskList);
return m_pTaskList != NULL;
}
三、特效列表控件的使用 从对象结构图中可以看出特效列表控件派生自MFC中的CStatic静态控件,其创建方式与静态控件完全相同,控件通过向父窗口发送消息来提供编程接口。下面是特效列表控件的在对话框中的初始化代码:
m_lbTask.CreateTaskList();
CString tasks[] =
{
"Explorer 7.0", "WINRAR 4.0", "MediaPlayer", "Reader 7.0",
"PowerDesigner", "Word 2000", "EXCEL 2000", "RealPlayer 10",
"AutoCAD 2004", "ACCESS 2003"
};
CImageList m_imgList;
m_imgList.Create(IDB_BITMAP1,16, 1, RGB(255,255,255));
ItemInfo item;
item.type = II_ICONTEXT;
for(int i = 0; i < sizeof(tasks) / sizeof(tasks[0]); i++)
{
item.index = i;
item.text = tasks[i];
item.icon = m_imgList.ExtractIcon(i % 10);
m_lbTask.AddItem(item);
}
m_lbTask.ReSize();
|