1.添加表頭:
定義一個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)先級"),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)前選中的項:
方法1:
????POSITION?p?=?ListControl.GetFirstSelectedItemPosition();//獲取當(dāng)前選中的行的第一行的位置 ????//獲取選中的第一行的行索引 ????int?nIndex?=?ListControl.GetNextSelectedItem(p);//可能多選,GetNextSelectedItem使p移動一個位置 ????//得到第index行.第2列的內(nèi)容(下標(biāo)從0開始) ????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對象?
?4?????menu.LoadMenu(IDR_POPMENU);?//裝載自定義的右鍵菜單?IDR_POPMENU彈出菜單的ID
?5?
?6?????//獲取第一個彈出菜單,所以第一個菜單必須有子菜單?
?7?????pSubMenu?=?menu.GetSubMenu(0);?
?8?
?9?????CPoint?oPoint;?//定義一個用于確定光標(biāo)位置的位置?
10?????GetCursorPos(?&oPoint);?//獲取當(dāng)前光標(biāo)的位置,以便使得菜單可以跟隨光標(biāo)11?
12?????pSubMenu->TrackPopupMenu?(TPM_LEFTALIGN,?oPoint.x,?oPoint.y,?this);?//顯示菜單,第四個為傳遞的參數(shù)
13?????*pResult?=?0;
//pSubMenu->EnableMenuItem(ID_EDIT_PASTE,?MF_DISABLED?|?MF_GRAYED)禁用菜單的某項
14?}?
6.列排序
?1?BOOL?g_bSort;//全局變量,用于標(biāo)識是按從大到小還是從小到大排序
?2?
?3?typedef?struct
?4?{
?5?????CListCtrl?*plist;//存儲當(dāng)前的ListCtrl指針
?6?????int?col;//存儲當(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,代表第一項排應(yīng)在第二項前面;
?返回1代表第一項排應(yīng)在第二項后面;
?返回0代表兩項相等。
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ù)類型進行自定義排序
????{
//整形的排序
????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會先確定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?????//首先聲明一個類的變量???? 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)添加項:
1?????LVITEM?lvItem;
2?????lvItem.iItem?=?m_listCtrl.GetItemCount();
3?????lvItem.iSubItem?=?0;
4?????lvItem.iImage?=m_imageList.GetImageCount()-1;//取最后一個
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ī)樣式,哪些是擴展樣式:能在屬性對話框里看到的樣式都是常規(guī)樣式,例如LVS_REPORT。
擴展樣式:
LVS_EX_CHECKBOXES
您可以獲得 ListView_GetCheckState 指定項目的復(fù)選框的狀態(tài)。若要設(shè)置檢查狀態(tài),請使用 ListView_SetCheckState。如果設(shè)置了此樣式,則當(dāng)用戶單擊該復(fù)選框,或按空格鍵在列表視圖控件自動切換復(fù)選狀態(tài)。
LVS_EX_FLATSB
扁平滾動條
列表視圖中的啟用平面滾動條。如果您需要更多的控制列表視圖滾動條的外觀,您應(yīng)該操作平的滾動欄 Api 使用直接的列表視圖滾動條。如果更改系統(tǒng)度量,您負(fù)責(zé)調(diào)整與 FlatSB_SetScrollProp 的滾動欄度量。有關(guān)進一步的詳細(xì)信息請參閱平滾動條。
LVS_EX_FULLROWSELECT
選擇整行
當(dāng)選擇某個項目時,強調(diào)了項目和其所有子項。此樣式是僅在 LVS_REPORT 風(fēng)格結(jié)合中可用。
LVS_EX_GRIDLINES
繪制表格
顯示項及其子項周圍的網(wǎng)格線。此樣式是僅在 LVS_REPORT 風(fēng)格結(jié)合中可用
LVS_EX_HEADERDRAGDROP
報表頭可以拖拽
允許拖放的列表視圖控件中的列重新排序。此樣式是只可用于使用 LVS_REPORT 樣式的列表視圖控件。
LVS_EX_INFOTIP
將提示信息窗口的消息通知父窗口
當(dāng)列表視圖控件使用的 LVS_EX_INFOTIP 樣式時,LVN_GETINFOTIP 通知代碼發(fā)送到父窗口顯示工具提示項之前。
LVS_EX_LABELTIP
?
LVS_EX_MULTIWORKAREAS
多工作區(qū)
LVS_EX_ONECLICKACTIVATE
單擊激活
LVS_EX_REGIONAL
?
LVS_EX_SUBITEMIMAGES
子項目圖標(biāo)列表
LVS_EX_TRACKSELECT
自動換行
LVS_EX_TWOCLICKACTIVATE
雙擊激活
LVS_EX_UNDERLINECOLD
?
LVS_EX_UNDERLINEHOT
?
(2).
?? 下面弄清楚怎么設(shè)置常規(guī)樣式和擴展樣式。
?? 設(shè)置常規(guī)樣式使用的函數(shù):GetWindowLong(僅32位下)、SetWindowLong()
?? 設(shè)置擴展樣式使用的函數(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技巧匯總





