自定义控件—特效列表控件

豆豆网   技术应用频道   2008年03月27日  【字号: 收藏本文

内容摘要: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();

来源:vckbase    作者:吴磊    责编:豆豆技术应用

正在加载评论...