首页 > 代码库 > [MFC]ListCtrl的扩展用法

[MFC]ListCtrl的扩展用法

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
 

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 pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

     *pResult = 0;

     NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR );

     LPNMLVCUSTOMDRAW lpnmcd = (LPNMLVCUSTOMDRAW) pNMHDR

     switch(lpnmcd->nmcd.dwDrawStage)

     {

     case CDDS_PREPAINT: // 首个消息:通知listctrl重绘,返回逐个item绘制

         {

              *pResult = CDRF_NOTIFYITEMDRAW;     

              break;

         }

     case CDDS_ITEMPREPAINT: // 第二个消息:通知绘制item,返回绘制sub item

         {

              *pResult = CDRF_NOTIFYSUBITEMDRAW;

              break;

         }

     case CDDS_ITEMPREPAINT|CDDS_SUBITEM: // 第三个消息:绘制subitem

         {

              if (pLVCD->iSubItem ==m_nColumn) // 要绘制图片的列

              {

                   // 把某图片绘制到设备上

                   CDC dc;

                   dc.Attach(lpnmcd->nmcd.hdc);

                   // 把某图片绘制到设备上绘制处理

                   *pResult = CDRF_SKIPDEFAULT;     // 需要制定绘制时跳过该项

                   break;

              }

              // Tell Windows to paint the control itself.

              *pResult = CDRF_DODEFAULT;

              break;

         }

     default:

         ;

     }

} 

 

 

 

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

 

 

[MFC]ListCtrl的扩展用法