(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
参考文档: MSDN等
1.
ListCtrl首列置为checkbox
a. 首先,选择view模式为Report模式
b.
代码中设置属性LVS_EX_CHECKBOXES
m_listCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|m_listCtrl.GetExtendedStyle())
c. 如果要设置某行缺省checkbox勾选的话,代码中需要设置
m_listCtrl.SetItemState(iItem,INDEXTOSTATEIMAGEMASK(2),LVIS_STATEIMAGEMASK);
或
m_listCtrl.SetCheck(iItem); //设置checkbox为选中状态
(注意:SetItemState不触发Itemchanged,SetCheck触发Itemchanged)
2.
列排序
a.支持排序,需要insertitem时指定lparam,也即itemdata,因为CompareFunc时,两个相比较item的lparam是传入参数。
b.调用侧一般会采用,点击一次正排序,再点击一次逆排序,这就需要记录之前排序字段,以及排序顺序是正序还是逆序。
此时,可以添加变量m_preCol/m_preOrder记录,也或使用窗口属性SetProp/GetProp
c. 排序函数
排序函数在执行SortItems时被调用
m_listCtrl.SortItems(CompareFunc, (LPARAM)&ParamSort);
函数格式形如
int CALLBACKCompareFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort) { 此时,可以基于lParam1找出比较item1,根据lparam2找出item2 然后由lParamSort找出排序列,以及正序还是逆序 // lParamSort格式可以用形始下面的格式 { bool bOrder; int orderColumn; CListCtrl* pList; }; } |
3.
某列绘制成图片
a. 重写CListCtrl,并绑定绘制子项处理
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
b. 在调用它的Dialog中绑定事件NM_CUSTOMDRAW,并显示调用重写ListCtrl的OnCustomdraw
ON_NOTIFY ( NM_CUSTOMDRAW, IDC_MY_LIST, OnCustomdrawNewList)
在OnCustomdrawNewList调用CCtrlList的重写类的OnCustomdraw
c. 然后就在重写ListCtrl的OnCustomdraw中实现要单独绘制的内容了
形如
void CNewListCtrl::OnNMCustomdrawSubItem(NMHDR *pNMHDR,LRESULT *pResult) { LPNMCUSTOMDRAW *pResult = 0; NMLVCUSTOMDRAW* LPNMLVCUSTOMDRAW switch(lpnmcd->nmcd.dwDrawStage) { case { *pResult = break; } case { *pResult = break; } case { if (pLVCD->iSubItem ==m_nColumn) // 要绘制图片的列 { // 把某图片绘制到设备上 CDC dc.Attach(lpnmcd->nmcd.hdc); // 把某图片绘制到设备上—绘制处理… *pResult = break; } // Tell Windows to paint the control itself. *pResult = break; } default: ; } } |
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)