原文地址:http://www.cctry.com/thread-289436-1-1.html
今天有位会员提了一个问题,关于如何让 ListCtrl控件 的列头 header 支持多行显示,如下图:
我查了一下,默认情况下是不可以的,即使在 InsertColumn 的时候列头的标题中含有换行符 \n 也是不行的。于是想到了 codeproject 上面能不能有,于是到上面去搜索了一下,还真找到了。
转载地址: https://www.codeproject.com/Articles/510/A-Multiline-Header-Control-Inside-a-CListCtrl
实现的界面如图:
跟会员的要求基本一致。这里面拿过来分享给大家。
使用方法:
1、添加 HeaderCtrlExt.h 和 HeaderCtrlExt.cpp 文件到你的工程中;
2、在 CListView 或者 CListCtrl 的派生类中添加一个 CHeaderCtrlEx 类型的成员变量,以及 CFont 类型的成员变量;
3、如果使用的是 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 的派生类,那么在 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);
- }
OK了,说道这里,基本上完结了。大家不妨试试!相关源码文件在附件中,回复后可见!