您的位置:首页 > 其它

ClistCtrl 的部分使用技巧总结

2011-04-03 21:50 507 查看
一、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;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: