1 2 3 CListView中內置了CListCtrl,,所以對CListView的操作實際上就是對內置CListCtrl的操作,。下面就從新建一個CListView的子類開始,,我從工程中新建了一個叫做CInfoView的類,基類選擇CListView,。 4 5 1>----------初始化CListView,,設置風格,背景和字體顏色,,初始化行列,。該項工作在OnInitialUpdate()中完成,如下所示,。 6 7 void CInfoView::OnInitialUpdate() 8 { 9 CListView::OnInitialUpdate(); 10 // TODO: Add your specialized code here and/or call the base class 11 CListCtrl& m_list = GetListCtrl();//得到內置的listctrl引用 12 LONG lStyle; 13 lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當前窗口風格 14 lStyle &= ~LVS_TYPEMASK; //清除顯示方式位 15 lStyle |= LVS_REPORT; //設置報表風格 16 SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle); //設置窗口風格 17 18 DWORD dwStyle = m_list.GetExtendedStyle(); 19 20 //選中某行使整行高亮(只適用于報表風格的listctrl) 21 dwStyle |= LVS_EX_FULLROWSELECT; 22 dwStyle |= LVS_EX_GRIDLINES;//網(wǎng)格線(只適用與報表風格的listctrl) 23 24 m_list.SetExtendedStyle(dwStyle); //設置擴展風格 25 m_list.SetBkColor(RGB(200, 200, 200)); //設置背景顏色 26 m_list.SetTextBkColor(RGB(200, 200, 200)); //設置文本背景顏色 27 m_list.SetTextColor(RGB(10, 10, 80)); //設置文本顏色 28 29 //插入列的標題,,為了簡單起見,我只插入三列 30 m_list.InsertColumn( 0, "圖像幀號", LVCFMT_CENTER, 80 ); 31 m_list.InsertColumn( 1, "可見性判斷", LVCFMT_CENTER, 110 ); 32 m_list.InsertColumn( 2, "置信度結果", LVCFMT_CENTER, 110 ); 33 } 34 35 36 2>----------插入一行數(shù)據(jù),。一般在實際應用中,,都是在程序運行中,插入一行數(shù)據(jù),,這時候,,需要在當前的程序語境中得到CInfoView的指針,然后進行插入數(shù)據(jù)的操作,。在我的應用中,,我把CinfoView作為拆分窗口的一個子窗口,所以具體操作如下: 37 38 CListView*listview=(CListView*)(((CMainFrame*)theApp.GetMainWnd())->m_wndSplitter1.GetPane(1,0));//得到ListView的指針 39 CListCtrl& list = listview->GetListCtrl();//得到listview內置listctrl的引用 40 CString strId, strCo;//圖像幀號,,置信度 41 CString strVb = "Y"; //可見性 42 if(fConfid[nIndex] <= 0) 43 { 44 strVb = "N"; 45 } 46 strId.Format("%d", nIndex+1); 47 strCo.Format("%.4f", fConfid[nIndex]); 48 49 //插入一行數(shù)據(jù),,始終在頂端插入新的數(shù)據(jù) 50 int nRow = list.InsertItem(0, strId); 51 list.SetItemText(nRow, 1, strVb); 52 list.SetItemText(nRow, 2, strCo); 53 54 3>----------右鍵單擊彈出浮動菜單,。在我的應用中,右鍵彈出的浮動菜單,,只有一項:“刪除所有內容”,。要彈出浮動菜單,首先先要在“資源”的“Menu”中新建一個Menu,,ID命名為IDR_POPMENU,,然后在該Menu中添加一個主菜單“操作”,在“操作”下添加一個子菜單“刪除所有內容”,,ID命名為“ID_DELETE_ALL”,,通過向導在CInfoView中給ID_DELETE_ALL添加消息響應函數(shù)OnDeleteAll(),如下: 55 56 void CInfoView::OnDeleteAll() 57 { 58 CListCtrl &m_list = GetListCtrl(); 59 m_list.DeleteAllItems(); 60 } 61 62 然后通過向導在CInfoView中添加右鍵單擊響應函數(shù)=NM_RCLICK,,如下: 63 64 void CInfoView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 65 { 66 // TODO: Add your control notification handler code here 67 CListCtrl &m_list = GetListCtrl(); //獲取當前列表控件的指針 68 CMenu menu, *pSubMenu; //定義下面要用到的cmenu對象 69 menu.LoadMenu(IDR_POPMENU); //裝載自定義的右鍵菜單 70 pSubMenu = menu.GetSubMenu(0); //獲取第一個彈出菜單 71 CPoint oPoint; //定義一個用于確定光標位置的位置 72 GetCursorPos(&oPoint); //獲取當前光標的位置 73 74 //在指定位置顯示彈出菜單 75 pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, oPoint.x, oPoint.y, this); 76 } 77 78 4>----------添加消息響應函數(shù)OnCustomDraw(),,為ClistCtrl的每個Item設置不同的顏色,在該應用中,,為單數(shù)和偶數(shù)的Item項設置兩種不同的顏色,。具體步驟如下: 79 首先在InfoView.h的AFX_MSG之間添加消息函數(shù)聲明: 80 afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); 81 然后在InfoView.cpp的BEGIN_MESSAGE_MAP之間添加消息映射: 82 ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) 83 最后在InfoView.cpp中添加函數(shù)實現(xiàn): 84 85 void CInfoView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) 86 { 87 LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR; 88 89 switch(lplvcd->nmcd.dwDrawStage) 90 { 91 int iRow; 92 case CDDS_PREPAINT: 93 *pResult = CDRF_NOTIFYITEMDRAW; 94 break; 95 case CDDS_ITEMPREPAINT: 96 *pResult = CDRF_DODEFAULT; 97 iRow= lplvcd->nmcd.dwItemSpec; 98 if(iRow & 1) 99 { 100 lplvcd->clrTextBk = RGB(230, 230, 230); 101 //lplvcd->clrText = RGB(255, 255, 0); 102 *pResult = CDRF_NEWFONT; 103 } 104 break; 105 default: 106 *pResult = CDRF_DODEFAULT; 107 } 108 } 109 110 5>----------為CInfoView添加點擊列的標題進行排序的消息響應函數(shù),在添加該消息響應函數(shù)之前,,先要定義實現(xiàn)排序的回調函數(shù),。在該應用中,第一列是圖像幀號,,按自然數(shù)排序,,其他列都按字串進行排列,所以定義兩個比較的回調函數(shù),。 111 在InfoView.h中聲明兩個靜態(tài)的回調函數(shù): 112 113 static int CALLBACK ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);//按字串排序 114 115 static int CALLBACK ListViewCompareIntFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);//按自然數(shù)排序 116 117 在InfoView.cpp中實現(xiàn)兩個靜態(tài)的回調函數(shù): 118 119 int CALLBACK CInfoView::ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 120 { 121 // 得到排序方式 122 int *pisortorder = (int *)lParamSort; 123 124 // 得到兩個列的排序信息 125 TCHAR *sz1 = (TCHAR *)lParam1; 126 TCHAR *sz2 = (TCHAR *)lParam2; 127 // 比較列的信息并返回比較結果,。 128 // 若為減序,則將比較結果乘上-1,。 129 if (*pisortorder == LVS_SORTASCENDING) 130 return lstrcmp(sz1, sz2); 131 else 132 return lstrcmp(sz1, sz2) * (-1); 133 } 134 135 int CALLBACK CInfoView::ListViewCompareIntFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 136 { 137 // 得到排序方式 138 int *pisortorder = (int *)lParamSort; 139 // 得到兩個列的排序信息 140 TCHAR *sz1 = (TCHAR *)lParam1; 141 TCHAR *sz2 = (TCHAR *)lParam2; 142 int n1 = _ttoi(sz1); 143 int n2 = _ttoi(sz2); 144 // 比較列的信息并返回比較結果,。 145 // 若為減序,則將比較結果乘上-1,。 146 if(*pisortorder == LVS_SORTASCENDING) 147 { 148 if(n1 - n2 > 0) return 1; 149 else if(n1 -n2 == 0) return 0; 150 else return -1; 151 } 152 else 153 { 154 if(n1 - n2 > 0) return -1; 155 else if(n1 -n2 == 0) return 0; 156 else return 1; 157 } 158 } 159 160 //然后通過向導為事件LVN_COLUMNCLICK添加消息響應函數(shù)OnColumnclick(),在該函數(shù)中調用上面的回調函數(shù) 161 void CInfoView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 162 { 163 // TODO: Add your control notification handler code here 164 static int ncurSortCol = -1; // 保存當前的排序列,。 165 // 一開始表示為-1,表示尚未按任何列排序,。 166 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 167 CListCtrl* lc = &GetListCtrl(); 168 LONG ws = GetWindowLong(lc->m_hWnd, GWL_STYLE); 169 int nSortOrder; // 排序的方式 170 171 // 若點擊列與當前排序列不同的列,,則改變排序序,并將排序方式改為增序,。 172 // 若當前排序列與點擊列相同,,則更改增、減序的排序方式 173 if (ncurSortCol == pNMListView->iSubItem) 174 { 175 if (ws & LVS_SORTASCENDING) 176 { 177 ws ^= LVS_SORTASCENDING; 178 nSortOrder = LVS_SORTDESCENDING; 179 } 180 else 181 { 182 ws ^= LVS_SORTDESCENDING; 183 nSortOrder = LVS_SORTASCENDING; 184 } 185 } 186 else 187 { 188 if (ws & LVS_SORTASCENDING) 189 { 190 nSortOrder = LVS_SORTDESCENDING; 191 ncurSortCol = pNMListView->iSubItem; 192 } 193 else 194 { 195 nSortOrder = LVS_SORTASCENDING; 196 ncurSortCol = pNMListView->iSubItem; 197 } 198 } 199 200 // 將當前的排序信息保存在窗口Style中,,供以后使用 201 ws |= nSortOrder; 202 SetWindowLong(lc->m_hWnd, GWL_STYLE, ws); 203 204 // 將各ITEM的LPARAM用新排序列的內容替換 205 LVITEM li; 206 li.mask = LVIF_PARAM|LVIF_TEXT; 207 TCHAR szItemText[1024]; 208 for (int i = 0; i < lc->GetItemCount(); i++) 209 { 210 li.iItem = i; 211 li.iSubItem = ncurSortCol; 212 li.cchTextMax = 1024; 213 li.pszText = szItemText; 214 lc->GetItem(&li); 215 TCHAR * szlparam = (TCHAR *)li.lParam; 216 // 刪除以前的信息,,釋放空間 217 // 添加List Item時應注意將lParam初始化NULL 218 if (szlparam != NULL) 219 delete szlparam; 220 221 // 復制當前列的szItemText到Item的lParam中 222 szlparam = new TCHAR[lstrlen(szItemText) + 1]; 223 lstrcpy(szlparam, szItemText); 224 lc->SetItemData(i, DWORD(szlparam)); 225 } 226 227 // 開始排序 228 if(ncurSortCol == 0)//第一列按整數(shù)排序 229 { 230 GetListCtrl().SortItems(ListViewCompareIntFunc,(LPARAM)(&nSortOrder)); 231 } 232 else 233 GetListCtrl().SortItems(ListViewCompareFunc,(LPARAM)(&nSortOrder)); 234 *pResult = 0; 235 236 } 237 |
|
來自: zhaopengxslc > 《編程經驗》