首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

自訂控件:可摺疊特效任務清單控件 (TaskListBox)

     編輯:關於VC++

設計目標

  • 模擬 Windows XP 左側工作窗格風格:分組標題、圖示+文字項目、滑鼠懸停/點擊回饋。
  • 支援動態新增/移除項目。
  • 標題列點擊可摺疊/展開,摺疊時僅顯示標題列。
  • 繼承 CStatic,可置於任何 CWnd 衍生視窗。
  • 項目事件 (點擊、雙擊、右鍵) 透過訊息通知父視窗,提供程式介面。

物件架構

TaskListBox (CStatic 衍生)          // 對外介面、視窗掛載
    └─ TaskList (核心邏輯)           // 版面計算、繪製、滑鼠處理
        ├─ TaskFrame                // 標題列、邊框繪製
        ├─ PuckerBtn                // 摺疊/展開按鈕 (三角箭頭動畫)
        └─ Item 基類
            ├─ TaskItem             // 一般圖示+文字項目
            └─ ColorItem            // 彩色條狀項目 (擴充範例)

核心程式碼片段

TaskListBox 建立與初始化

bool CTaskListBox::CreateTaskList()
{
    UINT id = GetDlgCtrlID();
    CString str; GetWindowText(str);
    m_pTaskList = new CTaskList(this,
                                new CTaskFrame(str),
                                new CPuckerBtn(this),
                                new CTaskItem(this, id));
    return m_pTaskList != nullptr;
}

bool CTaskListBox::CreateColorList() // 擴充範例
{
    // ... 同樣流程,傳入 CColorItem
}

對話框中使用範例

// 1. 建立控制項 (資源編輯器放置 Static, ID=IDC_TASKLIST, 類別關聯 CTaskListBox)
m_lbTask.CreateTaskList();

// 2. 準備圖示清單
CImageList m_imgList;
m_imgList.Create(IDB_BITMAP1, 16, 1, RGB(255,255,255));

// 3. 批次新增項目
ItemInfo item;
item.type = II_ICONTEXT;
CString tasks[] = { _T("Explorer 7.0"), _T("WINRAR 4.0"), _T("MediaPlayer"),
                    _T("Reader 7.0"), _T("PowerDesigner"), _T("Word 2000"),
                    _T("EXCEL 2000"), _T("RealPlayer 10"), _T("AutoCAD 2004"),
                    _T("ACCESS 2003") };

for (int i = 0; i < 10; ++i)
{
    item.index = i;
    item.text = tasks[i];
    item.icon = m_imgList.ExtractIcon(i % 10);
    m_lbTask.AddItem(item);
}
m_lbTask.ReSize(); // 重新計算版面

關鍵技術實現

功能實現要點
自繪TaskList::OnPaint 使用 CDC 繪製標題背景、分隔線、項目圖示/文字、摺疊按鈕
滑鼠互動OnMouseMove/OnLButtonDown 命中測試 → 設定熱項目/按下狀態 → InvalidateRect 觸發重繪
摺疊動畫PuckerBtn 繪製旋轉三角形;TaskList::Toggle 調整項目可見區域高度 + SetWindowPos 縮放控制項高度
事件通知父視窗接收 WM_COMMAND (ID=控制項 ID, NotifyCode=自訂如 TLN_ITEMCLICK),lParam 傳遞項目索引
版面計算ReSize() 依字型高度、項目數、摺疊狀態計算總高度,配合 MoveWindow 調整

擴充性設計

  • Item 基類虛擬函式:Draw, HitTest, GetHeight — 新增項目類型只需繼承並覆寫。
  • 視覺風格分離:顏色、字型、邊框寬度封裝於 TaskFrame/PuckerBtn,支援主題切換。
  • 圖示來源抽象:ItemInfo.icon 接受 HICON,可來自 CImageList、LoadImage、GDI+ 繪製等。

編譯環境

VC6.0 / VS2005+ / MFC 專案,需啟用 RTTI 與例外處理 (或移除 dynamic_cast 相容無 RTTI 環境)。

完整原始碼含 TaskListBox.h/cpp, TaskList.h/cpp, TaskItem.h/cpp 等檔案,可直接整合至專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved