日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux sort -w32,WIN32汇编: 31.列表视图控件

發(fā)布時(shí)間:2025/3/20 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux sort -w32,WIN32汇编: 31.列表视图控件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第三十一課 列表視圖控件

本課中我們將學(xué)習(xí)如何創(chuàng)建和使用列表視圖控件。

理論:

列表視圖控件和樹(shù)型視圖、豐富文本編輯控件一樣是通用控件的一種??赡苣家呀?jīng)知道了列表視圖控件,只不過(guò)是不知道它的確切名字而已。列表視圖控件可以用來(lái)很好地顯示項(xiàng)目。在這方面它和列表框相同,只不過(guò)它的性能更強(qiáng)。

有兩種方法創(chuàng)建一個(gè)列表視圖控件。第一種也是最簡(jiǎn)單的方法是:用資源編輯器來(lái)創(chuàng)建它。用該種方法只是不要忘記在您的代碼(的任何位置處)加入對(duì)InitCommonControls函數(shù)的調(diào)用(記得嗎,調(diào)用該函數(shù)只是為了隱式地加載包含通用控件的DLL)。另一種方法是調(diào)用CreateWindowEx函數(shù),這里您必須指定合適的類(lèi)名,譬如:SysListView32,WC_LISTVIEW不是正確的類(lèi)名

在列表視圖種有四種方法來(lái)顯示數(shù)據(jù):大圖標(biāo),小圖標(biāo),列表和報(bào)告方式。這些方法和在資源管理器種選擇View->Large Icons,Small Icons , List 和 Details 相對(duì)應(yīng)。各種不同的顯示方式只是顯示了不同的外觀而已。譬如,您可能有許多的數(shù)據(jù),只是并不想全部顯示。報(bào)告方式提供的消息最完全,其它的方式則要少得多。在剛創(chuàng)建一個(gè)列表視圖時(shí)您可以選擇一種初始顯示方法,隨后您可以調(diào)用SetWinodwLong函數(shù)并設(shè)置GWL_STYLE標(biāo)志位來(lái)改變顯示方式

既然我們已經(jīng)知道了如何創(chuàng)建列表控件,接下來(lái)我們學(xué)習(xí)如何使用它們。我們將主要集中在報(bào)告方式的顯示上,因?yàn)樵摲N方式演示了最多的列表控制的特性。使用列表控制的步驟如下:

調(diào)用CreateWindowEx函數(shù)來(lái)創(chuàng)建一個(gè)列表控件,指定它的類(lèi)名為SysListView32。您還可以在此處指定控件初次顯示時(shí)的方式。

創(chuàng)建和初始化用在列表控件中顯示項(xiàng)目的圖象列表(如果存在)。

向列表控件中插入列,如果顯示的方式是報(bào)告方式這一步是必須的。

向控件中插入項(xiàng)目和自項(xiàng)目。

列:

在報(bào)告方式中,有不止一個(gè)列。您可以把放入到列表控件中的數(shù)據(jù)看作是一張表單:這時(shí)數(shù)據(jù)是按行列排列的。在控件中至少有一列。在其它的顯示方式中則無(wú)所謂,因?yàn)檫@些顯示方式有僅有一列。

加入列要通過(guò)向列表控件發(fā)送LVM_INSERTCOLUMN消息來(lái)實(shí)現(xiàn)。

LVM_INSERTCOLUMN

wParam = iCol

lParam =指向LV_COLUMN型結(jié)構(gòu)體變量的指針

iCol 列數(shù),從0開(kāi)始編號(hào)。

LV_COLUMN 包含了將插入的列的信息。它的定義如下:

LV_COLUMN STRUCT

imask dd ?

fmt dd ?

lx dd ?

pszText dd ?

cchTextMax dd ?

iSubItem dd ?

iImage dd ?

iOrder dd ?

LV_COLUMN ENDS

Field name

Meanings

imask

一組標(biāo)志位,它指示了該結(jié)構(gòu)體中的那些成員變量是有效的。該結(jié)構(gòu)體中的成員變量并不是同時(shí)有效的。在某些時(shí)候,可能只有某些成員變量是有效的。結(jié)構(gòu)體可以用來(lái)輸入和輸出。這樣讓W(xué)INDOWS知道那些成員變量是有效的是非常重要的??赡艿臉?biāo)志有:

LVCF_FMT = fmt有效

LVCF_SUBITEM = iSubItem有效

LVCF_TEXT = pszText有效.

LVCF_WIDTH = lx有效

您可以一次使用幾個(gè)標(biāo)志。譬如,如果您向指定列的文本標(biāo)簽(列名),您必須在pszText成員變量中提供列名,然后指定標(biāo)志LVCF_TEXT告訴WINDOWS成員變量pszText中的值是有效的,否則WINDOWS將忽略掉pszText中的值。

fmt

指定了項(xiàng)目/子項(xiàng)目的對(duì)齊方式??赡艿闹涤?#xff1a;

LVCFMT_CENTER = 文本居中

LVCFMT_LEFT = 文本左對(duì)齊

LVCFMT_RIGHT = 文本右對(duì)齊

lx

lx 是列的寬度(以像素點(diǎn)為單位)。以后您可以發(fā)送消息LVM_SETCOLUMNWIDTH來(lái)改變列的寬度。

pszText

如果用來(lái)設(shè)定列的屬性時(shí),該成員變量為指向列名的指針。如果是查詢(xún)列名,該成員變量指向一個(gè)足夠大的緩沖區(qū),用來(lái)接收返回的列名,這是您必須在成員cchTextMax中指定緩沖區(qū)的大小。如果是設(shè)定列名時(shí),可以忽略該變量,因?yàn)樵撝羔樦赶虻氖且粋€(gè)ASCII碼的字符串,而WINDOWS可以解析出ASCII串的長(zhǎng)度。

cchTextMax

cchTextMax 以字節(jié)計(jì)的上面一個(gè)成員變量指向的緩沖區(qū)的小。該成員變量只在您查詢(xún)列的屬性時(shí)使用。如果是設(shè)定列的屬性,那該變量將被忽略。

