本課中我們將學(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)。各種不同的顯示方式只是顯示了不同的外觀(guān)而已。譬如,您可能有許多的數(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有效
_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ì)齊方式??赡艿闹涤校?BR> 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
理論:
列表視圖控件和樹(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)。各種不同的顯示方式只是顯示了不同的外觀(guān)而已。譬如,您可能有許多的數(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有效
_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ì)齊方式??赡艿闹涤校?BR> 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