当前位置: 首页 > news >正文

comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置

第一部分:
BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi)
{
    LISTSUBITEM lsi;
    BOOL fChanged = FALSE;
    int i;
    int idpa;
    HDPA hdpa;

    if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE))
    {
        RIPMSG(0, "ListView: Invalid mask: %04x", plvi->mask);
        return FALSE;
    }

    if (!(plvi->mask & (LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)))
        return TRUE;

    i = plvi->iItem;
    if (!ListView_IsValidItemNumber(plv, i))
    {
        RIPMSG(0, "LVM_SETITEM: Invalid iItem: %d", plvi->iItem);
        return FALSE;
    }

    // sub item indices are 1-based...
    //
    idpa = plvi->iSubItem - 1;
    if (idpa < 0 || idpa >= plv->cCol - 1)
    {
        RIPMSG(0, "LVM_SETITEM: Invalid iSubItem: %d", plvi->iSubItem);
        return FALSE;
    }

    hdpa = ListView_GetSubItemDPA(plv, idpa);
    if (!hdpa)
    {
        hdpa = DPA_CreateEx(LV_HDPA_GROW, plv->hheap);
        if (!hdpa)
            return FALSE;

        DPA_SetPtr(plv->hdpaSubItems, idpa, (void*)hdpa);
    }

    ListView_GetSubItem(plv, i, plvi->iSubItem, &lsi);

    if (plvi->mask & LVIF_TEXT) {
        if (lsi.pszText != plvi->pszText) {
            Str_Set(&lsi.pszText, plvi->pszText);
            fChanged = TRUE;
        }
    }

    if (plvi->mask & LVIF_IMAGE) {
        if (plvi->iImage != lsi.iImage) {
            lsi.iImage = (short) plvi->iImage;
            fChanged = TRUE;
        }
    }

    if (plvi->mask & LVIF_STATE) {
        DWORD dwChange;

        dwChange = (lsi.state ^ plvi->state ) & plvi->stateMask;

        if (dwChange) {
            lsi.state ^= dwChange;
            fChanged = TRUE;
        }
    }

    if (fChanged) {
        PLISTSUBITEM plsiReal = DPA_GetPtr(hdpa, i);
        if (!plsiReal) {
            plsiReal = LocalAlloc(LPTR, sizeof(LISTSUBITEM));
            if (!plsiReal) {
                // fail!  bail out
                return FALSE;
            }
        }
        *plsiReal = lsi;
        if (!DPA_SetPtr(hdpa, i, (void*)plsiReal)) {

            ListView_FreeSubItem(plsiReal);
            return FALSE;
        }
    }

    // all's well... let's invalidate this
    if (ListView_IsReportView(plv)) {
        RECT rc;
        ListView_RGetRectsEx(plv, plvi->iItem, plvi->iSubItem, NULL, &rc);
        RedrawWindow(plv->ci.hwnd, &rc, NULL, RDW_ERASE | RDW_INVALIDATE);
    }
    else if (ListView_IsTileView(plv))
    {
        LISTITEM *pitem = ListView_GetItemPtr(plv, i);
        if (pitem)
        {
            ListView_SetSRecompute(pitem);
            // For tile view, we need to recompute the item
            plv->rcView.left = RECOMPUTE;
        
            if (plv->iItemDrawing != i)
                ListView_InvalidateItemEx(plv, i, FALSE, RDW_ERASE | RDW_INVALIDATE, LVIF_TEXT);
        }
    }
    return TRUE;
}


// ListView Item structure

#define LVIF_TEXT           0x0001  // LV_ITEM.mask flags (indicate valid fields in LV_ITEM)
#define LVIF_IMAGE          0x0002
#define LVIF_PARAM          0x0004
#define LVIF_STATE          0x0008