iSubItem

指定和該列相連的子項(xiàng)目的索引號(hào)。該成員變量的值用來(lái)標(biāo)識(shí)和列相連系的子項(xiàng)目。該列的使用最好地說(shuō)明了如何把列號(hào)和子項(xiàng)目相連。要查詢(xún)列的屬性時(shí)可以發(fā)送LVM_GETCOLUMN消息,并在成員變量imask中指定LVCF_SUBITEM標(biāo)志,列表控件將在iSubItem中返回插入時(shí)設(shè)定的iSubItem值。為了使用該辦法,您需要在該成員變量中放入正確的值。

iImage and iOrder

為了和IE3.0以上版本兼容。目前我沒(méi)有這方面的資料。

在列表視圖控件創(chuàng)建后,您必須至少向其中插入一列。當(dāng)然如果不打算使用報(bào)告方式顯示,那倒是沒(méi)有必要插入列。為了插入列,您需要定義一個(gè)LV_COLUMN型的結(jié)構(gòu)體變量,給其成員變量賦上正確的值,指定列號(hào),然后向列表視圖控件發(fā)送LVM_INSERTCOLUMN消息并把該結(jié)構(gòu)體變量的值傳過(guò)去。

LOCAL lvc:LV_COLUMN

mov lvc.imask,LVCF_TEXT+LVCF_WIDTH

mov lvc.pszText,offset Heading1

mov lvc.lx,150

invoke SendMessage,hList, LVM_INSERTCOLUMN,0,addr lvc

上面的代碼段顯示了該過(guò)程。當(dāng)發(fā)送LVM_INSERTCOLUMN消息時(shí),他指定了列的標(biāo)題條文本和它的寬度。

項(xiàng)目和子項(xiàng)目

項(xiàng)目是列表視圖中主要的內(nèi)容。除報(bào)告方式顯示的外,在列表視圖您只能看到項(xiàng)目。子項(xiàng)目是項(xiàng)目的詳細(xì)信息。一個(gè)項(xiàng)目可能有不止一個(gè)相關(guān)的子項(xiàng)目。舉個(gè)例子,譬如項(xiàng)目是文件名,那其相關(guān)的子項(xiàng)目可能有文件屬性、大小、創(chuàng)建日期等。在報(bào)告方式的視圖中,最左邊一列是項(xiàng)目,其它列是子項(xiàng)目。從數(shù)據(jù)庫(kù)記錄的角度看,項(xiàng)目類(lèi)似主鍵,子項(xiàng)目類(lèi)似記錄。

至少您的列表視圖需要一些項(xiàng)目:子項(xiàng)目是可選的。如果您想要給用戶(hù)提供更多的信息,可以把子項(xiàng)目和項(xiàng)目相連,然后放到列表視圖中以報(bào)告的方式顯示。

您可以通過(guò)向列表視圖發(fā)送LVM_INSERTITEM消息來(lái)向其中添加項(xiàng)目,這時(shí)還需要把一個(gè)指向LV_ITEM型的結(jié)構(gòu)體的變量的指針?lè)诺絣Param一同傳給列表視圖。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

Field name

Meanings

imask

一組標(biāo)志位標(biāo)明該結(jié)構(gòu)體中那些成員變量中的值有效。它的意義和上面我們提到的LV_COLUMN型結(jié)構(gòu)體中向?qū)?yīng)的成員變量基本相同。更詳細(xì)的信息,可以查詢(xún)WIN32 API 手冊(cè)。

iItem

該結(jié)構(gòu)體代表的項(xiàng)目的索引號(hào)。索引號(hào)是從0開(kāi)始編號(hào)的。該值和表單的“行”類(lèi)似。

iSubItem

和上一個(gè)成員變量指定的項(xiàng)目相連的子項(xiàng)目的索引號(hào)。您可以把它當(dāng)作表單的“列”。譬如您想要把一個(gè)項(xiàng)目插入到新創(chuàng)建的列表視圖控件,iItem的值應(yīng)為0(因?yàn)樵擁?xiàng)目是第一個(gè)項(xiàng)目),iSubItem的值也應(yīng)當(dāng)為0(我們想把該項(xiàng)目插到第一列)。如果你想指定一個(gè)子項(xiàng)目和該項(xiàng)目相連,iItem中應(yīng)該是您想要相連的項(xiàng)目的索引號(hào),iSubItem的值應(yīng)當(dāng)是大于0的值,具體的值取決于您想把該子項(xiàng)目插在那一列。如果你的列表視圖控件一共有4列的化,第一列包含了項(xiàng)目,其余3列是留給子項(xiàng)目的。如果您想把子項(xiàng)目插在第四列,應(yīng)當(dāng)指定該值為3。

state

該成員變量包含的標(biāo)志位反應(yīng)了項(xiàng)目的狀態(tài)。狀態(tài)的改變可能是由用戶(hù)的操作引起的或是程序改變的。這些狀態(tài)包括:是否有焦點(diǎn)/高亮度顯示/被選中(由于被剪切)/被選中等。另外還包括,以1為基數(shù)的索引用來(lái)代表是否處使用重疊/狀態(tài)圖標(biāo)。

stateMask

由于上面的成員變量包含狀態(tài)標(biāo)志位、重疊的位圖索引號(hào)、和狀態(tài)位圖的索引號(hào),我們需要告訴WINDOWS我們到底需要設(shè)定或查詢(xún)那一個(gè)值。該成員變量就是用來(lái)做這項(xiàng)工作的。

pszText

當(dāng)我們想設(shè)定項(xiàng)目的屬性時(shí),它包含項(xiàng)目名稱(chēng)的ASCII碼的字符串的地址。當(dāng)查詢(xún)項(xiàng)目的屬性時(shí),該成員變量將用來(lái)接收查詢(xún)返回的項(xiàng)目的名稱(chēng)。

cchTextMax

僅當(dāng)您用來(lái)查詢(xún)項(xiàng)目的屬性時(shí)才需要使用該值,這時(shí)它包含上一個(gè)成員變量的大小。

iImage

