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

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.....


http://www.kler.cn/a/582174.html

相关文章:

  • 开源模型时代的 AI 开发革命:Dify 技术深度解析
  • Node 使用 SSE 结合redis 推送数据(echarts 图表实时更新)
  • springboot3 spring security+jwt实现接口权限验证实现
  • 牛客周赛:84:B:JAVA
  • 亚信安全发布第七期《勒索家族和勒索事件监控报告》
  • Vue3实战学习(Element-Plus常用组件的使用(轮播图、日期时间选择器、表格、分页组件、对话框)(超详细))(下)(6)
  • 设计模式之工厂模式:原理、实现与应用
  • 模拟面试题:系统设计
  • Spring(九)AOP-底层原理与通知方法的理解
  • SQL Server 与 MySQL 的库同步工具推荐
  • 《React 属性与状态江湖:从验证到表单受控的实战探险》
  • 【从零开始学习计算机科学】计算机体系结构(二)指令级并行(ILP)
  • 医疗AI测试实战:如何确保人工智能安全赋能医疗行业?
  • 【C#学习笔记01】从程序框架到函数调用
  • 【AI大模型智能应用】Deepseek生成测试用例
  • 2025,以SBOM为基础的云原生应用安全治理
  • Linux学习(十五)(故障排除(ICMP,Ping,Traceroute,网络统计,数据包分析))
  • 不同AI生成的PHP版雪花算法
  • 装饰器模式的C++实现示例
  • 数据分析绘制随时间顺序变化图加入线性趋势线——numpy库的polyfit计算一次多项式拟合