专题3:如何使列头响应右击消息?
我们知道在ClistCtrl中是可以响应列头单击的,如响应消息LVN_COLUMNCLICK,但是不能响应右击.怎么办呢?
(1)
实际上我们可以把CListCtrl(Report风格)看成由子窗口CHeaderCtrl和下面的视图组成,所以我们决定重写CHeaderCtrl.
派生一个类于CHeaderCtrl,响应右击:
void CMyHeadCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CHeaderCtrl::OnRButtonDown(nFlags, point);
}在其中编写你想要的代码.这里完成了第一步.
(2)
此时还没有安装到ClistCtrl 上呢?想什么办法安装呢?以前在重写控件的时候,是通过在ClassWizard中定义变量来实现的,现在显然不行.因为ClistCtrl自己就是一个控件了.难道就没有办法了吗?
有.在CListCtrl中不是有个函数是GetHeaderCtrl吗?它不就是获得列头的指针吗?我们应该怎样利用它呢?
在想想子类化的方法:
如果我们重写了一个控件,如CMyEdit(派生于CEdit),现在要安装,除了在classwizard中安装以外,还可以在OnInitDialog中进行子类化:
.h:
CMyEdit m_edit;
.cpp:
m_edit.SubClassDlgItem(IDC_EDIT1,this);
(3) 回到我们这里的话题.显然不能用subclassDlgItem了,因为列头没有什么标识号,不过还可以用SubClassWindow,参数正好是一个句柄.
实现如下:
重写Cmylist(CListCtrl的派生类)虚函数:
void Cmylist::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
m_headctrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
CListCtrl::PreSubclassWindow();
}
安装成功!!!
正文
CListCtrl学习笔记(4)---中级篇(3)2007-01-03 17:56:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/yuqiexing/22197.html
阅读(3909) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论