圖標(biāo)在列表視圖中的圖象鏈表中的索引號(hào)。

lParam

用戶(hù)定義的值,當(dāng)您給項(xiàng)目排序時(shí)使用。當(dāng)您告訴列表視圖對(duì)項(xiàng)目排序時(shí),列表視圖將成對(duì)地比較項(xiàng)目。 它將會(huì)把兩個(gè)項(xiàng)目的lParam的值傳給您,這樣您就可以進(jìn)行比較先列出那一個(gè)了。如果您現(xiàn)在還不太明白的話,沒(méi)有系,我們稍后還要講關(guān)于排序的問(wèn)題。

現(xiàn)在讓我們來(lái)總結(jié)想列表控件中插入項(xiàng)目/子項(xiàng)目的步驟:

定義一個(gè)LV_ITEM型的結(jié)構(gòu)體變量。

給該變量賦給合適的值

如果要插入一個(gè)項(xiàng)目,就向列表視圖控件發(fā)送LVM_INSERTITEM值。 如果要插入一個(gè)子項(xiàng)目,發(fā)送LVM_SETITEM。如果您不明白項(xiàng)目和子項(xiàng)目之間的關(guān)系的話,可能會(huì)有一些疑惑。子項(xiàng)目?jī)H是項(xiàng)目的屬性而已,也就是說(shuō)您可以插入一個(gè)項(xiàng)目但是不能插入一個(gè)子項(xiàng)目。所以添加一個(gè)子項(xiàng)目十只能發(fā)送LVM_SETITEM消息而不能發(fā)送LVM_INSERTITEM消息。

列表視圖控件的消息/通知

既然您知道了如何創(chuàng)建和往其中添加內(nèi)容,下一步就是如何和它通訊。列表視圖控件和它的父窗口之間的通訊是通過(guò)消息/通知來(lái)進(jìn)行的。父窗口通過(guò)發(fā)送消息來(lái)控制列表視圖控件,列表視圖控件通過(guò)發(fā)送WM_NOTIFY消息來(lái)通知它的父窗口。這一點(diǎn)和其它的通用控件沒(méi)有什么不同。

排序項(xiàng)目/子項(xiàng)目

您可以在調(diào)用CreateWindowEx函數(shù)時(shí)指定LVS_SORTASCENDING 或 LVS_SORTDESCENDING風(fēng)格來(lái)指定缺省的排序方式。這兩種風(fēng)格僅僅排序項(xiàng)目的名稱(chēng)。如果想要排序項(xiàng)目的其它屬性,您可以通過(guò)發(fā)送LVM_SORTITEMS消息來(lái)完成

LVM_SORTITEMS

wParam = lParamSort

lParam = pCompareFunction

lParamSort用戶(hù)定義的值,該值將傳遞給用來(lái)比較的函數(shù)。

pCompareFunction 用戶(hù)定義的用來(lái)比較排序的函數(shù)的地址。該函數(shù)的原型如下:

CompareFunc proto lParam1:DWORD, lParam2:DWORD, lParamSort:DWORD

lParam1 和 lParam2 是 LV_ITEM型的結(jié)構(gòu)體中的成員變量lParam的值。

lParamSort 是發(fā)送LVM_SORTITEMS消息時(shí)參數(shù)wParam中的值

當(dāng)列表視圖控件接收到LVM_SORTITEMS消息時(shí),當(dāng)需要比較項(xiàng)目時(shí)它會(huì)調(diào)用在lParam中指定的比較函數(shù)。比較函數(shù)將決定那一個(gè)項(xiàng)目排在前面。方法很簡(jiǎn)單:如果函數(shù)返回一個(gè)負(fù)值,由(lParam代表的)第一個(gè)項(xiàng)目排在前,如果返回正值,第二個(gè)項(xiàng)目排在前。如果相等,必須返回0 。

真正使得該方法能夠運(yùn)行的是LV_ITEM型結(jié)構(gòu)體中的成員變量lParam值。當(dāng)您需要排序時(shí)(譬如當(dāng)您點(diǎn)擊列的標(biāo)題條時(shí)),您需要考慮好排序方案。在本例中,我們把項(xiàng)目的索引放到該成員變量中,這樣我們可以通過(guò)發(fā)送LVM_GETITEM消息來(lái)得到項(xiàng)目的其它信息。注意:當(dāng)項(xiàng)目重排序后,它們的索引也就變了。所以當(dāng)重排序后,我需要在lParam參數(shù)中反應(yīng)出新的索引。如果您想在用戶(hù)點(diǎn)擊列的標(biāo)題條時(shí)重新排序,您需要在您的窗口過(guò)程函數(shù)中處理LVN_COLUMNCLICK通知消息。LVN_COLUMNCLICK消息是隨同WM_NOTIFY消息一起發(fā)送的。

例子:

該例子創(chuàng)建了一個(gè)列表視圖控件,并在其中顯示了當(dāng)前文件夾中的文件大小和文件名。缺省的視圖是報(bào)告方式的,如果您點(diǎn)擊列標(biāo)題條,標(biāo)題將按升/降序重新排列。您可以通過(guò)菜單選擇不同的顯示方式(大圖標(biāo)、小圖標(biāo)等)。當(dāng)您雙擊一個(gè)項(xiàng)目時(shí),項(xiàng)目的名稱(chēng)將顯示在一個(gè)對(duì)話框中。

.386

.model flat,stdcall

option casemap:none

include /masm32/include/windows.inc

include /masm32/include/user32.inc

include /masm32/include/kernel32.inc

include /masm32/include/comctl32.inc

includelib /masm32/lib/comctl32.lib

includelib /masm32/lib/user32.lib

includelib /masm32/lib/kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

IDM_MAINMENU equ 10000

IDM_ICON equ LVS_ICON

IDM_SMALLICON equ LVS_SMALLICON

IDM_LIST equ LVS_LIST

IDM_REPORT equ LVS_REPORT

RGB macro red,green,blue

xor eax,eax

mov ah,blue

shl eax,8

mov ah,green

mov al,red

endm

.data

ClassName db "ListViewWinClass",0

AppName db "Testing a ListView Control",0

ListViewClassName db "SysListView32",0

Heading1 db "Filename",0

Heading2 db "Size",0

FileNamePattern db "*.*",0

FileNameSortOrder dd 0

SizeSortOrder dd 0

template db "%lu",0

.data?

hInstance HINSTANCE ?

hList dd ?

hMenu dd ?

.code

start:

invoke GetModuleHandle, NULL

mov hInstance,eax

invoke WinMain, hInstance,NULL, NULL, SW_SHOWDEFAULT

invoke ExitProcess,eax

invoke InitCommonControls

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD

LOCAL wc:WNDCLASSEX

LOCAL msg:MSG

LOCAL hwnd:HWND

mov wc.cbSize,SIZEOF WNDCLASSEX

mov wc.style, NULL

mov wc.lpfnWndProc, OFFSET WndProc

mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL

push hInstance

pop wc.hInstance

mov wc.hbrBackground,COLOR_WINDOW+1

mov wc.lpszMenuName,IDM_MAINMENU

mov wc.lpszClassName,OFFSET ClassName

invoke LoadIcon,NULL,IDI_APPLICATION

mov wc.hIcon,eax

mov wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW

mov wc.hCursor,eax

invoke RegisterClassEx, addr wc

invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst,NULL

mov hwnd,eax

invoke ShowWindow, hwnd,SW_SHOWNORMAL

invoke UpdateWindow, hwnd

.while TRUE

invoke GetMessage, ADDR msg,NULL,0,0

.break .if (!eax)

invoke TranslateMessage, ADDR msg

invoke DispatchMessage, ADDR msg

.endw

mov eax,msg.wParam

ret

WinMain endp

InsertColumn proc

LOCAL lvc:LV_COLUMN

mov lvc.imask,LVCF_TEXT+LVCF_WIDTH

mov lvc.pszText,offset Heading1

mov lvc.lx,150

invoke SendMessage,hList, LVM_INSERTCOLUMN, 0, addr lvc

or lvc.imask,LVCF_FMT

mov lvc.fmt,LVCFMT_RIGHT

mov lvc.pszText,offset Heading2

mov lvc.lx,100

invoke SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvc

ret

InsertColumn endp

ShowFileInfo proc uses edi row:DWORD, lpFind:DWORD

LOCAL lvi:LV_ITEM

LOCAL buffer[20]:BYTE

mov edi,lpFind

assume edi:ptr WIN32_FIND_DATA

mov lvi.imask,LVIF_TEXT+LVIF_PARAM

push row

pop lvi.iItem

mov lvi.iSubItem,0

lea eax,[edi].cFileName

mov lvi.pszText,eax

push row

pop lvi.lParam

invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi

mov lvi.imask,LVIF_TEXT

inc lvi.iSubItem

invoke wsprintf,addr buffer, addr template,[edi].nFileSizeLow

lea eax,buffer

mov lvi.pszText,eax

invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi

assume edi:nothing

ret

ShowFileInfo endp

FillFileInfo proc uses edi

LOCAL finddata:WIN32_FIND_DATA

LOCAL FHandle:DWORD

invoke FindFirstFile,addr FileNamePattern,addr finddata

.if eax!=INVALID_HANDLE_VALUE

mov FHandle,eax

xor edi,edi

.while eax!=0

test finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY

.if ZERO?

invoke ShowFileInfo,edi, addr finddata

inc edi

.endif

invoke FindNextFile,FHandle,addr finddata

.endw

invoke FindClose,FHandle

.endif

ret

FillFileInfo endp

String2Dword proc uses ecx edi edx esi String:DWORD

LOCAL Result:DWORD

mov Result,0

mov edi,String

invoke lstrlen,String

.while eax!=0

xor edx,edx

mov dl,byte ptr [edi]

sub dl,"0"

mov esi,eax

dec esi

push eax

mov eax,edx

push ebx

mov ebx,10

.while esi > 0

mul ebx

dec esi

.endw

pop ebx

add Result,eax

pop eax

inc edi

dec eax

.endw

mov eax,Result

ret

String2Dword endp

CompareFunc proc uses edi lParam1:DWORD, lParam2:DWORD, SortType:DWORD

LOCAL buffer[256]:BYTE

LOCAL buffer1[256]:BYTE

LOCAL lvi:LV_ITEM

mov lvi.imask,LVIF_TEXT

lea eax,buffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

.if SortType==1

mov lvi.iSubItem,1

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi

invoke String2Dword,addr buffer

mov edi,eax

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi

invoke String2Dword,addr buffer

sub edi,eax

mov eax,edi

.elseif SortType==2

mov lvi.iSubItem,1

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi

invoke String2Dword,addr buffer

mov edi,eax

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi

invoke String2Dword,addr buffer

sub eax,edi

.elseif SortType==3

mov lvi.iSubItem,0

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi

invoke lstrcpy,addr buffer1,addr buffer

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi

invoke lstrcmpi,addr buffer1,addr buffer

.else

mov lvi.iSubItem,0

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi

invoke lstrcpy,addr buffer1,addr buffer

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi

invoke lstrcmpi,addr buffer,addr buffer1

.endif

ret

CompareFunc endp

UpdatelParam proc uses edi

LOCAL lvi:LV_ITEM

invoke SendMessage,hList, LVM_GETITEMCOUNT,0,0

mov edi,eax

mov lvi.imask,LVIF_PARAM

mov lvi.iSubItem,0

mov lvi.iItem,0

.while edi>0

push lvi.iItem

pop lvi.lParam

invoke SendMessage,hList, LVM_SETITEM,0,addr lvi

inc lvi.iItem

dec edi

.endw

ret

UpdatelParam endp

ShowCurrentFocus proc

LOCAL lvi:LV_ITEM

LOCAL buffer[256]:BYTE

invoke SendMessage,hList,LVM_GETNEXTITEM,-1, LVNI_FOCUSED

mov lvi.iItem,eax

mov lvi.iSubItem,0

mov lvi.imask,LVIF_TEXT

lea eax,buffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

