列表控制項可以看作是功能增強的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");
此外clistctrl還提供了一些函式用於得到/修改控制項的狀態。
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_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);得到選中項位置。
一、基本使用
1.新加listcontrol 控制項,屬性中的style屬性頁下的view選擇report。
並設定其對應的控制變數如:m_list1。
2.初始化,即設定列。 用m_list1。
m_list1.insertcolumn(0,"曲名"); //插入列
m_list1.insertcolumn(1,"型別");
m_list1.insertcolumn(2,"長度");
m_list1.insertcolumn(3,"路徑");
crect rect4;
m_list1.getclientrect(rect4); //獲得當前客戶區資訊
m_list1.setcolumnwidth(0,rect4.width()/4); //設定列的寬度。
m_list1.setcolumnwidth(1,rect4.width()/5);
m_list1.setcolumnwidth(2,rect4.width()/5);
m_list1.setcolumnwidth(3,rect4.width()*8/20);
這部分初始化操作,最好放在對話方塊類的oninitdialog()函式裡,自動初始化。
3.插入資料
m_list1.insertitem(0,"大海"); //插入第乙個資料,即第0條資料。先插入,然後在修改其他的資訊。
m_list1.setitemtext(0,1,"***"); //修改第0條資料的其他資訊。
m_list1.setitemtext(0,2,"4:20");
m_list1.setitemtext(0,3,"c:\");
4.刪除所有資料
m_list1.deleteallitems();
5.補充:
特別注意的地方是,在插入新項(記錄)的時候,使用m_list1.getitemcount()獲取當前報表中的專案總數。但是m_list1.insertitem()函式呼叫時候不能使用m_list1.getitemcount()+1。因為專案是從0
開始計數的。
二、其他技巧
1.如何設定listview控制項的完全行(full row)選項。
這個控制項有個地方常常很惱人,那就是在報告檢視中選中一行時,它只加亮最左邊的乙個欄目。
為了克服這個問題,這裡告訴你乙個方法:向listview控制項傳送乙個lvm_setextendedlistviewstyle訊息。
::sendmessage(m_list1.m_hwnd, lvm_setextendedlistviewstyle,lvs_ex_fullrowselect, lvs_ex_fullrowselect);
C list使用方法
list泛型集合 集合是oop中的乙個重要概念,c 中對集合的全面支援更是該語言的精華之一。為什麼要用泛型集合?在c 2.0之前,主要可以通過兩種方式實現集合 a.使用arraylist 直接將物件放入arraylist,操作直觀,但由於集合中的項是object型別,因此每次使用都必須進行繁瑣的型別...
VC通用控制項程式設計之CList控制項
一 列表控制的主要功能 列表控制和視 list control view 主要用來以各種方式顯示一組 資料記錄供使用者進行各種操作,windows98 95中資源管理器中的 檢視 標籤下的 大圖示 小圖示 列表 詳細資源 就是乙個非常好的典型應用。列表中的記錄可以包括多個 資料項,也可以包括表示 資...
列表視控制項的使用方法
l 列表視 控制項list view 控制項也稱列表控制項,在需要以報表形式顯示資料時,列表視控制項是最好的選擇。區別於列表框,列表視控制項可顯示由多個子項組成的專案,並允許以多種方式顯示資訊。列表視控制項還可以為顯示的專案增加乙個圖示,但代表專案的圖示必須存 儲在乙個影象列表中。l 列表視控制項包...