第二部分:
0: kd> dx -id 0,0,896d1020 -r1 ((comctl32!_LV *)0x108d88)
((comctl32!_LV *)0x108d88)                 : 0x108d88 [Type: _LV *]
    [+0x000] ci               [Type: tagControlInfo]
    [+0x024 ( 0: 0)] fNoDismissEdit   : 0x0 [Type: unsigned long]
    [+0x024 ( 1: 1)] fButtonDown      : 0x1 [Type: unsigned long]
    [+0x024 ( 2: 2)] fOneClickOK      : 0x1 [Type: unsigned long]
    [+0x024 ( 3: 3)] fOneClickHappened : 0x0 [Type: unsigned long]
    [+0x024 ( 4: 4)] fPlaceTooltip    : 0x0 [Type: unsigned long]
    [+0x024 ( 5: 5)] fImgCtxComplete  : 0x0 [Type: unsigned long]
    [+0x024 ( 6: 6)] fNoEmptyText     : 0x0 [Type: unsigned long]
    [+0x024 ( 7: 7)] fGroupView       : 0x0 [Type: unsigned long]
    [+0x024 ( 8: 8)] fIconsPositioned : 0x1 [Type: unsigned long]
    [+0x024 ( 9: 9)] fInsertAfter     : 0x0 [Type: unsigned long]
    [+0x024 (10:10)] fListviewAlphaSelect : 0x0 [Type: unsigned long]
    [+0x024 (11:11)] fListviewShadowText : 0x0 [Type: unsigned long]
    [+0x024 (12:12)] fListviewWatermarkBackgroundImages : 0x0 [Type: unsigned long]
    [+0x024 (13:13)] fListviewEnableWatermark : 0x0 [Type: unsigned long]
    [+0x024 (14:14)] fInFixIScrollPositions : 0x0 [Type: unsigned long]
    [+0x028] wView            : 0x0 [Type: unsigned short]
    [+0x02c] hdpa             : 0x1086d8 [Type: _DPA *]            [+0x02c] hdpa             : 0x1086d8 [Type: _DPA *]
  ......
    [+0x2fc] iLastId          : 0x0 [Type: unsigned long]
    [+0x300] iIncrement       : 0xffffffff [Type: unsigned long]
0: kd> dx -id 0,0,896d1020 -r1 ((comctl32!_DPA *)0x1086d8)
((comctl32!_DPA *)0x1086d8)                 : 0x1086d8 [Type: _DPA *]
    [+0x000] cp               : 22 [Type: int]
    [+0x004] pp               : 0x10b900 [Type: void * *]
    [+0x008] hheap            : 0x80000 [Type: void *]
    [+0x00c] cpAlloc          : 32 [Type: int]
    [+0x010] cpGrow           : 64 [Type: int]
    [+0x014] magic            : 0x4150 [Type: unsigned int]
0: kd> dd 0x10b900
0010b900  0010b590 0010b7f8 0010b850 0010b2f0
0010b910  0010ba10 0010ba68 0010bac0 000d64b8
0010b920  0010b380 0010b3d8 0010b430 0010b488
0010b930  0010b4e0 0010b538 0010b5e8 0010b640
0010b940  0010b698 0010b6f0 0010b748 0010b7a0
0010b950  0010b8a8 00118718 00000000 00000000
0010b960  00000000 00000000 00000000 00000000


第三部分:
一共两列:iImage表示位置,从左到右的相对位置

第二列:
0: kd> dt LISTSUBITEM 00118718
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x000d3818  -> 0x4e
   +0x004 iImage           : 0n621
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> dx -id 0,0,896d1020 -r1 (*((comctl32!tagSIZE *)0x118720))
(*((comctl32!tagSIZE *)0x118720))                 [Type: tagSIZE]
    [+0x000] cx               : 77 [Type: long]
    [+0x004] cy               : 7864319 [Type: long]
0: kd> db 0x000d3818
000d3818  4e 00 65 00 77 00 20 00-54 00 65 00 78 00 74 00  N.e.w. .T.e.x.t.
000d3828  20 00 44 00 6f 00 63 00-75 00 6d 00 65 00 6e 00   .D.o.c.u.m.e.n.
000d3838  74 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  t...t.x.t.......

0: kd> dt LISTSUBITEM 0010b8a8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001098c8  -> 0x53
   +0x004 iImage           : 0n546
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001098c8
001098c8  53 00 49 00 50 00 4f 00-42 00 4a 00 2e 00 44 00  S.I.P.O.B.J...D.
001098d8  42 00 47 00 00 00 52 00-05 00 04 00 49 01 0c 00  B.G...R.....I...

0: kd> dt LISTSUBITEM 0010b7a0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001098a0  -> 0x70
   +0x004 iImage           : 0n471
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001098a0
001098a0  70 00 61 00 67 00 65 00-66 00 69 00 6c 00 65 00  p.a.g.e.f.i.l.e.
001098b0  2e 00 73 00 79 00 73 00-00 00 00 00 00 00 00 00  ..s.y.s.........

0: kd> dt LISTSUBITEM 0010b748
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109888  -> 0x6e
   +0x004 iImage           : 0n396
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109888
00109888  6e 00 74 00 6c 00 64 00-72 00 00 00 00 00 00 00  n.t.l.d.r.......
00109898  05 00 03 00 46 01 0e 00-70 00 61 00 67 00 65 00  ....F...p.a.g.e.

