如何禁用Tree Control 的节点

如何禁用Tree Control 的节点

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

你可能感兴趣的:(如何禁用Tree Control 的节点)