繁体   English   中英

需要帮助了解LVITEM状态和stateMask

[英]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中的哪些位是必需/有效的。

statestateMask的位布局是相同的,如果有人将您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_...) && ...
}

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

执行的操作是:

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

例如:假设prev_flags101并且您希望重置标志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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM