mfc listctrl控件,clistctrl控件
续第一篇:MFC总结之CListCtrl用法及技巧(一)http://blog . . net/zwgdft/article/details/7560592本篇重点介绍:禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与向下移动、动态调整大小问题、避免闪烁问题
6、禁止拖动表头重载通知消息响应函数,屏蔽两个消息通知码:HDN _贝京茨科和海腾远程服务器分布技术分割线示例如下:
【cpp】查看plaincopyprint?
BOOLCXXXX:on notify(WPARAMwParam,LPARAMlParam,LRESULT * pResult){//TODO:addyourspecializedcodereand/orcallthebaseclass//屏蔽两个消息通知码,使得禁止拖动目录表头nm header * pnm header=(nm header *)lParam;如果((pnm标题-HDRcode==HDN _ begin trackww)(pnm header-HDRcode==HDN _ dividerdblickw))){ * pResult=TRUE;return true } return cdialog:on notify(wParam,lParam,pResult);} BOOL cxxxx:on notify(WPARAM WPARAM,LPARAM lParam,LRESULT* pResult)
//TODO:在此添加您的专用代码和/或调用基类
//屏蔽两个消息通知码,使得禁止拖动目录表头
nm header * pnm header=(nm header *)lParam;
如果(((pnm标题-HDRcode==HDN _ BEGINTRACKW)
(pnm标题-HDRcode==HDN _ dividerdblickw)))
* pResult=TRUE
返回真实的
返回CDialog:OnNotify(wParam,lParam,pResult);
}
7、让第一列居中显示在插入列时,我们可以通过参数信息格式来设置文本居中显示,但是这种设置对于第一列是没有作用的这时我们可以考虑将我们的内容从第二列开始插入(设置为居中显示)先插入第一列,然后删除第一列,这样原先的第二列就充当了第一列
8、设置行高和字体设置CListCtrl的行高没有函数接口,可以通过自绘来实现,但是比较麻烦有一个比较简单的方法是通过使用一个空白的图像将行撑起来,使其高度发生变化示例如下:
【cpp】查看plaincopyprint?
CImageListm _ imagem_image .Create(1,24,ILC_COLOR32,1,0);m_listInfo .SetImageList( m_image,LVSIL _ SMALL);CImageList m _ image
m_image .Create(1,24,ILC_COLOR32,1,0);
m_listInfo .SetImageList( m_image,LVSIL _ SMALL);对于字体的设置,我们可以使用设置字体函数来实现以修改列表视图的字体为例,在OnInitialUpdate函数中插入列之前调用SetFontSelf函数(该函数自定义,如下示例所示)首先创建一个字体,然后调用设置字体进行设置需要注意的是,在退出时需要删除掉创建的字体,避免内存泄露查看plaincopyprint?
//设置字体和大小voidCMyListView:set font self(intn height,lpctstrlpspzpfacename){//先删除原有字体如果(m_font!=NULL)deletem _ font;m _ font=newCFont//创建字体m_font- CreateFont(nHeight,//nHeight 0,//nWidth 0,//nEscapement 0,//nOrientation FW_NORMAL,//nWeight FALSE,//bItalic FALSE,//bUnderline 0,//cStrikeOut ANSI_CHARSET,//nCharSet OUT_DEFAULT_PRECIS,//nOutPrecision CLIP _ DEFAULT _ PRECIS,//nClipPrecision DEFAULT _ QUALITY,//n QUALITY DEFAULT _ PITCH FF _ SWISS,//npitchhandhandfamily lpszFacename);//lpszFacename //设置字体clist ctrl the ctrl=getlist ctrl();//获取控制权,引用变量第一集.SetFont(m_font,TRUE);}//设置字体和大小
void CMyListView:set font self(int n height,LPCTSTR lpszFacename)
//先删除原有字体
如果(m_font!=空)
删除m _字体
m _ font=新CFont
//创建字体
m_font- CreateFont(
高度,//高度
0,//n宽度
0,//nEscapement
0,//n方向
FW_NORMAL,//NW权重
FALSE,//bItalic
FALSE,//bUnderline
0,//cStrikeOut
ANSI_CHARSET,//nCharSet
OUT_DEFAULT_PRECIS,//nOutPrecision
CLIP_DEFAULT_PRECIS,//nClipPrecision
默认质量,//n质量
DEFAULT_PITCH FF_SWISS,//nPitchAndFamily
lpszFacename);//lpszFacename
//设置字体
clist ctrl the ctrl=getlist ctrl();//获取控制权,引用变量
第一集.SetFont(m_font,TRUE);
}
9、虚拟列表技术给一个链接,介绍的比较详细:http://嗨百度一下com/qi _ xian/blog/item/929 b 04 ce 27d 02 c 0592457 ef 8超文本标记语言
当数据量较大时,使用InsertItem插入数据的过程非常长这时,我们有两种方法可以解决这个问题:一种是使用CListCtrl的虚拟列表技术,另一种是使用分页显示的方法对于虚拟列表技术,上面链接中的文章非常详细我用了它的比较简单的方法,然后就换成分页的方法了
使用虚拟列表技术,有三件事需要明确:
①使用虚拟技术时,需要将CListCtrl控件的Owner Data属性设置为true
②向虚拟列表添加元素时,不需要使用InserItem函数可以通过调用SetItemCount来设置数据的总数,然后系统会生成不同的消息,在相应的消息响应函数中完成插入
③虚拟列表向父窗口发送的消息有三种:(1)当它需要数据时,发送LVN_GETDISPINFO消息;⑵当用户试图查找一个元素时,发送LVN_ODFINDITEM消息;⑵当需要缓存数据时,发送LVN_ODCACHEHINT消息
我们在使用LVN_GETDISPINFO的消息处理函数插入元素时,首先要检查列表请求的是什么数据(比如LVIF_TEXT,LVIF_IMAGE等),然后插入不同的子项例子如下:
【cpp】查看plaincopyprint?
void CDATA analysis:onlvgetdispinfoanalysis list(nmh dr * pnm HDR,LRESULT * pResult){ NMLVDISPINFO * pDispInfo=reinterpret _ cast NMLVDISPINFO *(pnm HDR);//TODO:addyourcontrolnotificationhandlercode here LV _ ITEM * pItem=(pDispInfo)-ITEM;intitemindex=pItem-iItem;size _ t converted=0;wchar _ twStr[30];//Unicode string if(pItem-mask LVIF _ TEXT)//string buffer area有效{ switch(pItem-isubitem){ case 0://填写数据项名称,xxxxx
指示字符mbstowcs_s( converted,wStr,30,