列表控件(CListCtrl)的顶部有一排按钮,用户可以通过选择不同的列来对记录进行排序请问如何实现?最好有源码。。谢谢。。
解决方案 »
- 求解!Tab control里加了三个页面,有一个页面,点击某处,会显示另一个页面在这里的按钮!
- MFC画图——OnPaint()函数画图(双缓冲画图)
- MFC 画图颜色覆盖变色
- 請教一個關於CEdit的菜鳥問題!怎麼讓它滾動,在線等阿
- 写数据查询代码时出现的错误,因为是菜鸟,所以苦恼万分!救急!
- 怎么模拟输入TAB键?
- 大家来谈谈C#!
- 请讨论一下中国程序员的去路
- 急,请问为什么用RedrawWindow重绘窗口之后,checkbox控件就不显示了呢?最小化再恢复又可以看见。
- 用VC编的的OpenGL程序为什么显示不出来?(但是在有的机器上可以显示,但是别的机器显示不了)
- 对话框和控件
- 文件copy出错
a.向对话框中添加CListCtrl m_List绑定到对话框上的控件,添加bool asc,初始化为false;
在对话框的头文件中加入一个排序器:
struct MyData
{
CListCtrl* List;
bool asc;
int iSubItem;
};
再加一个回调函数的声明语句:
static int CALLBACK SortItem(LPARAM,LPARAM,LPARAM);
此语句用于当m_List调用SortItem方法时,执行的排序算法。
b.添加一个LVN_COLUMNHEADER的通知消息,
加入消息声明:
afx_msg void OnColumnClick(NMHDR* pnmhdr,LRESULT* presult);
加入消息注册:
ON_NOTIFY(LVN_COLUMNCLICK,IDC_LIST1,&CMyListCtrlDlg::OnColumnClick)
加入消息体:
void CMyListCtrlDlg::OnColumnClick(NMHDR* pnmhdr,LRESULT* presult)
{
LPNMLISTVIEW listView=(LPNMLISTVIEW)pnmhdr;
int index=listView->iSubItem;//将子列索引增加到排序器中
MyData mydata;
mydata.asc=this->asc;
mydata.iSubItem=index;//将项目索引增加到排序器中
mydata.List=&m_List;
m_List.SortItems((PFNLVCOMPARE)SortItem,(DWORD_PTR)&mydata);
asc=!asc;//如果当前为升序排序,那么之后则为降序}
CListCtrl的SortItems方法会调用PFNLVCOMPARE类型的方法,此方法的第三个参数将接受mydata排序器,调用CListCtrl的SortItems会把排序器指针送入。
c.添加回调函数SortItem的实现:
int CALLBACK SortItem(LPARAM param1,LPARAM param2,LPARAM sortor)
{
MyData* data=(MyData*)sortor;
CListCtrl* list=data->List;
LVFINDINFO fi;
fi.flags=LVFI_PARAM;
fi.lParam=param1;
LVFINDINFO fi1;
fi1.flags=LVFI_PARAM;
fi1.lParam=param2;
int index1=list->FindItem(&fi);//从LVITEM结构中的lParam成员来查找对应项的索引号
int index2=list->FindItem(&fi1);
CString text1=list->GetItemText(index1,data->iSubItem);//得到指定行和列号的单元格文本
CString text2=list->GetItemText(index2,data->iSubItem);
LPTSTR txt1=text1.GetBuffer();//以下七句用于将CString转化成const char*
LPTSTR txt2=text2.GetBuffer();
USES_CONVERSION;
const char* pSth1=T2A(txt1);
const char* pSth2=T2A(txt2);
text1.ReleaseBuffer();
text2.ReleaseBuffer();
if(data->asc)
{ return strcmp(pSth2,pSth1);
}
else
{
return strcmp(pSth1,pSth2);
}
return 0;
注意:回调函数中的param1和param2都是指添加列表项时用的LVITEM结构中的成员lParam,因此为了使排序生效,必须将第一个列表项采用LVITEM结构的方式添加,并且LVITEM结构中的成员lParam必须有效且唯一。当回调函数返回TRUE时,会按升序的方式,返回FALSE时,则会按降序的方式。
http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=323