invoke SendMessage,hList,LVM_GETITEM,0,addr lvi

invoke MessageBox,0, addr buffer,addr AppName,MB_OK

ret

ShowCurrentFocus endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.if uMsg==WM_CREATE

invoke CreateWindowEx, NULL, addr ListViewClassName, NULL, LVS_REPORT+WS_CHILD+WS_VISIBLE, 0,0,0,0,hWnd, NULL, hInstance, NULL

mov hList, eax

invoke InsertColumn

invoke FillFileInfo

RGB 255,255,255

invoke SendMessage,hList,LVM_SETTEXTCOLOR,0,eax

RGB 0,0,0

invoke SendMessage,hList,LVM_SETBKCOLOR,0,eax

RGB 0,0,0

invoke SendMessage,hList,LVM_SETTEXTBKCOLOR,0,eax

invoke GetMenu,hWnd

mov hMenu,eax

invoke CheckMenuRadioItem,hMenu,IDM_ICON,IDM_LIST, IDM_REPORT,MF_CHECKED

.elseif uMsg==WM_COMMAND

.if lParam==0

invoke GetWindowLong,hList,GWL_STYLE

and eax,not LVS_TYPEMASK

mov edx,wParam

and edx,0FFFFh

push edx

or eax,edx

invoke SetWindowLong,hList,GWL_STYLE,eax

pop edx

invoke CheckMenuRadioItem,hMenu,IDM_ICON,IDM_LIST, edx,MF_CHECKED

.endif

.elseif uMsg==WM_NOTIFY

push edi

mov edi,lParam

assume edi:ptr NMHDR

mov eax,[edi].hwndFrom

.if eax==hList

.if [edi].code==LVN_COLUMNCLICK

assume edi:ptr NM_LISTVIEW

.if [edi].iSubItem==1

.if SizeSortOrder==0 || SizeSortOrder==2

invoke SendMessage,hList,LVM_SORTITEMS,1,addr CompareFunc

invoke UpdatelParam

mov SizeSortOrder,1

.else

invoke SendMessage,hList,LVM_SORTITEMS,2,addr CompareFunc

invoke UpdatelParam

mov SizeSortOrder,2

.endif

.else

.if FileNameSortOrder==0 || FileNameSortOrder==4

invoke SendMessage,hList,LVM_SORTITEMS,3,addr CompareFunc

invoke UpdatelParam

mov FileNameSortOrder,3

.else

invoke SendMessage,hList,LVM_SORTITEMS,4,addr CompareFunc

invoke UpdatelParam

mov FileNameSortOrder,4

.endif

.endif

assume edi:ptr NMHDR

.elseif [edi].code==NM_DBLCLK

invoke ShowCurrentFocus

.endif

.endif

pop edi

.elseif uMsg==WM_SIZE

mov eax,lParam

mov edx,eax

and eax,0ffffh

shr edx,16

invoke MoveWindow,hList, 0, 0, eax,edx,TRUE

.elseif uMsg==WM_DESTROY

invoke PostQuitMessage,NULL

.else

invoke DefWindowProc,hWnd,uMsg,wParam,lParam

ret

.endif

xor eax,eax

ret

WndProc endp

end start

分析:

當(dāng)主窗口創(chuàng)建后要做的第一件事是創(chuàng)建一個(gè)列表視圖控件應(yīng)用程序。

.if uMsg==WM_CREATE

invoke CreateWindowEx, NULL, addr ListViewClassName, NULL, LVS_REPORT+WS_CHILD+WS_VISIBLE, 0,0,0,0,hWnd, NULL, hInstance, NULL

mov hList, eax

我們調(diào)用CreateWindowEx來(lái)創(chuàng)建窗口,并把窗口類(lèi)的名稱(chēng)“SysListView32”傳給它。缺省的顯示方式是報(bào)告方式,因?yàn)槟付薒VS_REPORT標(biāo)志作為它的風(fēng)格。

invoke InsertColumn

創(chuàng)建列表視圖控件后,我們向其中插入列。

LOCAL lvc:LV_COLUMN

mov lvc.imask,LVCF_TEXT+LVCF_WIDTH

mov lvc.pszText,offset Heading1

mov lvc.lx,150

invoke SendMessage,hList, LVM_INSERTCOLUMN, 0, addr lvc

我們指定第一列的寬度和列的標(biāo)題條,為了在該列中顯示文件的名稱(chēng),我們需要在LV_COLUMN 型結(jié)構(gòu)體變量的成員變量iMask中設(shè)定標(biāo)志位LVCF_TEXT 或 LVCF_WIDTH。我們?cè)O(shè)定pszText為列標(biāo)題條文本字符串的值,lx設(shè)定為列的寬度(以像素點(diǎn)為單位)。然后我們發(fā)送LVM_INSERTCOLUMN消息給列表視圖控件,并把該結(jié)構(gòu)體變量傳遞給它。

or lvc.imask,LVCF_FMT

mov lvc.fmt,LVCFMT_RIGHT

插入完第一列后,我們?cè)俨迦氲诙?#xff0c;單擊該列的標(biāo)題條可以按文件的大小排序。因?yàn)槲覀冃枰覍?duì)齊文本,我們需要在成員變量fmt中指定標(biāo)志位LVCFMT_RIGHT。我們還必須在成員變量iMask中除了標(biāo)志位LVCF_TEXT 和 LVCF_WIDTH外還需要指定標(biāo)志位LVCF_FMT。

mov lvc.pszText,offset Heading2

mov lvc.lx,100

invoke SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvc

剩余的代碼比較簡(jiǎn)單。在pszText中放入文本字符串的地址,在lx中放入列的寬度。然后發(fā)送消息LVM_INSERTCOLUMN 給列表視圖控件,在參數(shù)中同時(shí)傳遞列號(hào)和結(jié)構(gòu)體變量的地址。

當(dāng)插入完列后,我們向列表控件中加入項(xiàng)目。

invoke FillFileInfo

FillFileInfo 的代碼如下:

FillFileInfo proc uses edi

LOCAL finddata:WIN32_FIND_DATA

LOCAL FHandle:DWORD

invoke FindFirstFile,addr FileNamePattern,addr finddata

我們調(diào)用FindFirstFile來(lái)得到第一個(gè)符合搜索標(biāo)準(zhǔn)的的文件的信息。FindFirstFile函數(shù)的原型如下

FindFirstFile proto pFileName:DWORD, pWin32_Find_Data:DWORD

pFileName 是用來(lái)匹配搜索的文件名的地址。該字符串包含了通配符。在我們的例子中是*.*,這樣會(huì)搜索當(dāng)前文件夾中所有的文件。

pWin32_Find_Data 是WIN32_FIND_DATA 型的結(jié)構(gòu)體變量的地址,WIN32_FIND_DATA型的結(jié)構(gòu)體變量將用來(lái)保存返回的文件的信息。

如果沒(méi)有找到匹配的文件,該函數(shù)將在eax中返回INVALID_HANDLE_VALUE 。否則將返回一個(gè)搜索句柄,您可以用該句柄在FindNextFile函數(shù)中來(lái)搜索下一個(gè)符合條件的文件。

.if eax!=INVALID_HANDLE_VALUE

mov FHandle,eax

xor edi,edi

如果找到了一個(gè)文件,我們?cè)谝粋€(gè)變量中保存搜索句柄,并把寄存器edi清零,該寄存器將用作項(xiàng)目的索引號(hào)。

.while eax!=0

test finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY

.if ZERO?

在本課中,我們將不處理文件夾,所以我們檢查dwFileAttributes成員變量的值是否有FILE_ATTRIBUTE_DIRECTORY 標(biāo)志,如果有,我們就忽略掉它,然后調(diào)用FindNextFile。

invoke ShowFileInfo,edi, addr finddata

inc edi

.endif

invoke FindNextFile,FHandle,addr finddata

.endw

我們調(diào)用ShowFileInfo函數(shù)包文件的名稱(chēng)和大小信息加到列表視圖控件中去。然后讓edi寄存器加一來(lái)增加項(xiàng)目的行號(hào)。最后我們調(diào)用FindNextFile函數(shù)在當(dāng)前文件夾中繼續(xù)搜索文件一直到該函數(shù)返回0為止(這意味著沒(méi)有可供搜索的文件了)。

invoke FindClose,FHandle

.endif

ret

FillFileInfo endp

當(dāng)前文件夾中的文件枚舉完畢后,我們必須關(guān)閉搜索句柄。

先在我們看一下ShowFileInfo函數(shù)。該函數(shù)由兩個(gè)參數(shù),一個(gè)是項(xiàng)目的索引號(hào)(也即行號(hào)),另一個(gè)是WIN32_FIND_DATA型結(jié)構(gòu)體變量的地址。

ShowFileInfo proc uses edi row:DWORD, lpFind:DWORD

LOCAL lvi:LV_ITEM

LOCAL buffer[20]:BYTE

mov edi,lpFind

assume edi:ptr WIN32_FIND_DATA

把WIN32_FIND_DATA 型結(jié)構(gòu)體變量的值放到寄存器edi中。

mov lvi.imask,LVIF_TEXT+LVIF_PARAM

push row

pop lvi.iItem

mov lvi.iSubItem,0

我們將傳遞項(xiàng)目的名稱(chēng)和lParam的值,所以我們?cè)趇Mask中放入標(biāo)志位LVIF_TEXT 和LVIF_PARAM。接下來(lái)我們?cè)趇Item中放入傳遞進(jìn)來(lái)的行號(hào),另外由于這是主項(xiàng)目我們必須設(shè)置iSubItem的值等于0。

lea eax,[edi].cFileName

mov lvi.pszText,eax

push row

pop lvi.lParam

我們現(xiàn)在要把標(biāo)簽字符串的地址,在這里也就是WIN32_FIND_DATA 型結(jié)構(gòu)體變量中的文件的名稱(chēng)放到pszText中。由于我們要完成對(duì)項(xiàng)目的排序,所以必須設(shè)置lParam的值,我把它設(shè)成行號(hào)值,這樣我們可以根據(jù)索引值來(lái)查詢(xún)項(xiàng)目。

invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi

設(shè)置完所有LV_ITEM型變量中的值后,我們發(fā)送LVM_INSERTITEM消息給列表視圖控件來(lái)把項(xiàng)目插入到其中。

mov lvi.imask,LVIF_TEXT

inc lvi.iSubItem

invoke wsprintf,addr buffer, addr template,[edi].nFileSizeLow

lea eax,buffer

mov lvi.pszText,eax

我們將把子項(xiàng)目插入到第二列。一個(gè)子項(xiàng)目只能有一個(gè)標(biāo)簽。這樣我們?cè)趇Mask中指定LVIF_TEXT標(biāo)志位。接著我們指定子項(xiàng)目所在的列,本例中我們通過(guò)將iSubItem加一使得該值等于1。標(biāo)簽值是文件的大小,為了轉(zhuǎn)換成文本我們調(diào)用wsprintf函數(shù),然后把文本的地址放到pszText中去。

invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi

assume edi:nothing

ret

ShowFileInfo endp

當(dāng)LV_ITEM型變量中的值設(shè)定好之后,我們向列表視圖控件發(fā)送LVM_SETITEM消息,并一同把LV_ITEM變量的地址傳過(guò)去。注意:發(fā)送的消息是LV_ITEM而不是LVM_INSERTITEM,因?yàn)槲覀儾迦氲氖亲禹?xiàng)目,子項(xiàng)目不是真正的項(xiàng)目而是主項(xiàng)目的屬性。所以我們這時(shí)是在設(shè)定項(xiàng)目的屬性,而不是加入一個(gè)項(xiàng)目。

當(dāng)所有的項(xiàng)目都插入到列表視圖控件后,我們?cè)O(shè)定它的文本和背景顏色。

RGB 255,255,255

invoke SendMessage,hList,LVM_SETTEXTCOLOR,0,eax

RGB 0,0,0

invoke SendMessage,hList,LVM_SETBKCOLOR,0,eax

RGB 0,0,0

