当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 在List Control中实现列表项目的上下移动

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

VC++ 中的 在List Control中实现列表项目的上下移动


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

在List Control中实现列表项目的上下移动


作者/杨剑


下载源代码



前言
List Control是Visual C++的一个通用控件,在很多程序中都有对它的使用,比如Windows 2000任务管理器的进程显示,就是一个报表样式的List Control。有时候,我们编程不仅需要使用List Control来显示数据,同时还希望能在控件中作一些简单编辑,比如可以上下移动某个选定的列表项,这就是本文所要讨论的内容。

介绍
本文的示例程序界面如图一所示,移动列表项后的示例如图二所示。


图一


图二

实现原理
要实现表项目的上下移动,思路其实很简单。首先,我们要得到用户所选列表项目的索引,这可以通过调用CListCtrl类的两个成员函数GetFirstSelectedItemPosition( )和GetNextSelectedItem( POSITION& pos )来实现。
得到用户所选列表项目的索引后,就好办了,我们可以通过删除项目,再添加项目的方法来达到移动列表项目的目的,假定在List Control中用户选择了第i+1项,由于List Control中项目的索引是从0开始的,那么该项的索引值就是i,先用GetItemText( int nItem, int nSubItem )来得到索引为i的项目的各列文本,然后删除该项,最后在索引为i-1的位置将我们刚才得到的文本作为新项目插进来,那么用户所选列表项就向上移动了一位,如果是在索引为i+1的位置插入新项目,那么用户所选列表项就向下移动了一位。

实现方法
新建一个基于对话框的工程,命名为LCDemo,然后在对话框中按照图一所示添加一个List Control和两个Button,设置List Control样式为Report。为List Control关联一个变量m_listCtrl,并通过ClassWizard为List Control和Button添加Click消息的响应函数。
先在OnInitDialog()函数中对控件初始化,就是为List Control添加列,并插入10行列表项目,详细内容请参考附带的源代码,我只想列出主要的代码片断。
为对话框类定义一个整型变量IndexInFieldList,用它来存储项目索引,把下面代码粘贴到CLCDemoDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 函数中。

void CLCDemoDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) { POSITION pos; pos = m_listCtrl.GetFirstSelectedItemPosition(); // 得到项目索引 IndexInFieldList = m_listCtrl.GetNextSelectedItem(pos); *pResult = 0;} 
在向上移动操作按钮的WM_CLICK消息响应函数中写入下面代码。
void CLCDemoDlg::OnButtonUp() { m_listCtrl.SetFocus(); if (IndexInFieldList == -1)	return; // 判断所选项是否位于行首 if (IndexInFieldList == 0) {	AfxMessageBox("已经位于第一行!");	return; } // 提取所选列表项各列类容 CString tempField1, tempField2, tempField3; tempField1 = m_listCtrl.GetItemText(IndexInFieldList, 0); tempField2 = m_listCtrl.GetItemText(IndexInFieldList, 1); tempField3 = m_listCtrl.GetItemText(IndexInFieldList, 2); // 删除所选列表项 m_listCtrl.DeleteItem(IndexInFieldList); // 在IndexInFieldList-1位置处插入上面所删列表项的各列类容 int tempItem; tempItem = m_listCtrl.InsertItem(IndexInFieldList-1, _T(tempField1)); m_listCtrl.SetItemText(tempItem, 1, _T(tempField2)); m_listCtrl.SetItemText(tempItem, 2, _T(tempField3)); IndexInFieldList--; // 使得IndexInFieldList-1位置处项目高亮显示并获得焦点 UINT flag = LVIS_SELECTED|LVIS_FOCUSED; m_listCtrl.SetItemState(IndexInFieldList, flag, flag);} 
向下移动操作按钮的响应函数代码与上面的代码类似,请参考本文所附源代码,因为代码有相关中文注释,这里我就不再赘述了。

运行情况