ListControl控制項的使用方法

2021-06-23 06:57:27 字數 4601 閱讀 4797

列表控制項可以看作是功能增強的listbox,它提供了四種風格,而且可以同時顯

示一列的多種屬性值。mfc中使用clistctrl類來封裝列表控制項的各種操作。通

過呼叫bool create( dword dwstyle, const rect& rect, cwnd* pparentwnd, 

uint nid );建立乙個視窗,dwstyle中可以使用以下一些列表控制項的專用風格

: lvs_icon ,lvs_smallicon ,lvs_list, lvs_report 這四種風格決定控制項的外

觀,同時只可以選擇其中一種,分別對應:大圖示顯示,小圖示顯示,列表顯

示,詳細報表顯示。 

lvs_editlabels 結點的顯示字元可以被編輯,對於報表風格來講可編輯的只為

第一列。 

lvs_showselalways 在失去焦點時也顯示當前選中的結點 

lvs_singlesel 同時只能選中列表中一項 

首先你需要設定列表控制項所使用的imagelist,如果你使用大圖示顯示風格,你

就需要以如下形式呼叫: 

cimagelist* setimagelist( cimagelist* pimagelist, lvsil_normal); 

如果使用其它三種風格顯示而不想顯示圖示你可以不進行任何設定, 

否則需要以如下形式呼叫: 

cimagelist* setimagelist( cimagelist* pimagelist, lvsil_small); 

int insertitem( int nitem, lpctstr lpszitem );  插入行 

nitem:指明插入位置 

lpszitem:為顯示字元。 

除lvs_report風格外其他三種風格都只需要直接呼叫insertitem就可以了,但

如果使用報表風格就必須先設定列表控制項中的列資訊。 

int insertcolumn( int ncol, lpctstr lpszcolumnheading, int nformat , 

int nwidth, int nsubitem); 插入列 

icol:為列的位置,從零開始 

lpszcolumnheading:為顯示的列名 

nformat:為顯示對齊方式 

nwidth:為顯示寬度 

nsubitem:為分配給該列的列索引。 

bool setitemtext( int nitem, int nsubitem, lptstr lpsztext );設定每列

的顯示字元 

nitem:為行位置 

nsubitem:為列位置 

lpsztext:為顯示字元 

下面的**演示了如何設定多列並插入資料: 

m_list.setimagelist(&m_listsmall,lvsil_small);//設定imagelist 

m_list.insertcolumn(0,"col 1",lvcfmt_left,300,0);//設定列 

m_list.insertcolumn(1,"col 2",lvcfmt_left,300,1); 

m_list.insertcolumn(2,"col 3",lvcfmt_left,300,2); 

m_list.insertitem(0,"item 1_1");//插入行 

m_list.setitemtext(0,1,"item 1_2");//設定該行的不同列的顯示字元 

m_list.setitemtext(0,2,"item 1_3") 

colorref gettextcolor( )/bool settextcolor( colorref cr ):用於得到/

設定顯示的字元顏色。 

colorref gettextbkcolor( )/bool settextbkcolor( colorref cr ):用於得

到/設定顯示的背景顏色。 

void setitemcount( int icount ):用於得到新增進列表中項的數量。 

bool deleteitem(int nitem):用於刪除某一項 

bool deleteallitems( ):將刪除所有項。 

bool setbkimage(hbitmap hbm, bool ftile , int xoffsetpercent, int 

yoffsetpercent):用於設定背景位圖。 

cstring getitemtext( int nitem, int nsubitem ):用於得到某項的顯示字

符。 列表控制項的訊息對映同樣使用on_notify巨集,形式如同: 

on_notify( wnotifycode, id, memberfxn ), 

wnotifycode為通知**,id為產生該訊息的視窗id,memberfxn為處理函式, 

函式的原型如同void on***list(nmhdr* pnmhdr, lresult* presult), 

其中pnmhdr為一資料結構,在具體使用時需要轉換成其他型別的結構。

對於列表控制項可能取值和對應的資料結構為: 

lvn_beginlabeledit 在開始某項編輯字元時傳送,所用結構:nmlvdispinfo 