invoke SendMessage,hList,LVM_SETTEXTBKCOLOR,0,eax

我們用RGB(R---Red G---Green B---Blue)來(lái)把三色轉(zhuǎn)換并放到eax中。我們通過(guò)發(fā)送LVM_SETTEXTCOLOR 和 LVM_SETTEXTBKCOLOR 消息來(lái)設(shè)定文本的前景和背景色。

invoke GetMenu,hWnd

mov hMenu,eax

invoke CheckMenuRadioItem,hMenu,IDM_ICON,IDM_LIST, IDM_REPORT,MF_CHECKED

我們將讓用戶(hù)通過(guò)菜單來(lái)選擇它想要的顯示方式。這樣我們必須先得到菜單的句柄。我了讓用戶(hù)跟蹤當(dāng)前的視圖,我們?cè)诓藛沃蟹湃胍唤M單選按鈕。我們可以調(diào)用CheckMenuRadioItem函數(shù),該函數(shù)將把一個(gè)單選按鈕放到一個(gè)菜單項(xiàng)前。

注意我們創(chuàng)建列表視圖控件時(shí)把它的寬度和高度都設(shè)成為0。當(dāng)父窗口改變大小時(shí),它將同時(shí)改變大小。這樣我們可以讓列表視圖總是隨著主窗口改變。子我們的例子中,我們讓列表視圖填充整個(gè)客戶(hù)區(qū)。

.elseif uMsg==WM_SIZE

mov eax,lParam

mov edx,eax

and eax,0ffffh

shr edx,16

invoke MoveWindow,hList, 0, 0, eax,edx,TRUE

當(dāng)父窗口接收到了WM_SIZE消息后,lParam的底字部分包含了客戶(hù)區(qū)新的寬和高。讓后我們調(diào)用MoveWindow來(lái)改變列表視圖控件的大小使得它覆蓋整個(gè)的客戶(hù)區(qū)。

當(dāng)用戶(hù)通過(guò)菜單選擇了一種選擇方式,我們必須相應(yīng)地改變列表視圖中的顯示方式。我們調(diào)用SetWindowLong函數(shù)來(lái)設(shè)定新的風(fēng)格。

.elseif uMsg==WM_COMMAND

.if lParam==0

invoke GetWindowLong,hList,GWL_STYLE

and eax,not LVS_TYPEMASK

首先得到當(dāng)前的風(fēng)格,然后清除舊的風(fēng)格。LVS_TYPEMASK 是LVS_ICON+LVS_SMALLICON+LVS_LIST+LVS_REPORT四種風(fēng)格的集合。這樣當(dāng)我們用當(dāng)前的風(fēng)格“與”“not LVS_TYPEMASK”就等于清除了當(dāng)前的顯示風(fēng)格。

在設(shè)計(jì)菜單時(shí),我們使用了一些小技巧。我們包顯示風(fēng)格的常數(shù)串當(dāng)作菜單的ID號(hào)。

IDM_ICON equ LVS_ICON

IDM_SMALLICON equ LVS_SMALLICON

IDM_LIST equ LVS_LIST

IDM_REPORT equ LVS_REPORT

這樣當(dāng)父窗口接收到WM_COMMAND消息時(shí),希望顯示的風(fēng)格值會(huì)當(dāng)成菜單的ID號(hào)傳遞過(guò)來(lái)。

mov edx,wParam

and edx,0FFFFh

在wParam中的低字部分是欲顯示的風(fēng)格,我們所需要做的只是把高字部分清0。

push edx

or eax,edx

我們把希望顯示的風(fēng)格加到列表視圖的風(fēng)格中去(已經(jīng)去除了舊的風(fēng)格)。

invoke SetWindowLong,hList,GWL_STYLE,eax

調(diào)用SetWindowLong函數(shù)來(lái)設(shè)定新的風(fēng)格。

pop edx

invoke CheckMenuRadioItem,hMenu,IDM_ICON,IDM_LIST, edx,MF_CHECKED

.endif

我們需要在被選擇的顯示方式前放入單選按鈕。如果要排序,我們必須處理WM_NOTIFY消息。

.elseif uMsg==WM_NOTIFY

push edi

mov edi,lParam

assume edi:ptr NMHDR

mov eax,[edi].hwndFrom

.if eax==hList

當(dāng)我們接收到了WM_NOTIFY 消息后,lParam包含了指向NMHDR型結(jié)構(gòu)體變量的指針。我們通過(guò)把列表視圖控件的值和NMHDR型結(jié)構(gòu)體變量中的hwndFrom成員變量的值比較來(lái)判斷,如果相等的話我們就可以確定消息是列表視圖控件發(fā)送的。

.if [edi].code==LVN_COLUMNCLICK

assume edi:ptr NM_LISTVIEW

如果通知消息是列表視圖控件發(fā)送的,我們檢測(cè)該消息是否是LVN_COLUMNCLICK。如果是,它意味著用戶(hù)點(diǎn)擊了列標(biāo)題條。在接收到LVN_COLUMNCLICK消息后,我們假設(shè)lParam參數(shù)包含NM_LISTVIEW型結(jié)構(gòu)體變量的指針,NM_LISTVIEW型結(jié)構(gòu)體是NMHDR型結(jié)構(gòu)體的擴(kuò)展。我們需要知道用戶(hù)單擊了那一列,在iSubItem中的值即是列號(hào),列的編號(hào)是從0開(kāi)始的。

.if [edi].iSubItem==1

.if SizeSortOrder==0 || SizeSortOrder==2

在這里iSubItem的值是1,它表示用戶(hù)點(diǎn)擊的是第二列,即文件的大小。我們用狀態(tài)變量來(lái)保持當(dāng)前的排序順序。0代表不用排序,1代表升序,2代表降序。如果該列中的項(xiàng)目/子項(xiàng)目以前沒(méi)有排序或?yàn)榻敌?#xff0c;我們就把它設(shè)成升序。

invoke SendMessage,hList,LVM_SORTITEMS,1,addr CompareFunc

