一、創建目標
建立類似於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();