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

相关推荐
SuperHeroWu73 天前
【HarmonyOS Next】鸿蒙应用加载SVG文件显示图标
华为·svg·harmonyos·鸿蒙·加载·image·图标
TPCloud10 天前
如何通过rust实现自己的web登录图片验证码
开发语言·rust·image·图片验证码
江上清风山间明月15 天前
一周掌握Flutter开发--3、布局与 UI 组件
flutter·column·listview·flex·gridview·row·layoutbuilder
码农研究僧1 个月前
Vue 图片引用方式详解:静态资源与动态路径访问
vue·路由·image·public
SuperHeroWu72 个月前
【HarmonyOS】鸿蒙应用点9图的处理(draw9patch)
华为·harmonyos·鸿蒙·image·图片拉伸·点9图·不变形
两水先木示2 个月前
【Unity3D】UGUI获取图片网格、文本网格大小、位置(Rect)
unity·image·text·网格大小
AlfredZhao2 个月前
Exadata X6支持的最新image和19c数据库版本?
image·exadata·19c·23ai
rollingman4 个月前
WPF 学习《一》
学习·wpf·listview
重生之我在四川卖苕皮4 个月前
QT仿QQ聊天项目,第二节,美化登录界面
c++·qt·image·qss·qt控件