我发现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);
}
}

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

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

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

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

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

最新更新