PC技術(shù)輔導(dǎo):列表視圖控件

字號(hào):

本課中我們將學(xué)習(xí)如何創(chuàng)建和使用列表視圖控件。
    理論:
    列表視圖控件和樹型視圖、豐富文本編輯控件一樣是通用控件的一種??赡苣家呀?jīng)知道了列表視圖控件,只不過是不知道它的確切名字而已。列表視圖控件可以用來很好地顯示項(xiàng)目。在這方面它和列表框相同,只不過它的性能更強(qiáng)。
    有兩種方法創(chuàng)建一個(gè)列表視圖控件。第一種也是簡單的方法是:用資源編輯器來創(chuàng)建它。用該種方法只是不要忘記在您的代碼(的任何位置處)加入對InitCommonControls函數(shù)的調(diào)用(記得嗎,調(diào)用該函數(shù)只是為了隱式地加載包含通用控件的DLL)。另一種方法是調(diào)用CreateWindowEx函數(shù),這里您必須指定合適的類名,譬如:SysListView32,WC_LISTVIEW不是正確的類名
    在列表視圖種有四種方法來顯示數(shù)據(jù):大圖標(biāo),小圖標(biāo),列表和報(bào)告方式。這些方法和在資源管理器種選擇View->Large Icons,Small Icons , List 和 Details 相對應(yīng)。各種不同的顯示方式只是顯示了不同的外觀而已。譬如,您可能有許多的數(shù)據(jù),只是并不想全部顯示?!?bào)告方式提供的消息完全,其它的方式則要少得多。在剛創(chuàng)建一個(gè)列表視圖時(shí)您可以選擇一種初始顯示方法,隨后您可以調(diào)用SetWinodwLong函數(shù)并設(shè)置GWL_STYLE標(biāo)志位來改變顯示方式
    既然我們已經(jīng)知道了如何創(chuàng)建列表控件,接下來我們學(xué)習(xí)如何使用它們。我們將主要集中在報(bào)告方式的顯示上,因?yàn)樵摲N方式演示了多的列表控制的特性。使用列表控制的步驟如下:
    調(diào)用CreateWindowEx函數(shù)來創(chuàng)建一個(gè)列表控件,指定它的類名為SysListView32。您還可以在此處指定控件初次顯示時(shí)的方式。
    創(chuàng)建和初始化用在列表控件中顯示項(xiàng)目的圖象列表(如果存在)。
    向列表控件中插入列,如果顯示的方式是報(bào)告方式這一步是必須的。
    向控件中插入項(xiàng)目和自項(xiàng)目。
    列:
    在報(bào)告方式中,有不止一個(gè)列。您可以把放入到列表控件中的數(shù)據(jù)看作是一張表單:這時(shí)數(shù)據(jù)是按行列排列的。在控件中至少有一列。在其它的顯示方式中則無所謂,因?yàn)檫@些顯示方式有僅有一列。
    加入列要通過向列表控件發(fā)送LVM_INSERTCOLUMN消息來實(shí)現(xiàn)。
    LVM_INSERTCOLUMN
    wParam = iCol
    lParam =指向LV_COLUMN型結(jié)構(gòu)體變量的指針
    iCol 列數(shù),從0開始編號(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)體可以用來輸入和輸出。這樣讓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)目的對齊方式。可能的值有:
    LVCFMT_CENTER = 文本居中
    LVCFMT_LEFT = 文本左對齊
    LVCFMT_RIGHT = 文本右對齊
    lx lx 是列的寬度(以像素點(diǎn)為單位)。以后您可以發(fā)送消息LVM_SETCOLUMNWIDTH來改變列的寬度。
    pszText 如果用來設(shè)定列的屬性時(shí),該成員變量為指向列名的指針。如果是查詢列名,該成員變量指向一個(gè)足夠大的緩沖區(qū),用來接收返回的列名,這是您必須在成員cchTextMax中指定緩沖區(qū)的大小。如果是設(shè)定列名時(shí),可以忽略該變量,因?yàn)樵撝羔樦赶虻氖且粋€(gè)ASCII碼的字符串,而WINDOWS可以解析出ASCII串的長度。
    cchTextMax cchTextMax 以字節(jié)計(jì)的上面一個(gè)成員變量指向的緩沖區(qū)的小。該成員變量只在您查詢列的屬性時(shí)使用。如果是設(shè)定列的屬性,那該變量將被忽略。
    iSubItem 指定和該列相連的子項(xiàng)目的索引號(hào)。該成員變量的值用來標(biāo)識(shí)和列相連系的子項(xiàng)目。該列的使用好地說明了如何把列號(hào)和子項(xiàng)目相連。要查詢列的屬性時(shí)可以發(fā)送LVM_GETCOLUMN消息,并在成員變量imask中指定LVCF_SUBITEM標(biāo)志,列表控件將在iSubItem中返回插入時(shí)設(shè)定的iSubItem值。為了使用該辦法,您需要在該成員變量中放入正確的值。
    iImage and iOrder 為了和IE3.0以上版本兼容。目前我沒有這方面的資料。
    在列表視圖控件創(chuàng)建后,您必須至少向其中插入一列。當(dāng)然如果不打算使用報(bào)告方式顯示,那倒是沒有必要插入列。為了插入列,您需要定義一個(gè)LV_COLUMN型的結(jié)構(gòu)體變量,給其成員變量賦上正確的值,指定列號(hào),然后向列表視圖控件發(fā)送LVM_INSERTCOLUMN消息并把該結(jié)構(gòu)體變量的值傳過去。
    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
    上面的代碼段顯示了該過程。當(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ù)庫記錄的角度看,項(xiàng)目類似主鍵,子項(xiàng)目類似記錄。
    至少您的列表視圖需要一些項(xiàng)目:子項(xiàng)目是可選的。如果您想要給用戶提供更多的信息,可以把子項(xiàng)目和項(xiàng)目相連,然后放到列表視圖中以報(bào)告的方式顯示。
    您可以通過向列表視圖發(fā)送LVM_INSERTITEM消息來向其中添加項(xiàng)目,這時(shí)還需要把一個(gè)指向LV_ITEM型的結(jié)構(gòu)體的變量的指針放到lParam一同傳給列表視圖。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