0: kd> dt LISTSUBITEM 0010b6f0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109860  -> 0x4e
   +0x004 iImage           : 0n321
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109860
00109860  4e 00 54 00 44 00 45 00-54 00 45 00 43 00 54 00  N.T.D.E.T.E.C.T.
00109870  2e 00 43 00 4f 00 4d 00-00 00 00 00 00 00 00 00  ..C.O.M.........

0: kd> dt LISTSUBITEM 0010b698
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109840  -> 0x4d
   +0x004 iImage           : 0n246
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109840
00109840  4d 00 53 00 44 00 4f 00-53 00 2e 00 53 00 59 00  M.S.D.O.S...S.Y.
00109850  53 00 00 00 00 00 00 00-05 00 04 00 5e 01 0e 00  S...........^...

0: kd> dt LISTSUBITEM 0010b640
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109828  -> 0x49
   +0x004 iImage           : 0n171
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109828
00109828  49 00 4f 00 2e 00 53 00-59 00 53 00 00 00 0d 77  I.O...S.Y.S....w


0: kd>  dt LISTSUBITEM 0010b5e8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109808  -> 0x65
   +0x004 iImage           : 0n96
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE

0: kd> db 0x00109808
00109808  65 00 76 00 65 00 6e 00-74 00 2e 00 74 00 78 00  e.v.e.n.t...t.x.
00109818  74 00 00 00 00 00 00 00-03 00 04 00 51 01 0a 00  t...........Q...


0: kd>  dt LISTSUBITEM 0010b538
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001097e8  -> 0x43
   +0x004 iImage           : 0n21
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001097e8
001097e8  43 00 4f 00 4e 00 46 00-49 00 47 00 2e 00 53 00  C.O.N.F.I.G...S.
001097f8  59 00 53 00 00 00 00 00-04 00 04 00 55 01 0c 00  Y.S.........U...


第二列:
0: kd> dt LISTSUBITEM 0010b4e0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001097c8  -> 0x62
   +0x004 iImage           : 0n921
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001097c8
001097c8  62 00 6f 00 6f 00 74 00-2e 00 69 00 6e 00 69 00  b.o.o.t...i.n.i.


0: kd>  dt LISTSUBITEM 0010b488
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001097a0  -> 0x41
   +0x004 iImage           : 0n846
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001097a0
001097a0  41 00 55 00 54 00 4f 00-45 00 58 00 45 00 43 00  A.U.T.O.E.X.E.C.
001097b0  2e 00 42 00 41 00 54 00-00 00 00 00 00 00 00 00  ..B.A.T.........


0: kd>  dt LISTSUBITEM 0010b430
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109788  -> 0x36
   +0x004 iImage           : 0n771
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109788
00109788  36 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  6...t.x.t.......


0: kd>  dt LISTSUBITEM 0010b3d8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109770  -> 0x34
   +0x004 iImage           : 0n696
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109770
00109770  34 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  4...t.x.t.......


0: kd>  dt LISTSUBITEM 0010b380
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109758  -> 0x32
   +0x004 iImage           : 0n621
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109758
00109758  32 00 2e 00 74 00 78 00-74 00 00 00 2a 97 2e 77  2...t.x.t...*..w
00109768  03 00 03 00 b8 01 0c 00-34 00 2e 00 74 00 78 00  ........4...t.x.


0: kd>  dt LISTSUBITEM 000d64b8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109740  -> 0x31
   +0x004 iImage           : 0n546
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109740
00109740  31 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00  1...t.x.t.......
00109750  03 00 03 00 bf 01 0c 00-32 00 2e 00 74 00 78 00  ........2...t.x.

0: kd>  dt LISTSUBITEM 0010bac0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109728  -> 0x77
   +0x004 iImage           : 0n471
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109728
00109728  77 00 6d 00 70 00 75 00-62 00 00 00 ac 87 2a 77  w.m.p.u.b.....*w
00109738  03 00 03 00 b2 01 0c 00-31 00 2e 00 74 00 78 00  ........1...t.x.


0: kd>  dt LISTSUBITEM 0010ba68
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x000f4280  -> 0x57
   +0x004 iImage           : 0n396
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x000f4280
000f4280  57 00 49 00 4e 00 44 00-4f 00 57 00 53 00 00 00  W.I.N.D.O.W.S...


