winapi - 我发现 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消息指定的状态图像列表中。要设置项目的状态图像,请将TVIS_STATEIMAGEMASK值包含在TVITEM结构的成员中。结构状态成员的第 12 位到第 15 位指定要绘制的图像在状态图像列表中的索引。
statemask
树视图控件的项目的检查状态存储在项目状态中。按照惯例,索引 0 处的图像请求无状态图像,索引 1 是未检查状态,索引 2 是检查状态。
屏蔽与项目检查状态有关的状态图像索引,并将其与值 2 进行比较,从而确定是否检查了树视图项目的状态。
推荐阅读
- logging - 为 NLog 邮件目标组合 LimitingWrapper 和 BufferingWrapper
- minio - 有没有办法隐藏 MinIO 存储桶的文件列表索引页面?
- java - `java.lang.OutOfMemoryError:大树上的 Java 堆空间`
- r - 如何在R中的特定行拆分热图
- python - 如何在 python-telegram-bot 中更新时间变量字符串
- javascript - 使用 json 文件请求编码问题
- laravel - 如何在 Laravel 控制台命令中加载自定义 .env 文件?
- angular - Angular Material 分页器 nextPage 已禁用
- html - 如何固定选项元件 BS5 的位置
- python - 使用另一列中的值创建新类别