ClistCtrl 的部分使用技巧总结

一、ClistCtrl 避免大数量闪烁的几种方法, 网上一大堆, 我这里讲的是我的一些使用心得, 在进行大数据量的更新,比如说定时更新的时候,最好是处理OnEraseBkgnd 和OnPaint

 

BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认 return FALSE; } void CMyListCtrl::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; CRect headerRect; CDC MenDC;//内存ID表 CBitmap MemMap; GetClientRect(&rect); GetDlgItem(0)->GetWindowRect(&headerRect); ScreenToClient(headerRect); MenDC.CreateCompatibleDC(&dc); MemMap.CreateCompatibleBitmap( &dc, rect.Width(), rect.Height()); MenDC.SelectObject(&MemMap); MenDC.FillSolidRect(&rect,RGB(255, 255, 255)); //这一句是调用默认的OnPaint(),把图形画在内存DC表上 DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0); //输出 dc.BitBlt(0, headerRect.Height(), rect.Width(), rect.Height(), &MenDC, 0, headerRect.Height(), SRCCOPY); MenDC.DeleteDC(); MemMap.DeleteObject(); }

 

 

二、关于ClistCtrl的排序可以这样写:

在对话框.cpp里面处理消息也可以在自己的ListCtrl 派生类中排序

typedef struct _Item
{
 CListCtrl *mlist;
 int Isub;     //排序
}Item;

 

/*********************为列表头排序*******************************/ static int nSortOrder = 1; // 排序的方式,1升序,-1降序。 /* 回调函数 */ int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { // 得到排序方式 Item* pV=(Item*)lParamSort; // 得到两个列的排序信息 CString sz1 = pV->mlist->GetItemText(lParam1,pV->Isub); CString sz2 = pV->mlist->GetItemText(lParam2,pV->Isub); if(nSortOrder == 1) { return sz1.Compare(sz2); } else { return -sz1.Compare(sz2); } } void CProcDlg::OnLvnColumnClickListProc(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 static int ncurSortCol = -1; // 保存当前的排序列。 // 一开始表示为-1,表示尚未按任何列排序。 /* 若当前排序列与点击列相同,则更改增、减序的排序方式。 若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序。*/ if (ncurSortCol == pNMLV->iSubItem) { if (nSortOrder == 1) { nSortOrder = -1; } else { nSortOrder = 1; } } else { ncurSortCol = pNMLV->iSubItem; nSortOrder = 1; } Item mItem; mItem.mlist = &m_procListCtrl; mItem.Isub = pNMLV->iSubItem; for(int i=0;i < m_procListCtrl.GetItemCount();i++) { m_procListCtrl.SetItemData(i,i); } m_procListCtrl.SortItems(CompareFunc,(LPARAM)&mItem); *pResult = 0; }

 

三、右键菜单

 //鼠标右键单击消息 void CProcDlg::OnNMRClickListProc(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 int iItem = pNMItemActivate->iItem; if (iItem != -1) { CMenu menu; menu.LoadMenu(IDR_MenuProc); // 菜单ID CMenu* popMenu; popMenu = menu.GetSubMenu(0); CPoint pt; GetCursorPos(&pt); popMenu->TrackPopupMenu(TPM_CENTERALIGN, pt.x, pt.y, this, 0); menu.Detach(); menu.DestroyMenu(); } *pResult = 0; }

 

四、ListCtrl 项添加图标

 静态的添加在OnInitDialog中

 m_imageList.Create(.......);//创建图像列表, m_imageList.Add(); //加入图标 m_ListCtrl.SetImageList(&m_imageList, LVSIL_SMALL);

 动态添加图标到项Item 里面

 k = m_imageList.Add(hIcon); // add返回值为新添加图像的索引 m_ListCtrl.InsertItem(0, procEntry32.szExeFile, k); //注意InsertItem的第三个参数为k,即新添加图标的索引,这样图标在m_imageList 在列表Item 对应起来了。 例外在删除List 的一个项时, 最好是把Item 对应的图标也从 m_imageList删除, 不然会出现问题。 CString strProcID; //查找项 strProcID.Format(_T("%d"), dwProcID); for (int i = 0; i < m_procListCtrl.GetItemCount(); ++i) { for (int j = 0; j < m_procListCtrl.GetHeaderCtrl()->GetItemCount(); ++j) { if (m_procListCtrl.GetItemText(i, j) == strProcID) { LVITEM lvItem; lvItem.mask = LVIF_IMAGE; lvItem.iItem = i; m_procListCtrl.GetItem(&lvItem); m_imageList.Remove(lvItem.iImage); //注意删除行时把图标也删除 m_procListCtrl.DeleteItem(i); break; } } }

你可能感兴趣的:(struct,list,callback,图形,IM,imagelist)