[英]Need help understanding LVITEM state and stateMask
我糊涂了。 LVITEM结构指出:
州
类型: UINT
指示项目的状态,状态图像和覆盖图像。 stateMask成员指示此成员的有效位。
该成员的位0到7包含项目状态标志。 这可以是一个或多个项目状态值。
所以我的问题是,位0到7是做什么用的? 它们似乎没有指示其他位使用的内容,否则将不需要stateMask 。
MSDN告诉您确切的state
是:
该成员的位0到7包含项目状态标志。 这可以是一个或多个项目状态值 。
该成员的第8位到第11位指定基于一个的叠加图像索引。 ...要隔离这些位,请使用LVIS_OVERLAYMASK掩码。
该成员的第12到15位指定状态图像索引。 要隔离这些位,请使用LVIS_STATEIMAGEMASK掩码。
将最低位设置为LVIS_*MASK
,仅设置其他LVIS_*
状态没有意义。 stateMask
指定查询或设置状态时state
中的哪些位是必需/有效的。
state
和stateMask
的位布局是相同的,如果有人将您LVITEM
您将计算出有效位为valid = lvi.state & lvi.stateMask
。 如果您不在乎的状态位未在stateMask
设置, stateMask
必须在列表视图中查询这些位。
在listview的源代码中,查询代码可能看起来像这样:
void ListView::GetItemState(LVITEM&lvi, int idx)
{
lvi.state = 0;
if ((lvi.stateMask & LVIS_CUT) && isItemInCutState(idx, lvi)) lvi.state |= LVIS_CUT;
if ((lvi.stateMask & LVIS_...) && ...
}
您想传达两点信息:每个标志的最终值以及要调整的标志集。 这些分别由state
和stateMask
成员表示。
执行的操作是:
auto flags = prev_flags & ~( state | stateMask ); // reset flags
flags = flags | ( state & stateMask ); // set flags
例如:假设prev_flags
为101
并且您希望重置标志0,设置标志1,并使标志2保持不变,则将010
作为state
传递,将011
作为stateMask
。 注意, stateMask
表示标志2为0
,以保留其当前值。
state & stateMask
计算结果为010
。
~( state | stateMask )
值为101
。
flags = prev_flags & ~( state & stateMask )
值为101 &= 100
,即100
flags | ( state & stateMask )
flags | ( state & stateMask )
值为100 | 010
100 | 010
,即110
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.