正文

CListCtrl学习笔记(4)---中级篇(3)2007-01-03 17:56:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/22197.html

分享到:

专题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();
}
安装成功!!!

阅读(3909) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册