需要帮助理解 LVITEM state 和 stateMask
Need help understanding LVITEM state and stateMask
我很困惑。 LVITEM structure 状态:
state
Type: UINT
Indicates the item's state, state image, and overlay image. The stateMask member indicates the valid bits of this member.
Bits 0 through 7 of this member contain the item state flags. This can be one or more of the item state values.
所以我的问题是,第 0 位到第 7 位是做什么用的?它们似乎没有指示其他位使用什么,否则就不需要 stateMask。
MSDN 准确地告诉您 state
中的位是什么:
Bits 0 through 7 of this member contain the item state flags. This can be one or more of the item state values.
Bits 8 through 11 of this member specify the one-based overlay image index. ... To isolate these bits, use the LVIS_OVERLAYMASK mask.
Bits 12 through 15 of this member specify the state image index. To isolate these bits, use the LVIS_STATEIMAGEMASK mask.
将低位设置为LVIS_*MASK
没有意义,只有其他LVIS_*
状态。 stateMask
指定查询或设置状态时 state
中的哪些位是 required/valid。
state
和stateMask
的位布局是一样的,如果有人给你一个LVITEM
,你会计算有效位为valid = lvi.state & lvi.stateMask
。如果您关心的状态位未在 stateMask
中设置,您将不得不查询列表视图以获取这些位。
在列表视图的源代码中,查询代码可能如下所示:
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 )
的计算结果为 100 | 010
,即 110
.
我很困惑。 LVITEM structure 状态:
state
Type: UINT
Indicates the item's state, state image, and overlay image. The stateMask member indicates the valid bits of this member.
Bits 0 through 7 of this member contain the item state flags. This can be one or more of the item state values.
所以我的问题是,第 0 位到第 7 位是做什么用的?它们似乎没有指示其他位使用什么,否则就不需要 stateMask。
MSDN 准确地告诉您 state
中的位是什么:
Bits 0 through 7 of this member contain the item state flags. This can be one or more of the item state values.
Bits 8 through 11 of this member specify the one-based overlay image index. ... To isolate these bits, use the LVIS_OVERLAYMASK mask.
Bits 12 through 15 of this member specify the state image index. To isolate these bits, use the LVIS_STATEIMAGEMASK mask.
将低位设置为LVIS_*MASK
没有意义,只有其他LVIS_*
状态。 stateMask
指定查询或设置状态时 state
中的哪些位是 required/valid。
state
和stateMask
的位布局是一样的,如果有人给你一个LVITEM
,你会计算有效位为valid = lvi.state & lvi.stateMask
。如果您关心的状态位未在 stateMask
中设置,您将不得不查询列表视图以获取这些位。
在列表视图的源代码中,查询代码可能如下所示:
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 )
的计算结果为 100 | 010
,即 110
.