0: kd>  dt LISTSUBITEM 0010ba10
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x0010b158  -> 0x74
   +0x004 iImage           : 0n321
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x0010b158
0010b158  74 00 66 00 74 00 70 00-64 00 72 00 6f 00 6f 00  t.f.t.p.d.r.o.o.
0010b168  74 00 00 00 00 00 00 00-b8 56 10 00 78 8d 10 00  t........V..x...


0: kd>  dt LISTSUBITEM 0010b2f0
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001096e8  -> 0x53
   +0x004 iImage           : 0n246
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001096e8
001096e8  53 00 79 00 73 00 74 00-65 00 6d 00 20 00 56 00  S.y.s.t.e.m. .V.
001096f8  6f 00 6c 00 75 00 6d 00-65 00 20 00 49 00 6e 00  o.l.u.m.e. .I.n.
00109708  66 00 6f 00 72 00 6d 00-61 00 74 00 69 00 6f 00  f.o.r.m.a.t.i.o.
00109718  6e 00 00 00 00 02 00 00-03 00 08 00 b1 01 0c 00  n...............


0: kd>  dt LISTSUBITEM 0010b850
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x00109b58  -> 0x52
   +0x004 iImage           : 0n171
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x00109b58
00109b58  52 00 45 00 43 00 59 00-43 00 4c 00 45 00 52 00  R.E.C.Y.C.L.E.R.
00109b68  00 00 00 00 00 00 00 00-08 00 04 00 3b 01 08 00  ............;...

0: kd>  dt LISTSUBITEM 0010b7f8
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x001056a0  -> 0x50
   +0x004 iImage           : 0n96
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE
0: kd> db 0x001056a0
001056a0  50 00 72 00 6f 00 67 00-72 00 61 00 6d 00 20 00  P.r.o.g.r.a.m. .
001056b0  46 00 69 00 6c 00 65 00-73 00 00 00 78 8d 10 00  F.i.l.e.s...x...

0: kd>  dt LISTSUBITEM 0010b590
comctl32!LISTSUBITEM
   +0x000 pszText          : 0x0010b348  -> 0x44
   +0x004 iImage           : 0n21
   +0x006 state            : 0
   +0x008 sizeText         : tagSIZE

0: kd> db 0x0010b348
0010b348  44 00 6f 00 63 00 75 00-6d 00 65 00 6e 00 74 00  D.o.c.u.m.e.n.t.
0010b358  73 00 20 00 61 00 6e 00-64 00 20 00 53 00 65 00  s. .a.n.d. .S.e.
0010b368  74 00 74 00 69 00 6e 00-67 00 73 00 00 00 00 00  t.t.i.n.g.s.....

相关文章:

  • 简单的 Python 示例,用于生成电影解说视频的第一人称独白解说文案
  • Oracle数据库监听学习
  • NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发
  • Node.js 技术原理分析系列 4—— 使用 Chrome DevTools 分析 Node.js 性能问题
  • IMX6ULL驱动开发Linux篇02——移植Rootfs
  • 李沐《动手学深度学习》——14.9. 用于预训练BERT的数据集——wiki数据集问题以及存在的其他问题
  • 小白学习:rag向量数据库
  • 《C++ primer》第四章
  • FOC 控制笔记【二】无感控制、滑膜观测器和PLL
  • 用《设计模式》的角度优化 “枚举”
  • Python零基础学习第三天:函数与数据结构
  • PyTorch深度学习在硬件与资源限制下分布式训练和多GPU加速等技术的实例代码
  • 从零构建高可用MySQL自动化配置系统:核心技术、工具开发与企业级最佳实践
  • Linux 指定命令行前后添加echo打印内容
  • Unity URP渲染管线烘焙场景教程
  • docker装Oracle
  • Spring MVC源码分析のinit流程
  • Rust语言:开启高效编程之旅
  • 线程安全---java
  • 阿里发布新开源视频生成模型Wan-Video,支持文生图和图生图,最低6G就能跑,ComFyUI可用!
  • 上海“城市文明开放麦”全城总动员,樊振东担任首位上海城市文明大使
  • 一图看懂|印巴交火后,双方基地受损多少?
  • 俄谈判代表团已抵达土耳其,谈判预计在莫斯科时间10时左右开始
  • 晋级四强!WTA1000罗马站:郑钦文2比0萨巴伦卡
  • 白玉兰奖征片综述丨动画的IP生命力
  • 日月谭天丨这轮中美关税会谈让台湾社会看清了什么?