[MFC]ListCtrl的扩展用法

(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
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 转载请标明来源)

时间: 2024-08-01 13:57:40

[MFC]ListCtrl的扩展用法的相关文章

VC/MFC ListCtrl 控件功能使用汇总(转)

以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 "ListView_"开头的一些宏.如 ListView_InsertColumn -------------------------------------------------------------------------------- 1. CListCtrl 风格      LVS_ICON: 为每个item显示大图标      LVS_SMALLIC

ListCtrl的扩展类EditListCtrl

该类继承自MFC的CListCtrl类: 实现列可选,多单元格可选,单击选中单元格并能双击编辑,同时也可以设定某一列是否能进行编辑等等. 功能强大,欢迎使用. <p><span style="font-family: Arial, Helvetica, sans-serif;">头文件:</span></p><p>CEditListCtrl.h</p> class CEditListCtrl : public CL

[VC]listctrl的基本用法

1   添加listctrl的头 m_list.setextendedstyle(LVS_EX_FULLROWSELECT||LVS_EX_GRIdLINES); m_list.insertcolumn(0,"dasdasd",LVCFMT_CENTER,100); m_list.insertcolumn(1,"sdfsdf",VCFMT_CENTER,120); [VC]listctrl的基本用法,布布扣,bubuko.com

MFC中关闭窗口的几种办法+MFC中MessageBox的用法

MFC中关闭窗口的几种办法: 退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE); 关闭当前窗口用DestroyWindow( ); 关闭模式对话框用EndDialog(0); MFC中MessageBox的用法 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.1.MessageBox("这是一个最简单的消息框!");2.MessageBox("这是一个有标题的消息框!","

grep的扩展用法

正则表达式分为基本的正则表达式和扩展的正则表达式. 通常情况下,grep使用的是基本的正则表达式,如果要使用扩展的正则表达式,可以用-E选项,等同于egrep grep的其他一些选项: -A n:显示匹配行后面的n行,(after). -B n:显示匹配行前面的n行,(before). -C n:显示前后各n行.(context) 示例1: [[email protected] tmp]# grep --color -A 1 '^cpu MHz' /proc/cpuinfo  cpu MHz  

MFC总结之CListCtrl用法及技巧(二)

续第一篇:MFC总结之CListCtrl用法及技巧(一) http://blog.csdn.net/zwgdft/article/details/7560592 本篇重点介绍:禁止拖动表头.让第一列居中显示.设置行高与字体.虚拟列表技术.点击表头时进行归类.向上与向下移动.动态调整大小问题.避免闪烁问题. 6.禁止拖动表头 重载OnNotify消息响应函数,屏蔽两个消息通知码:HDN_BEGINTRACKW 和HDN_DIVIDERDBLCLICKW.示例如下: BOOL CXXXX::OnNo

C#枚举总结和其扩展用法(通过枚举描设置枚举值)

C#中枚举是一个非常好用的类型,用会了之后确实方便了很多. 项目中一个枚举类型: public enum Version_Type : byte { [Description("1997版")] 版本1997 = 0 , [Description("2007版")] 版本2007 } 枚举类型的默认类型是int型,可以改变其使用的类型,需要用(: <type>)来进行设置,上例中<type>为byte,也可以用其它类型(byte,sbyte,

vue自定义指令clickoutside使用以及扩展用法

vue自定义指令clickoutside使用以及扩展用法 产品使用vue+element作为前端框架.在功能开发过程中,难免遇到使用element的组件没办法满足特殊的业务需要,需要对其进行定制,例如要求选择器的弹出框中,增加搜索过滤(跟目前element的输入建议不太一样).于是想说说之前修改element组件,并定制为业务组件过程中遇到的问题. ps:因为对某些组件改动很大,所以是直接拷贝了一份源码,然后再进行修改,但是这样会遇到挺多问题,建议对于vue组件如果改动不大,只是简单功能扩展,就

MFC CListCtrl的简单用法

一篇对CListCtrl用法介绍较详细的文章: http://www.cnblogs.com/wind-net/archive/2012/10/30/2745817.html CListCtrl的最基本使用方法: 定义样式 DWORD dwStyle = m_listctrl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLI