Tree Control : how to disable an item
Tree Control 不支持節點的禁用, 但是可以通過自繪實現, 主要如下:
1. 標記節點是否禁用. 可以用 SetItemData & GetItemData 來設置&獲取節點數據
2. 在禁用的節點上, 要過濾一些對節點操作, 如expanding, selecting, drag & drop 等.
TVN_SELCHANGING 節點選中改變時
TVN_ITEMEXPANDING 節點展開時
TVN_BEGINDRAG 節點開始被拖拉
TVN_BEGINLABELEDIT 節點被編輯
//Preventing selection: (handle TVN_SELCHANGING)
void CYourDialog::OnSelchangingTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR;
if(((CItemStruct *) m_tree.GetItemData(pNMTreeView->iNewItem))->m_bDisabled)
{
*pResult = 1; // 設置 *pResult=1 表示TVN_SELCHANGING 這個操作不能繼續
return;
}
*pResult = 0;
}
3. 對禁用節點進行自畫, 用圖標,顏色將禁用節點和其他節點進行區分
a) 直接在 WM_PAINT 中進行自畫 (或對Tree Control的繪圖結果進行修改)
可以參考: 如何在樹型控件中使用背景位圖
b) 相應 WM_OWERDRAW 事件
可以參考: Outlook風格的單列使用不同的顏色顯示新郵件數
參考:
MFC Tree Control: How to disable an item?
Setting color and font attribute for individual items