lvn_endlabeledit 在結束某項編輯字元時傳送,所用結構:nmlvdispinfo 

lvn_getdispinfo 在需要得到某項資訊時傳送,(如得到某項的顯示字元)所

用結構:nmlvdispinfo 

關於on_notify有很多內容,將在以後的內容中進行詳細講解。 

關於動態提供結點所顯示的字元: 

首先你在項時需要指明lpszitem引數為:lpstr_textcallback。 

在控制項顯示該結點時會通過傳送tvn_getdispinfo來取得所需要的字元,在處理

該訊息時先將引數pnmhdr轉換為lpnmlvdispinfo,然後填充其中item.psztext

。通過item中的iitem,isubitem可以知道當前顯示的為哪一項。 

下面的**演示了這種方法: 

char szout[8][3]=; 

//新增結點 

m_list.insertitem(lpstr_textcallback,...) 

m_list.insertitem(lpstr_textcallback,...) 

//處理訊息 

void cparentwnd::ongetdispinfolist(nmhdr* pnmhdr, lresult* presult) 

關於編輯某項的顯示字元:(在報表風格中只對第一列有效)首先需要設定列

表控制項的lvs_editlabels風格,在開始編輯時該控制項將會傳送

lvn_beginlabeledit,你可以通過在處理函式中返回true來取消接下來的編輯

,在編輯完成後會傳送lvn_endlabeledit,在處理該訊息時需要將引數pnmhdr

轉換為lpnmlvdispinfo,然後通過其中的item.psztext得到編輯後的字元,並

重置顯示字元。如果編輯在中途中取消該變數為null。

下面的**說明如何處理這些訊息: 

//處理訊息 lvn_beginlabeledit 

void cparentwnd::onbegineditlist(nmhdr* pnmhdr, lresult* presult) 

//處理訊息 lvn_beginlabeledit 

void cparentwnd::onbegineditlist(nmhdr* pnmhdr, lresult* presult) 

上面講述的方法所進行的訊息對映必須在父視窗中進行(同樣wm_notify的所有

訊息都需要在父視窗中處理)。 

如何得到當前選中項位置:在列表控制項中沒有乙個類似於listbox中getcursel

()的函式,但是可以通過呼叫getnextitem( -1, lvni_all | lvni_selected);

得到選中項位置。 

list control控制項中的風格選項: 

m_list1.setextendedstyle( 

lvs_ex_fullrowselect|lvs_ex_gridlines|lvs_ex_checkboxes ); 

lvs_ex_fullrowselect表示可以點中行中的任意乙個列選中這一條記錄 

lvs_ex_gridlines表示列之間有分隔符號 

lvs_ex_checkboxes 表示每一行第一列是checkbox 

lvcolumn:listviewcolumn 

設定表頭 

lvcolumn.mask = lvcf_subitem|lvcf_text|lvcf_width|lvcf_fmt;  設定表頭

風格 lvcolumn.fmt = lvcfmt_center;   設定表頭對齊方式 

lvcolumn.isubitem = i;              表頭列序 

lvcolumn.psztext = headertxt;    表頭名稱 

lvcolumn.cx = 90;                   表頭寬度 

m_list.insertcolumn(i,&lvcolumn);   插入列

MFC中ListControl控制項的使用

以下未經說明,listctrl預設view 風格為report lvs icon 為每個item顯示大圖示 lvs smallicon 為每個item顯示小圖示 lvs list 顯示一列帶有小圖示的item lvs report 顯示item詳細資料 直觀的理解 windows資源管理器,檢視 標...

MFC中ListControl控制項的使用

以下未經說明,listctrl預設view 風格為report lvs icon 為每個item顯示大圖示 lvs smallicon 為每個item顯示小圖示 lvs list 顯示一列帶有小圖示的item lvs report 顯示item詳細資料 直觀的理解 windows資源管理器,檢視 標...

MFC中ListControl控制項的使用

以下未經說明,listctrl預設view 風格為report lvs icon 為每個item顯示大圖示 lvs smallicon 為每個item顯示小圖示 lvs list 顯示一列帶有小圖示的item lvs report 顯示item詳細資料 直觀的理解 windows資源管理器,檢視 標...