需要帮助理解 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。

statestateMask的位布局是一样的,如果有人给你一个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_...) && ...
}

您要传达两个信息:每个标志的最终值,以及您要调整的标志集。这些分别由 statestateMask 成员代表。

执行的操作是:

auto flags = prev_flags & ~( state | stateMask ); // reset flags
     flags = flags      |  ( state & stateMask ); // set flags

一个例子:假设 prev_flags101 并且您希望重置标志 0,设置标志 1 并保持标志 2 不变,您将传递 010 作为 state011 作为 stateMask。请注意,stateMask 表示标志 2 的 0,以保留其当前值。

state & stateMask 的计算结果为 010.

~( state | stateMask ) 的计算结果为 101.

flags = prev_flags & ~( state & stateMask ) 的计算结果为 101 &= 100,即 100

flags | ( state & stateMask ) 的计算结果为 100 | 010,即 110.