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