⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 反汇编的艺术-----逆向引擎网络教程 .txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:

3.3 下一章简介

我们将:

通过例子理解ListView是如何工作的。

4 ListView

4.1 什么是ListView 控件

ListView是WINDOWS的通用控件就像RichEdit、ProgressBar等。在某些方面它像ListBox但是在能力上有所增强。ListView在显示数据上有4个方法:ICON,SMALL ICON , LIST ,REPORT,但是我们只关注最后一个方法。



图4:ListView例子

4.2 使用 ListView 控件

在RadASM中我们这样做:

1.新工程:工程名字(ListView)和模板(DialogApp.tpl)

2.我们更改标题为擫istView Example?/P> 

3.在ListView.dlg中我们画一个ListView控件,命名为IDC_DSM

4.改变ListView的报告类型(Report Type)

编译并运行程序。显然我们现在有了一个很好的空白ListView程序。

在ListView(Report View)中有一行或多于一行。数据的安排像表一样在安排行和列。我们通过向ListView控件发送LVM_INSERTCOLUMN。

所以我们确切明白如何发送这个消息。

LVM_INSERTCOLUMN

wParam = iCol ;行序号

lParam = pointer to a LV_COLUMN structure ;指向LV_COLUMN指针

什么是LV_COLUMN结构?明显的它是一个结构包含我们需要插入到的ListView行的信息。

LV_COLUMN STRUCT

imask dd ?

fmt dd ?

lx dd ?

pszText dd ?

cchTextMax dd ?

iSubItem dd ?

iImage dd ?

iOrder dd ?

LV_COLUMN ENDS

我们还需要更多的细节。

Imask包含一些具体的结构成员标志是合法的。因为一些成员不是每次都使用,但是仅仅在有些情况会。

LVCF_FMT: 它意味着fmt成员是合法的

LVCF_SUBITEM: iSubItem成员是合法的

LVCF_TEXT: pszText 成员是合法的

LVCF_WIDTH: lx 成员是合法的

fmt 是在行中条目的或分条目的排列方式。它可以是以下几种值:

LVCFMT_CENTER: 文字居中

LVCFMT_RIGHT:文字右对齐

LVCFMT_LEFT:文字左对齐

lx包含行的宽度(像素)(这个行宽度以后可以在运行时使用LVM_SETCOLUMNWIDTH消息改变)

pszText是指向我们想要插入的行的名字的指针。如果一个消息被发送以获取行的属性,这个条目包含一个指向大的存储名字的缓冲区的指针并且cchTextMax区域必须包含这个缓冲区的大小。

cchTextMax包含缓冲区的大小(字节)。这个条目只是在我们获取行的属性时被使用。

iSubItem:指向分条目的索引

iImage:在image队列中指向一个image的索引(从0开始)

iOrder: 从0开始的行偏移。它是一个从左到右的序列。

基本上在ListView被创建后我们应该插入一行或多行。我们必须这样做因为我们要使用ListView的报告模式(Report View)。为了做到这些,我们需要创建一个合法的LV_COLUMN结构。

填充一些必要的信息然后发送LVM_INSERTCOLUMN消息给我们的ListView.

当我们添加多于一行时,我们需要使我们的程序尽所能的简洁,我们将添加一个新的添加行的子程序。

InsertColumn proc pszHeading:DWORD, dwWidth:DWORD

;=========================================================

; pszHeading: 指向行名字的指针

; dwWidth: 插入行的宽度

;=========================================================

LOCAL lvc:LV_COLUMN

mov lvc.imask, LVCF_TEXT + LVCF_WIDTH

push pszHeading

pop lvc.pszText

push dwWidth

pop lvc.lx

invoke SendMessage,hDsm, LVM_INSERTCOLUMN,dwIndex,addr lvc

inc dwIndex

ret

InsertColumn endp

这个子程序只是简单的构建一个LV_COLUMN结构,然后填充必需的字段(文本和宽度)再发送LVM_INSERTCOLUMN消息来插入行,这个子程序有两个参数,一个使指向行名字的指针,第二个是行的宽度。

注意:dwIndex是一个插入行的计数器,所以新行应该在旧行的右面。

注意:这个消息被发送给ListView的句柄,所以我们必须在对话框初始化的时候使用GetDlgitem获取ListView的句柄并将它保存到hDsm。

现在我们可以插入任意我们想插入的行了。

invoke InsertColumn,addr TextOfTheColumn,WidthOfTheColumn

请检查你的代码,否则你要掉队了。

