CListCtrl 内部的多行标题控件






4.95/5 (13投票s)
2000年5月8日

437851

7588
如何使 CListCtrl 的标题变为多行
首先,我必须提到 Alon Peleg 帮助我找到了问题的解决方案,因此我认为以作者的名义提及他的名字是公平的。
在一个最近的项目中,我需要将 CListCtrl
的标题控件设置为多行。这个小项目展示了如何通过子类化 CListCtrl
的 CHeaderCtrl
来实现它。
如果您想使用这段代码,只需将 HeaderCtrlExt.h 和 HeaderCtrlExt.cpp 文件添加到您的源代码中即可。
此外,在您的 CListView
或 CListCtrl
派生类中,添加一个类型为 CHeaderCtrlEx
的成员变量和一个类型为 CFont
的成员变量。
如果您正在使用没有视图的 CListCtrl
,则将以下代码放在 CListCtrl
的 OnCreate
处理程序的末尾。
///////////////////////SET UP THE MULTILINE HEADER CONTROL //m_NewHeaderFont is of type CFont m_NewHeaderFont.CreatePointFont(190,"MS Serif"); CHeaderCtrl* pHeader = NULL; pHeader=GetHeaderCtrl(); if(pHeader==NULL) return; VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd)); //A BIGGER FONT MAKES THE CONTROL BIGGER m_HeaderCtrl.SetFont(&m_NewHeaderFont); HDITEM hdItem; hdItem.mask = HDI_FORMAT; for(i=0; i < m_HeaderCtrl.GetItemCount(); i++) { m_HeaderCtrl.GetItem(i,&hdItem); hdItem.fmt|= HDF_OWNERDRAW; m_HeaderCtrl.SetItem(i,&hdItem); }
如果您正在使用 CListView
或任何由其派生的类,则将以下代码添加到 CListView
的 OnInitialUpdate
重写中。
///////////////////////SET UP THE MULTILINE HEADER CONTROL //m_NewHeaderFont is of type CFont m_NewHeaderFont.CreatePointFont(190,"MS Serif"); CListCtrl& ListCtrl = GetListCtrl(); CHeaderCtrl* pHeader = NULL; pHeader=ListCtrl.GetHeaderCtrl(); if(pHeader==NULL) return; VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd)); //A BIGGER FONT MAKES THE CONTROL BIGGER m_HeaderCtrl.SetFont(&m_NewHeaderFont); HDITEM hdItem; hdItem.mask = HDI_FORMAT; for(i=0; i < m_HeaderCtrl.GetItemCount(); i++) { m_HeaderCtrl.GetItem(i,&hdItem); hdItem.fmt|= HDF_OWNERDRAW; m_HeaderCtrl.SetItem(i,&hdItem); }
这两段代码之间的唯一区别在于我们获取标题控件指针的方式。
就这样。尽情享受吧!