1.動态生成清單控件。
在資源頁面裡,點選清單控件,然後在需要放置清單的地方拖拉就可以生成一個清單,檢視它的屬性->樣式,可以設定它的樣式,例如圖示,小圖示,清單,報告,單個選擇,自動排列,沒有标簽換行,編輯标簽 等等。 這種方法是靜态生成清單控件,程式運作時清單就已經生成了,如果我們需要動态生成清單控件,讓清單在我需要他生成的時候才生成,就要用CListCtrl::Create函數。 BOOL Create( DWORD dwStyle , const RECT& rect , CWnd* pParentWnd , UINT nID ); 其中參數dwStyle用來确定清單控制的風格;rect用來确定清單控制的大小和位置;pParentWnd用來确定清單控制的父視窗,通常是一個對話框;nID用來确定清單控制的辨別。其中清單控制的風格可以是下列值的組合: LVS_ALIGNLEFT 用來确定表項的大小圖示以左對齊方式顯示;
LVS_ALIGNTOP 用來确定表項的大小圖示以頂對齊方式顯示;
LVS_AUTOARRANGE 用來确定表項的大小圖示以自動排列方式顯示;
LVS_EDITLABELS 設定表項文本可以編輯,父視窗必須設有LVN_ENDLABELEDIT風格;
LVS_ICON 用來确定大圖示的顯示方式;
LVS_LIST 用來确定清單方式顯示;
LVS_NOCOLUMNHEADER 用來确定在詳細資料方式時不顯示清單頭;
LVS_NOLABELWRAP 用來确定以單行方式顯示圖示的文本項;
LVS_NOSCROLL 用來屏蔽滾動條;
LVS_NOSORTHEADER 用來确定清單頭不能用作按鈕功能;
LVS_OWNERDRAWFIXED 在詳細清單方式時允許自繪視窗;
LVS_REPORT 用來确定以詳細資料即報告方式顯示;
LVS_SHAREIMAGELISTS用來确定共享圖像清單方式;
LVS_SHOWSELALWAYS 用來确定一直顯示被選中表項方式;
LVS_SINGLESEL 用來确定在某一時刻隻能有一項被選中;
LVS_SMALLICON 用來确定小圖示顯示方式;
LVS_SORTASCENDING 用來确定表項排序時是基于表項文本的升序方式;
LVS_SORTDESCENDING 用來确定表項排序時是基于表項文本的降序方式; 以上的風格其實就是靜态生成清單控件時 “屬性->樣式” 标簽裡的内容。如果清單控件建立完之後我們需要修改他的樣式,就可以用GetWindowLong來擷取CListCtrl已有的樣式,然後用SetWindowLong來修改樣式。 2.設定擴充樣式。 除了上面的哪些基本樣式,CListctrl還有更多的擴充樣式,如果我們要添加或删除擴充樣式,就不是像基本樣式那樣用SetWindowLong了,CListctrl提供了一個函數CListCtrl::SetExtendedStyle,這個函數可以添加或删除擴充樣式,相應的要獲得CListctrl的擴充樣式,應該使用CListCtrl::GetExtendedStyle,而不是GetWindowLong。 DWORD SetExtendedStyle( DWORD dwNewStyle ); DWORD dwNewStyle 就是你要設定的樣式咯,可以是以下值的組合(抄别人的不知道完不完整): CListCtrl控件的擴充樣式
LVS_EX_GRIDLINES //繪制表格線
LVS_EX_SUBITEMIMAGES//子項目圖示清單
LVS_EX_CHECKBOXES //帶複選框
LVS_EX_TRACKSELECT //自動換行
LVS_EX_HEADERDRAGDROP//報表頭可以拖拽
LVS_EX_FULLROWSELECT //選擇整行
LVS_EX_ONECLICKACTIVATE//單擊激活
LVS_EX_TWOCLICKACTIVATE//輕按兩下激活
LVS_EX_FLATSB//扁平滾動條
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作區 3.添加列 與 删除列 清單控件建立好之後,就要為他添加列了,使用CListCtrl::InsertColumn函數為它添加列。要删除一列,使用CListCtrl::DeleteColumn函數。 int InsertColumn( int nCol , LPCTSTR lpszColumnHeading , int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 ); iCol:為列的位置,從零開始
lpszColumnHeading:為顯示的列名
nFormat:為顯示對齊方式
nWidth:為顯示寬度
nSubItem:為配置設定給該列的列索引。這個參數有什麼作用至今不懂,希望懂的朋友告訴我。 例如: InsertColumn(3,"所在區域",LVCFMT_LEFT,60); 即添加一個名字為“所在區域”的列,名字靠左排列,列的長度為60,這個列是第四列(從0開始算)。 4.添加行 與 删除行。 添加行即是添加記錄咯,一行就是一條記錄。使用CListCtrl::InsertItem函數來添加行。要删除一行,使用CListCtrl::DeleteItem函數,注意,如果你删除的行不是最後一行,那麼删除後下面的行會自動上移填補删除行的空間。要删除全部行,使用CListCtrl::DeleteAllItems。 int InsertItem( int nItem , LPCTSTR lpszItem ); nItem :行的索引,從0開始計算。 lpszItem :行的名稱,一般為0或者""(即不需要為行添加名稱)。如果為他指派一個字元串,實際效果是該字元串 會成為該行的第一列的内容。 例如 InsertItem( 5, 0) 即在行索引5的位置添加一行(即是第六行)。 5.設定某行某列的内容 與 擷取某行某列的内容。 如果要設定某行某列的内容。使用CListCtrl::SetItemText函數。 BOOL SetItemText( int nItem , int nSubItem , LPTSTR lpszText ); nItem :行的索引,從0開始。 nSubItem :列的索引,從0開始。 lpszText :要填充的内容。 例如 SetItemText(6,3,"hello"); 即設定第7行,第4列的内容為“hello”。 相反地,如果我們要提取某行某列的内容,使用CListCtrl::GetItemText函數。 CString GetItemText( int nItem , int nSubItem ) const; nItem :行的索引,從0開始。 nSubItem :列的索引,從0開始。 例如 CString text; text=GetItemText(6,3); 提取第7行,第4列的内容并賦給text。 6.擷取一列的屬性和設定一列的屬性。 如果要擷取某列的屬性,譬如說某列的列名、列的長度。就要用CListCtrl::GetColumn函數。 BOOL GetColumn( int nCol , LVCOLUMN* pColumn ) const; nCol :列的索引,從0開始。 pColumn :指向LVCOLUMN結構體的指針。該LVCOLUMN結構體就是用來儲存得到的列屬性資訊的。 LVCOLUMN結構體有一個成員變量 mask ,你必須為這個變量指派,用來指定你要擷取什麼屬性,譬如說你要擷取某列的長度,你就必須為mask指派LVCF_WIDTH,如果你要擷取某列的列名,就必須為mask指派LVCF_TEXT。從MSDN中還有這樣的描述:If the mask member specifies the LVCF_TEXT value, the pszText member must contain the address of the buffer that receives the item text and the cchTextMax member must specify the size of the buffer. 意思是說如果你要擷取的屬性是列名,就必須為LVCOLUMN結構體的pszText變量指定一個buf的位址,這個buf用來接收列名,還要為LVCOLUMN結構體的cchTextMax變量指定這個buf的大小。 下面的例子表示要擷取第3列的列名和列長度: LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT;
char name[20];
lvc.pszText=name;
lvc.cchTextMax=20;
m_listctrl.GetColumn(2,&lvc); 成功擷取屬性資訊的話長度就儲存在LVCOLUMN lvc的cx變量裡,列名就儲存在char name[20]裡,當然你也可以從LVCOLUMN lvc的pszText變量裡得到列名,因為pszText變量儲存了char name[20]的首位址。
如果要設定某列的屬性,就要用CListCtrl::SetColumn函數。 BOOL SetColumn( int nCol , const LVCOLUMN* pColumn ); 參數意思和GetColumn一樣,而SetColumn裡的 pColumn 參數儲存了你将要設定的屬性。下面的例子表示把第四列的列長度設定為50,列名設定為“銷量”: LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT; //同樣的,你要設定什麼屬性,就要先給mask變量指派響應的标志。 lvc.pszText="銷量";
lvc.cx=50;
m_listctrl.SetColumn(3,&lvc);