我們發(fā)送消息LVM_SORTITEMS給列表視圖控件,在wParam中傳遞1,在lParam中傳遞比較函數(shù)的參數(shù)。注意wParam中的值是用戶(hù)定義的,用戶(hù)可以按自己的需要來(lái)解釋,這里我們把它用作排序的方法。我們先來(lái)看看比較函數(shù):

CompareFunc proc uses edi lParam1:DWORD, lParam2:DWORD, SortType:DWORD

LOCAL buffer[256]:BYTE

LOCAL buffer1[256]:BYTE

LOCAL lvi:LV_ITEM

mov lvi.imask,LVIF_TEXT

lea eax,buffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

列表視圖控件將傳遞需要比較的兩個(gè)項(xiàng)目的lParam(LV_ITEM型結(jié)構(gòu)體變量的成員變量)比較函數(shù)。您還記得嗎?我們?cè)趌Param中放置了醒目的索引號(hào)。這樣我們利用這些索引號(hào)查詢(xún)列表視圖來(lái)得到項(xiàng)目信息。我們需要的消息是項(xiàng)目/子項(xiàng)目的標(biāo)簽文本。為此我們準(zhǔn)備好LV_ITEM 型結(jié)構(gòu)體變量并在iMask中設(shè)置標(biāo)志位LVIF_TEXT ,在pszText中設(shè)置緩沖區(qū)的地址,在cchTextMax中設(shè)置緩沖區(qū)的大小。

.if SortType==1

mov lvi.iSubItem,1

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi

如果SortType的值為1或2,我們知道點(diǎn)擊了那一列,1代表根據(jù)文件的大小按升序排列所有的項(xiàng)目。2的意思相反。這樣我們指定iSubItem為1(代表文件大小列)然后發(fā)送LVM_GETITEMTEXT 消息給列表視圖控件來(lái)得到在項(xiàng)目的標(biāo)簽文本串。

invoke String2Dword,addr buffer

mov edi,eax

調(diào)用子定義的String2Dword函數(shù)來(lái)把字符串轉(zhuǎn)換成一個(gè)DWORD值。它將在eax中返回轉(zhuǎn)換后的值,我們把它保存在edi中以便以后比較用。

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi

invoke String2Dword,addr buffer

sub edi,eax

mov eax,edi

對(duì)lParam2 中的值做同樣的操作。當(dāng)我們得到了兩個(gè)文件的大小后,就可以比較它們了。比較的規(guī)則如下:

如果第一個(gè)項(xiàng)目放在前面,在eax中返回一個(gè)負(fù)值

如果第二個(gè)項(xiàng)目放在前面,在eax中返回一個(gè)正值

如果相等,在eax中返回0

在我們這里,我們想按升序排列,所以我們只要簡(jiǎn)單地將第二個(gè)項(xiàng)目的文件大小減去第一個(gè)項(xiàng)目的文件大小,然后返回放在eax中的值。

.elseif SortType==3

mov lvi.iSubItem,0

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi

invoke lstrcpy,addr buffer1,addr buffer

invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi

invoke lstrcmpi,addr buffer1,addr buffer

當(dāng)用戶(hù)點(diǎn)擊文件名字列時(shí),我們必須比較文件的名字。我們先得到文件的名字,然后調(diào)用lstrcmpi函數(shù)來(lái)比較,然后只要簡(jiǎn)單返回lstrcmpi的值,因?yàn)樵摵瘮?shù)比較使用的規(guī)則和我們的相同。

當(dāng)項(xiàng)目排序后,我們調(diào)用UpdateParam函數(shù)來(lái)更新所有項(xiàng)目的lParam的值來(lái)反應(yīng)出最新的改變。

invoke UpdatelParam

mov SizeSortOrder,1

該函數(shù)簡(jiǎn)單地枚舉列表視圖中所有的項(xiàng)目并且把它們lParam更新成項(xiàng)目的索引號(hào)。

.elseif [edi].code==NM_DBLCLK

invoke ShowCurrentFocus

.endif

如果用戶(hù)雙擊某個(gè)項(xiàng)目時(shí),我們將顯示一個(gè)消息框,上面有該項(xiàng)目的有關(guān)標(biāo)簽值。我們必須檢查NMHDR 中的code值是否是 NM_DBLCLK。如果是,我們就得到它的標(biāo)簽值并顯示在一個(gè)消息框中。

ShowCurrentFocus proc

LOCAL lvi:LV_ITEM

LOCAL buffer[256]:BYTE

invoke SendMessage,hList,LVM_GETNEXTITEM,-1, LVNI_FOCUSED

我們是增么怎么知道某個(gè)項(xiàng)目被雙擊的呢?當(dāng)單擊或雙擊某個(gè)項(xiàng)目時(shí),它的狀態(tài)被設(shè)成“焦點(diǎn)”。即使有多個(gè)項(xiàng)目被選中,也僅有一個(gè)項(xiàng)目有焦點(diǎn)。我們的工作就是去找到那個(gè)有焦點(diǎn)的項(xiàng)目。我們發(fā)送LVM_GETNEXTITEM消息給列表視圖控件,在lParam中指定期望的狀態(tài)。如果wParam中時(shí)-1的話,表示要搜索所有的項(xiàng)目。有焦點(diǎn)的項(xiàng)目第索引號(hào)在eax中返回。

mov lvi.iItem,eax

mov lvi.iSubItem,0

mov lvi.imask,LVIF_TEXT

lea eax,buffer

mov lvi.pszText,eax

mov lvi.cchTextMax,256

invoke SendMessage,hList,LVM_GETITEM,0,addr lvi

發(fā)送LVM_GETITEM消息來(lái)得到標(biāo)簽。

invoke MessageBox,0, addr buffer,addr AppName,MB_OK

最后我們?cè)谝粋€(gè)消息框中顯示標(biāo)簽。

如果想在列表視圖控件中顯示圖標(biāo),您可以閱讀關(guān)于樹(shù)型視圖控件的課程。它們的步驟基本上是一樣的。

總結(jié)

以上是生活随笔為你收集整理的linux sort -w32,WIN32汇编: 31.列表视图控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。