自定义类"CMyListCtrl"的头文件中的代码如下:
#pragma once
#include "HeaderCtrlEx.h"
// CMyListCtrl
class CMyListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
public:
CMyListCtrl();
virtual ~CMyListCtrl();
protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
public:
CHeaderCtrlEx m_ctrlHeader;
};
/****************************************CMyListCtrl.h****************************************************/自定义类"CMyListCtrl"的cpp文件中的代码如下:
/****************************************CMyListCtrl.cpp****************************************************/
//子类化CHeaderCtrlEx
void CMyListCtrl::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CListCtrl::PreSubclassWindow();
m_ctrlHeader.SubclassWindow(::GetDlgItem(m_hWnd,0));
}
/****************************************CMyListCtrl.cpp****************************************************/集成父类"CHeaderCtrl"的自定义子类CHeaderCtrlEx的头文件如下:
/****************************************CHeaderCtrl.h****************************************************/
#pragma once
// CHeaderCtrlEx
class CHeaderCtrlEx : public CHeaderCtrl
{
DECLARE_DYNAMIC(CHeaderCtrlEx)
public:
CHeaderCtrlEx();
virtual ~CHeaderCtrlEx();
protected:
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnChildNotify(UINT msg,WPARAM wp,LPARAM lp,LRESULT* pRes);
};
/****************************************CHeaderCtrl.h****************************************************/对应的cpp文件的代码如下:
/****************************************CHeaderCtrl.cpp****************************************************/
//固定列宽
BOOL CHeaderCtrlEx::OnChildNotify(UINT msg,WPARAM wp,LPARAM lp,LRESULT* pRes)
{
NMHDR& nmh = *(NMHDR*)lp;
if (nmh.code == HDN_BEGINTRACKA || nmh.code == HDN_BEGINTRACKW) {
if (m_bLocked)
return *pRes=TRUE; // eat message to disallow sizing
}
else if(nmh.code == HDN_DIVIDERDBLCLICKA || nmh.code == HDN_DIVIDERDBLCLICKW)
{
if (m_bLocked)
return *pRes=TRUE; // eat message to disallow sizing
}
return CHeaderCtrl::OnChildNotify(msg,wp,lp,pRes);
}或者用下面的方法:
CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)m_ListCtrl.GetHeaderCtrl();
pHeaderCtrl->EnableWindow( FALSE );