第一部分:
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.....