首页 > 解决方案 > 我发现 GetCheckedItems() 函数可以知道检查的项目如何包含树控件中的子项目

问题描述

我知道什么是移位和位运算符,但这段代码是什么意思?我不太明白。

请解释我很容易。

UINT state = (tree.GetItemState(item, TVIS_STATEIMAGEMASK) >> 12) & 15;
                                 

以下是原始代码:

 void GetCheckedItems(const CTreeCtrl& tree, CArray<HTREEITEM> 
                 *checkedItems, HTREEITEMstartItem=NULL)
 {
   if (startItem == NULL)
    startItem = tree.GetRootItem();

   for (HTREEITEM item = startItem; item != NULL; item = 
       tree.GetNextItem(item, TVGN_NEXT))
      {
      // figure out if this item is checked or not
      UINT state = (tree.GetItemState(item, TVIS_STATEIMAGEMASK) >> 12) & 
      15; // i Wonder this (  shift and bit operator )

    if (state == 2)
    checkedItems->Add(item);

    // deal with children if present
    HTREEITEM child = tree.GetNextItem(item, TVGN_CHILD);

    if (child != NULL)
    GetCheckedItems(tree, checkedItems, child);
  }
}

标签: winapimfc

解决方案


简而言之:(state >> 12) & 15将第 12 位到第 15 位向下移动到第 0 位到第 3 位,并清除从第 4 位开始的所有内容。

在树视图控件的上下文中,这对于应用程序定义的图像状态是有意义的。如树视图项状态概述下所述:

状态图像显示在项目图标旁边,以指示应用程序定义的状态。状态图像包含在通过发送TVM_SETIMAGELIST消息指定的状态图像列表中。要设置项目的状态图像,请将TVIS_STATEIMAGEMASK值包含在TVITEM结构的成员中。结构状态成员的第 12 位到第 15 位指定要绘制的图像在状态图像列表中的索引statemask

树视图控件的项目的检查状态存储在项目状态中。按照惯例,索引 0 处的图像请求无状态图像,索引 1 是未检查状态,索引 2 是检查状态。

屏蔽与项目检查状态有关的状态图像索引,并将其与值 2 进行比较,从而确定是否检查了树视图项目的状态。


推荐阅读