当前位置: 首页 > 图文教程 > 开发语言 > VC++ > CSortListCtrl 加强版

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 CSortListCtrl 加强版


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 67 ::
收藏到网摘: n/a

CSortListCtrl 加强版

作者:刘良敏

下载源代码

  这是一个可以自由选择多个子项的列表控件。由于项目需要,使用了 CSortListCtrl 这个类,从“VC知识库” 网站下载的源码。我的项目中主要用到该类可方便变化 ITEM 颜色的优点。但是我项目中还要求可以通过鼠标拖动来选择多项,注意不是整行整行的选择,而是自由地选择。所以我把自己如何实现用鼠标拖动来选择多项 SubItem 的方法贴出来:主要思路:在 CSortListCtrl 类的 OnMouseMove 消息中处理,先判断鼠标左键是否按下,如果按下(这种状态其实就是鼠标的 Drag 状态),就获取鼠标目前所在的行号和列号,然后设置该行号和列号的颜色不同于一般情况下的颜色,以标识为被选中状态;同时把行号和列号存储起来用于后面的操作。

代码如下:

.h文件中:定义了两个变量用来存储选中的行和列

CUIntArray ITEM; //用于选中行号的集合CUIntArray SUBITEM; //用于选中列号的集合 

.cpp文件中的代码:

// TODO: 拖动鼠标消息处理函数 if(nFlags == MK_LBUTTON) {	LVHITTESTINFO hitTestInfo;	hitTestInfo.pt = point;	this->SubItemHitTest(&hitTestInfo);	this->SetItemColor(hitTestInfo.iItem,hitTestInfo.iSubItem,RGB(255,255,255),RGB(50,50,50));	for(int i=0;i < ITEM.GetCount();i++) //避免存储重复的SubItem。	{	if(hitTestInfo.iItem==ITEM.GetAt(i)&&hitTestInfo.iSubItem==SUBITEM.GetAt(i))	{	return;	}	this->ITEM.Add(hitTestInfo.iItem); //把选中的行号和列号一一对应的存入数组中	this->SUBITEM.Add(hitTestInfo.iSubItem);	} }CListCtrl::OnMouseMove(nFlags, point); 
下面两个消息处理函数:“开始拖动”和“单击”是为了解决重新拖动以及单击时清除前一次拖动所做的选择
void CSortListCtrl::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) {	LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);	// TODO: 开始拖动鼠标消息处理函数	this->SetItemState(pNMLV->iItem,0,LVIS_SELECTED); //取消当前被选中行的选中状态	//清空前一次拖动所做的选择	for(int i=0;i< ITEM.GetCount();i++)	{	this->SetItemColor(ITEM.GetAt(i),SUBITEM.GetAt(i),RGB(0,0,0),RGB(255,255,255));	??}	this->ITEM.RemoveAll();	this->SUBITEM.RemoveAll();	*pResult = 0; } void CSortListCtrl::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult) {	// TODO: 鼠标单击事件	for(int i=0;iITEM.GetCount();i++)	{	this->SetItemColor(this->ITEM.GetAt(i),this->SUBITEM.GetAt(i),RGB(0,0,0),RGB(255,255,255));	}	this->ITEM.RemoveAll();	this->SUBITEM.RemoveAll();	*pResult = 0; } 
  附加说明:我在这个项目中实现的功能是——对所选项右键单击,弹出快捷菜单,进行各种操作,如同时对所有选中的项进行“加法”、“减法”、“乘法”和“除法”等操作 。因为取得了选中的行号和列号,您可以根据自己的需要来实现对所选项的操作。