|
VC: [轉(zhuǎn)]CListCtrl使用詳解 收藏
1。先來(lái)介紹REPORT類(lèi)型的CListCtrl:
首先使用下面的語(yǔ)句設(shè)置CListCtrl的style: DWORD SetExtendedStyle( DWORD dwNewStyle ); 其中 LVS_EX_CHECKBOXES 表示添加CheckBox LVS_EX_FULLROWSELECT 表示選擇整行 LVS_EX_GRIDLINES 表示添加表格線(xiàn) 如果設(shè)置了LVS_EX_CHECKBOXES屬性,則可以用
BOOL GetCheck( int nItem ) const; 來(lái)得到某一行是否Checked。 可以先用下面的語(yǔ)句來(lái)刪除以前的東西:
for(int k=2;k>=0;k--) //注意要從后往前刪,否則出錯(cuò) m_ListCtrl.DeleteColumn(k); m_ListCtrl.DeleteAllItems(); 用下面的語(yǔ)句新建列:
m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT); m_ListCtrl.InsertColumn(1,_T("儀器類(lèi)別")); m_ListCtrl.InsertColumn(2,_T("項(xiàng)目類(lèi)別")); 其中LVCFMT_IMAGE表示可以在第一列加入圖標(biāo)。如果不要圖標(biāo)可以刪去。 然后設(shè)置列寬:
for(j=0;j<3;j++) m_ListCtrl.SetColumnWidth(j ,100); 以下為列表加入圖標(biāo),如果不需要圖標(biāo),可以跳過(guò)這一步。注意只在第一次加入,如果多次加入會(huì)出錯(cuò)! 先在頭文件中加入聲明: CImageList m_ImageList; 這是必要的,如果在cpp的某個(gè)函數(shù)中加入由于生命期結(jié)束,CImageList自動(dòng)釋放,則效果是列表中看不到圖標(biāo),只看到一個(gè)白方塊。 下面生成CImageList,并將其綁定到CListCtrl中,這是CImageList中還沒(méi)有圖標(biāo),只是一個(gè)容器: static int flag=2; if(flag==2){//只調(diào)用一次SetImageList,否則出錯(cuò) m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1); m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL); } flag=(flag+1)%2; 如果CListCtrl已經(jīng)用過(guò),曾經(jīng)加過(guò)圖標(biāo)進(jìn)去,這時(shí)就要?jiǎng)h除上次放進(jìn)m_ImageList中的Image for(int kk=0;kk<m_ImageList.GetImageCount();kk++) m_ImageList.Remove(k); 下面介紹如何向CListCtrl里面加入行,并同時(shí)為每一行動(dòng)態(tài)加入圖標(biāo): 假設(shè)m_listRowCount為要加入的行數(shù)。 CBitmap* bitmap; bitmap=new CBitmap[m_list1rowCount]; HBITMAP hbitmap; for(int i = 0; i < m_listRowCount; i++) { //為每一行插入相應(yīng)的縮略圖 CFile f; CFileException e; if( !f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName為bmp文件名,由你來(lái)定 hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); }else{ f.Close(); hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); } bitmap[i].Attach(hbitmap); m_ImageList.Add(&bitmap[i], RGB(0, 128, 128)); //插入行 m_ListCtrl.InsertItem(i,m_FileName,i); m_ListCtrl.SetItemText(i,1,type); m_ListCtrl.SetItemText(i,2,m_Path); } //記得刪除已經(jīng)沒(méi)用的臨時(shí)文件 if(m_list1rowCount!=0) delete[] bitmap; 2。如果是ICON類(lèi)型的CListCtrl,則要做一點(diǎn)點(diǎn)改動(dòng):
把綁定圖標(biāo)集的代碼由 SetImageList(&m_ImageList,LVSIL_SMALL); 改為 SetImageList(&m_ImageList,LVSIL_NORMAL); 插入行時(shí)只用
InsertItem(i,mainSet.m_FileName,i); 不用 SetItemText(i,1,type); 之類(lèi)的代碼。 [附]CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠標(biāo)雙擊列表項(xiàng)事件的處理:
LVN_BEGINDRAG 鼠標(biāo)左鍵正在被觸發(fā)以便進(jìn)行拖放操作(當(dāng)鼠標(biāo)左鍵開(kāi)始拖拽列表視圖控件中的項(xiàng)目時(shí)產(chǎn)生) LVN_BEGINRDRAG 鼠標(biāo)右鍵正在被觸發(fā)以便進(jìn)行拖放操作(當(dāng)鼠標(biāo)右鍵開(kāi)始拖拽列表視圖控件中的項(xiàng)目時(shí)產(chǎn)生)
LVN_BEGINLABELEDIT 開(kāi)始編輯項(xiàng)的文本
LVN_COLUMNCLICK 單擊列(當(dāng)鼠標(biāo)單擊列表視圖控件列標(biāo)題時(shí)產(chǎn)生)
NM_CLICK 當(dāng)鼠標(biāo)單擊列表視圖控件時(shí)產(chǎn)生
LVN_COLUMNCLICK 單擊列
LVN_DELETEALLITEMS 刪除所有項(xiàng)
LVN_DELETEITEM 刪除某個(gè)項(xiàng)
NM_DBLCLK 當(dāng)鼠標(biāo)雙擊列表視圖控件時(shí)產(chǎn)生
LVN_ENDLABELEDIT 結(jié)束對(duì)項(xiàng)文本的編輯
LVN_GETDISPINFO 請(qǐng)求需要顯示的信息
LVN_GETINFOTIP 請(qǐng)求顯示在工具提示窗口內(nèi)的附加的文本信息
LVN_HOTTRACK 鼠標(biāo)滑過(guò)某個(gè)項(xiàng)
LVN_INSERTITEM 當(dāng)向列表視圖控件插入項(xiàng)目時(shí)產(chǎn)生
lVN_ITEMACTIVATE 激活某個(gè)項(xiàng)
LVN_ITEMCHANGED 某個(gè)項(xiàng)已經(jīng)發(fā)生變化
LVN_ITEMCHANGING 某個(gè)項(xiàng)目正在發(fā)生變化
NM_KILLFOCUS 當(dāng)視表列圖控件失去焦點(diǎn)時(shí)產(chǎn)生
LVN_KEYDOWN 某個(gè)鍵被按下
LVN_MARQUEEBEGIN 開(kāi)始某個(gè)邊框選擇
NM_OUTOFMEMORY 當(dāng)內(nèi)存溢出時(shí)產(chǎn)生
LVN_ODCACHEHINT 虛擬列表控件的顯示區(qū)域的內(nèi)容發(fā)生了變化
LVN_ODSTATECHANGED 虛擬列表的控件的某個(gè)項(xiàng)或某個(gè)范圍內(nèi)的項(xiàng)已經(jīng)發(fā)生變化
LVN_ODFINDITEM 需要擁有者查找一個(gè)特定的回調(diào)項(xiàng)
NM_RCLICK 當(dāng)鼠標(biāo)右鍵單擊列表視圖控件時(shí)產(chǎn)生
NM_RDBLCLK 當(dāng)鼠標(biāo)右鍵雙擊列表視圖控件時(shí)產(chǎn)生
NM_SETFOCUS 當(dāng)列表視圖控件獲得焦點(diǎn)時(shí)產(chǎn)生
LVN_SETDISPINFO 父窗口必須更新控件為項(xiàng)所維護(hù)的信息
注解:
HDN:Header Notify
LVN:ListView control Notify NM:Notify Message TVN:TreeView control Notify LVN_ITEMCHANGED消息的處理
消息處理函數(shù):
void C***Dlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
{ NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->uChanged==LVIF_STATE)
{ if(pNMListView->uNewState & LVIS_SELECTED) { //處理內(nèi)容 int nItem=pNMListView->iItem; CString value[6]; for(int i=0;i<6;i++) { value[i]=m_List.GetItemText(nItem,i); } } } *pResult = 0;
} 消息處理函數(shù)中的兩個(gè)if條件句一定要有,否則可能出現(xiàn)多次進(jìn)入處理內(nèi)容的問(wèn)題。
鼠標(biāo)雙擊列表項(xiàng)事件的處理
響應(yīng)NM_DBLCLK消息:
void CDisSalaryDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
{ NM_LISTVIEW *pNMListView=(NM_LISTVIEW *)pNMHDR; int nItem=pNMListView->iItem;
if(nItem>=0 && nItem<m_List.GetItemCount()) //判斷雙擊位置是否在有數(shù)據(jù)的列表項(xiàng)上面 { ............. } *pResult = 0;
} 消息處理函數(shù)中的if語(yǔ)句很重要,用于判斷雙擊位置是否在有數(shù)據(jù)的列表項(xiàng)上面。因?yàn)镹M_DBLCLK消息是CListCtrl控件(整體)消息,只要是在CListCtrl控件范圍之內(nèi)執(zhí)行此事件就會(huì)產(chǎn)生該消息,而不一定要在有數(shù)據(jù)的列表項(xiàng)上面。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xiaofengsheng/archive/2009/09/12/4546097.aspx
|
|
|
來(lái)自: lscan*98* > 《我的圖書(shū)館》