教你實(shí)用CListCtrl
1.添加表頭:
定義一個(gè)CListCtrl控件的關(guān)聯(lián)變量ListControl,在OnInitDialog()函數(shù)里面加上如下代碼
?1?????////初始化界面 ?2?????ListControl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); ?3?????LONG?lStyle; ?4?????lStyle?=?GetWindowLong(ListControl.m_hWnd,?GWL_STYLE);//獲取當(dāng)前窗口style ?5?????lStyle?&=?~LVS_TYPEMASK;?//清除顯示方式位 ?6?????lStyle?|=?LVS_REPORT;?//設(shè)置style ?7?????SetWindowLong(ListControl.m_hWnd,?GWL_STYLE,?lStyle);//設(shè)置style ?8? ?9?????//添加列 10?????ListControl.InsertColumn(?0,?_T("映像名稱"),LVCFMT_CENTER,?150);//插入列 11?????ListControl.InsertColumn(1,_T("PID"),LVCFMT_CENTER,50);???????? 12?????ListControl.InsertColumn(2,_T("優(yōu)先級(jí)"),LVCFMT_CENTER,100);???? 13?????ListControl.InsertColumn(3,_T("線程數(shù)"),LVCFMT_CENTER,?50);
?
2.插入信息:
1?????????void?InsertData() 2?????????{ 3?????????????int?nCount?=?ListControl.GetItemCount();//獲取當(dāng)前已插入的行數(shù) 4?????????????ListControl.InsertItem(nCount,?_T(""));//插入一行 5?????????????ListControl.SetItemText(nCount,?0,?iterBegin->second.strExeFile);//第一列 6?????????????ListControl.SetItemText(nCount,?1,?iterBegin->second.strPID);//第二列 7?????????????ListControl.SetItemText(nCount,?2,?iterBegin->second.strPriority);//第三列 8?????????????ListControl.SetItemText(nCount,?3,?iterBegin->second.strThreadCount);//第四列 9?????????}
3.獲取當(dāng)前選中的項(xiàng):
方法1:
????POSITION?p?=?ListControl.GetFirstSelectedItemPosition();//獲取當(dāng)前選中的行的第一行的位置 ????//獲取選中的第一行的行索引 ????int?nIndex?=?ListControl.GetNextSelectedItem(p);//可能多選,GetNextSelectedItem使p移動(dòng)一個(gè)位置 ????//得到第index行.第2列的內(nèi)容(下標(biāo)從0開(kāi)始) ????CString?strColumn?=?ListControl.GetItemText(nIndex,1);
方法2:
1?????int?nIndex=ListControl.GetSelectionMark();//獲取選中的行 2?????CString?strPID?=ListControl.GetItemText(nIndex,?1);?//選中的行、列的值
?
?
4.獲取選中的行和列
1?void?CMFC_TestDlg::OnNMClickList2(NMHDR?*pNMHDR,?LRESULT?*pResult) 2?{ 3?????LPNMLISTVIEW?pNMLV?=?reinterpret_cast(pNMHDR); 4?????m_nSelectColumn?=?pNMLV->iSubItem;//獲取選中的行 5?????m_nSelectLine?=?ListControl.GetSelectionMark();//獲取選中的列 6?}
?
5.右鍵添加菜單
添加NM_RCLICK消息,消息響應(yīng)代碼如下:
?1?void?CMFC_TestDlg::OnNMRClickList2(NMHDR?*pNMHDR,?LRESULT?*pResult) ?2?{ ?3?????CMenu?menu?,*?pSubMenu;?//定義下面要用到的cmenu對(duì)象? ?4?????menu.LoadMenu(IDR_POPMENU);?//裝載自定義的右鍵菜單?IDR_POPMENU彈出菜單的ID ?5? ?6?????//獲取第一個(gè)彈出菜單,所以第一個(gè)菜單必須有子菜單? ?7?????pSubMenu?=?menu.GetSubMenu(0);? ?8? ?9?????CPoint?oPoint;?//定義一個(gè)用于確定光標(biāo)位置的位置? 10?????GetCursorPos(?&oPoint);?//獲取當(dāng)前光標(biāo)的位置,以便使得菜單可以跟隨光標(biāo)11? 12?????pSubMenu->TrackPopupMenu?(TPM_LEFTALIGN,?oPoint.x,?oPoint.y,?this);?//顯示菜單,第四個(gè)為傳遞的參數(shù) 13?????*pResult?=?0; //pSubMenu->EnableMenuItem(ID_EDIT_PASTE,?MF_DISABLED?|?MF_GRAYED)禁用菜單的某項(xiàng) 14?}
?
6.列排序
?1?BOOL?g_bSort;//全局變量,用于標(biāo)識(shí)是按從大到小還是從小到大排序 ?2? ?3?typedef?struct ?4?{ ?5?????CListCtrl?*plist;//存儲(chǔ)當(dāng)前的ListCtrl指針 ?6?????int?col;//存儲(chǔ)當(dāng)前選中的列 ?7?}?SortList; ?8? ?9? 10?//添加LVNCOLUMNCLICK消息 11?void?CMFC_TestDlg::OnLvnColumnclickList2(NMHDR?*pNMHDR,?LRESULT?*pResult) 12?{ 13?????LPNMLISTVIEW?pNMLV?=?reinterpret_cast
?
排序函數(shù):
?該函數(shù)返回-1,代表第一項(xiàng)排應(yīng)在第二項(xiàng)前面;
?返回1代表第一項(xiàng)排應(yīng)在第二項(xiàng)后面;
?返回0代表兩項(xiàng)相等。
int?CALLBACK?MylistCompare(LPARAM?lParam1,?LPARAM?lParam2,?LPARAM?lParamSort)? { ????SortList?*?listData?=?(SortList*)lParamSort;//獲取傳入的參數(shù) ????CListCtrl*???pListCtrl??=??listData->plist;? ????CString??strItem1; ????CString??strItem2; ????strItem1???=???pListCtrl->GetItemText(lParam1,?listData->col);?? ????strItem2???=???pListCtrl->GetItemText(lParam2,?listData->col);? ????USES_CONVERSION; ????char?*???s1=T2A(strItem1);??//轉(zhuǎn)換為CString為char?* ????char?*???s2=T2A(strItem2);? ????int?nResult?=?0; ????switch(listData->col)//根據(jù)選擇的列的數(shù)據(jù)類型進(jìn)行自定義排序 ????{ //整形的排序 ????case?1: ????case?3: ????????{ ????????????int???n1?=?atoi(s1);?? ????????????int???n2?=?atoi(s2);?? ????????????if???(?n1?>=?n2)?? ????????????{ ????????????????nResult?=?1;?? ????????????} ????????????else???? ????????????????nResult?=?-1;?? ????????} ????????break; //字符串的排序 ????case?0: ????case?2: ????????{ ????????????for?(int?i?=?0;?i=?0) ????????????{ ????????????????nResult?=?1; ????????????} ????????????else ????????????????nResult?=?-1; ????????} ????????break; ????} //根據(jù)全局變量的值改變排序方法 ????if?(g_bSort) ????{ ????????return?nResult; ????} ????else ????{ ????????return?-nResult; ????} }
?
7.全選(CTRL+A)
?1?BOOL?CMFC_TestDlg::PreTranslateMessage(MSG*?pMsg) ?2?{ ?3?????if?(pMsg->message?==?WM_KEYDOWN) ?4?????{ ?5?????????if(pMsg->wParam?==?'A') ?6?????????{ ?7?????????????if?(::GetKeyState(VK_CONTROL)<0) ?8?????????????{ ?9?????????????????for?(int?i?=?0;?i<ListControl.GetItemCount();?i++) 10?????????????????{ 11?????????????????????ListControl.SetItemState(i,LVIS_SELECTED|LVIS_FOCUSED,?LVIS_SELECTED|LVIS_FOCUSED); 12?????????????????} 13?????????????} 14?????????} 15?????} 16?????return?FALSE; 17?}
?
8.修改列的新名稱
1?????LVCOLUMN?Column; 2?????ListControl.GetColumn(0,&Column); 3?????Column.pszText=L"0列新名稱"; 4?????ListControl.SetColumn(0,&Column);
?
9.可編輯狀態(tài)
(1)設(shè)置EDIT Labels的屬性為TRUE
(2)添加事件NM_DBCLICK事件
?1?????*pResult?=?0; ?2? ?3?????//雙擊事件產(chǎn)生edit控件,EditLabel會(huì)先確定list是否setFocus ?4?????POSITION?pos?=?ListControl.GetFirstSelectedItemPosition(); ?5?????int?tIndex?=?ListControl.GetNextSelectedItem(pos); ?6? ?7?????if?(?tIndex?>=?0?) ?8?????{ ?9?????????ListControl.SetFocus(); 10?????????CEdit*?pEdit?=ListControl.EditLabel(?tIndex?); 11?????}
?
(3)添加事件LVN_ENDLABELEDIT事件
?1?????NMLVDISPINFO?*pDispInfo?=?reinterpret_cast(pNMHDR); ?2?????//?TODO:?在此添加控件通知處理程序代碼 ?3?????*pResult?=?0; ?4? ?5?????CString?pName?=?pDispInfo->item.pszText; ?6?????int?tIndex?=?pDispInfo->item.iItem; ?7?????ListControl.SetFocus(); ?8? ?9?????if(?(?!?pName.IsEmpty()?)?&&?tIndex?>=?0?) 10?????{ 11?????????ListControl.SetItemText(?tIndex,?0,?pName); 12?????}
?
10.添加圖標(biāo):
(1)聲明:
1?????//首先聲明一個(gè)類的變量???? 2?????CImageList?m_imageList; 3?????//設(shè)置ListCtrl的圖像列表 4?????m_imageList.Create(32,32,?TRUE|ILC_COLOR32,?8,?8); 5?????m_listCtrl.SetImageList(&m_imageList,?LVSIL_SMALL);
(2)獲取圖標(biāo):
1?SHFILEINFO???sfi?=?{0}; 2?????SHGetFileInfo("d:\a.txt",0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON); 3?????m_imageList.Add(sfi.hIcon);
?
(3)添加項(xiàng):
1?????LVITEM?lvItem; 2?????lvItem.iItem?=?m_listCtrl.GetItemCount(); 3?????lvItem.iSubItem?=?0; 4?????lvItem.iImage?=m_imageList.GetImageCount()-1;//取最后一個(gè) 5?????lvItem.mask?=?LVIF_TEXT|LVIF_IMAGE; 6?????lvItem.pszText?=?_T("TEST");???? 7?????m_listCtrl.InsertItem(&lvItem);
?
11.樣式設(shè)置:
(1).
首先區(qū)分LVS_與LVS_EX_,哪些是常規(guī)樣式,哪些是擴(kuò)展樣式:能在屬性對(duì)話框里看到的樣式都是常規(guī)樣式,例如LVS_REPORT。
擴(kuò)展樣式:
LVS_EX_CHECKBOXES
您可以獲得 ListView_GetCheckState 指定項(xiàng)目的復(fù)選框的狀態(tài)。若要設(shè)置檢查狀態(tài),請(qǐng)使用 ListView_SetCheckState。如果設(shè)置了此樣式,則當(dāng)用戶單擊該復(fù)選框,或按空格鍵在列表視圖控件自動(dòng)切換復(fù)選狀態(tài)。
LVS_EX_FLATSB
扁平滾動(dòng)條
列表視圖中的啟用平面滾動(dòng)條。如果您需要更多的控制列表視圖滾動(dòng)條的外觀,您應(yīng)該操作平的滾動(dòng)欄 Api 使用直接的列表視圖滾動(dòng)條。如果更改系統(tǒng)度量,您負(fù)責(zé)調(diào)整與 FlatSB_SetScrollProp 的滾動(dòng)欄度量。有關(guān)進(jìn)一步的詳細(xì)信息請(qǐng)參閱平滾動(dòng)條。
LVS_EX_FULLROWSELECT
選擇整行
當(dāng)選擇某個(gè)項(xiàng)目時(shí),強(qiáng)調(diào)了項(xiàng)目和其所有子項(xiàng)。此樣式是僅在 LVS_REPORT 風(fēng)格結(jié)合中可用。
LVS_EX_GRIDLINES
繪制表格
顯示項(xiàng)及其子項(xiàng)周圍的網(wǎng)格線。此樣式是僅在 LVS_REPORT 風(fēng)格結(jié)合中可用
LVS_EX_HEADERDRAGDROP
報(bào)表頭可以拖拽
允許拖放的列表視圖控件中的列重新排序。此樣式是只可用于使用 LVS_REPORT 樣式的列表視圖控件。
LVS_EX_INFOTIP
將提示信息窗口的消息通知父窗口
當(dāng)列表視圖控件使用的 LVS_EX_INFOTIP 樣式時(shí),LVN_GETINFOTIP 通知代碼發(fā)送到父窗口顯示工具提示項(xiàng)之前。
LVS_EX_LABELTIP
?
LVS_EX_MULTIWORKAREAS
多工作區(qū)
LVS_EX_ONECLICKACTIVATE
單擊激活
LVS_EX_REGIONAL
?
LVS_EX_SUBITEMIMAGES
子項(xiàng)目圖標(biāo)列表
LVS_EX_TRACKSELECT
自動(dòng)換行
LVS_EX_TWOCLICKACTIVATE
雙擊激活
LVS_EX_UNDERLINECOLD
?
LVS_EX_UNDERLINEHOT
?
(2).
?? 下面弄清楚怎么設(shè)置常規(guī)樣式和擴(kuò)展樣式。
?? 設(shè)置常規(guī)樣式使用的函數(shù):GetWindowLong(僅32位下)、SetWindowLong()
?? 設(shè)置擴(kuò)展樣式使用的函數(shù):GetExtendedStyle、SetExtendedStyle
?? 示例代碼:
1? DWORD?dwStyle=GetWindowLong(m_list.m_hWnd,GWL_STYLE);?? 2? SetWindowLong(m_list.m_hWnd,GWL_STYLE,dwStyle|LVS_REPORT);?? 3? 4??? DWORD?styles=m_list.GetExtendedStyle();?? 5? 6??? m_list.SetExtendedStyle(styles|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
?
MFC ListControl技巧匯總