天天看點

CListCtrl控件(1)基本操作

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);

繼續閱讀