现在我们知道如何插入行,但是如何在行中添加数据呢?首先我们需要知道关于ListView的一些事情。

在ListView中,字段是主要的输入点。在报告模式(Report View),这里有字段和分字段。字段是最左边的行,分字段是剩余的行。

Column1 Column2 Column3 Column4 Column5

Item1 Subitem1 Subitem2 Subitem3 Subitem4

Item2 Subitem1 Subitem2 Subitem3 Subitem4

Item3 Subitem1 Subitem2 Subitem3 Subitem4

所以我们该如何添加字段呢?为了添写一行我们需要填充一个LV_ITEM结构然后用LVM_INSETITEM消息发送它。

这个LV_ITEM结构是这样定义的:

LV_ITEM STRUCT

imask dd ?

iItem dd ?

iSubItem dd ?

state dd ?

stateMask dd ?

pszText dd ?

cchTextMax dd ?

iImage dd ?

lParam dd ?

iIndent dd ?

LV_ITEM ENDS

具体说明:

imask:一些合法结构成员的标志,跟上面的imask有些类似。

iItem:字段结构的索引(列号,从0开始)

iSubItem:在字段后面的分字段的索引(从0开始),它被认为包含与行

state:体现字段状态的标志(选择、高亮、焦点)它也包含覆盖图片的索引(从1开始)或这张图片是否被字段使用。

stateMask:我们说成员状态包含状态标志或覆盖图片的索引,所以我们需要详细的我们所感兴趣的值

pszText:在LV_COLUMN结构中

cchTextMax:在LV_COLUMN结构中

iImage:为ListView控件使用的ICON的图片列表索引。

lParam:一个在ListView控件中用户如何整理使用字段的值。

iIndent:我们没有事情让它做,请参考MSDN获取更多信息。

注意:我们添加一个字段使用LVM_LINSETITEM但是添加一个分字段我们使用LVM_SETITEM。这是因为分字段被认为是字段集的属性。它意味着如果没有字段就不能有分字段,它们是联系在一起的。

InsertItem proc uses ecx Row:DWORD, Column:DWORD, pszCaption:DWORD

;===============================================================

; Row: 从0开始的索引(列号)

; Column: 从0开始的索引(行号)

; pszCaption: 指向欲插入字段的名字的指针

;===============================================================

LOCAL lvc:LV_ITEM

mov lvc.imask, LVCF_TEXT

push row

pop lvc.iItem

push Column

pop lvc.pszText

.if Column==0

invoke SendMessage,hDsm, LVM_INSERTITEM,0,addr lvc

.elseif

invoke SendMessage,hDsm, LVM_SETITEM,0,addr lvc

.endif

inc dwIndex

ret

InsertItem endp

这个子程序很简单的构造了一个LV_ITEM结构然后填充必要信息(行、列、名字)再发送LVM_INSERTITEM消息来插入一个字段。如果(行区域)不为0它意味着我们需要插入一个分字段所以我们需要发送LVM_SETITEM来代替。这个子程序有三个参数,一个是列号,第二个是行号,第三个是一个指向我们要插入的字段名字的指针。现在我们可以插入任何我们想使用的字段和分字段了。

invoke InsertItem,Row,Column,addr TextOfTheItem

请检查你的代码,否则你要掉队了。

在我们学习完ListView如何工作、如何插入行、字段、分字段之后,让我们快速的浏览一遍ListView,我们是这样做的:

invoke SendMessage, hDsm, LVM_SETTEXTCOLOR, 0, 00E41030h

invoke SendMessage, hDsm, LVM_SETBKCOLOR,0,00DEF5F3h

invoke SendMessage, hDsm, LVM_SETTEXTBKCOLOR,0,00DEF5F3h

invoke SendMessage, hDsm, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,\

LVS_EX_FULLROWSELECT or \

LVS_EX_GRIDLINES + LVS_EX_FLATSB

首先它发送一个消息来改变文本颜色,然后改变ListView的背景颜色,再改变文本的背景颜色。确保文本背景颜色和ListView的背景颜色是一致的。最后的消息改变ListView的扩展风格,添加Girdlines &Flat Scrollbars &允许我们选择整列。

4.3 总结

在这一章我们学习了ListView是如何工作的,我们也学习了一个我们所需要功能的ListView的演示程序。

4.4 下一章简介

我们将:

进行一段PE的旅程

添加事件报告代码

 



--------------------------------------------------------------------------------
<<<上一篇  欢迎访问AoGo汇编小站:http://www.aogosoft.com 下一篇>>>  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -