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

评论