让ListCtrl的列头支持多行显示

原文地址: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 函数中添加如下代码:
  1. ///////////////////////SET UP THE MULTILINE HEADER CONTROL

  2. //m_NewHeaderFont is of type CFont
  3. m_NewHeaderFont.CreatePointFont(190,"MS Serif"); 

  4. CHeaderCtrl* pHeader = NULL;
  5. pHeader=GetHeaderCtrl();

  6. if(pHeader==NULL)
  7.         return;
  8.         
  9. VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd));        

  10. //A BIGGER FONT MAKES THE CONTROL BIGGER
  11. m_HeaderCtrl.SetFont(&m_NewHeaderFont);

  12. HDITEM hdItem;
  13. hdItem.mask = HDI_FORMAT;

  14. for(i=0; i < m_HeaderCtrl.GetItemCount(); i++)
  15. {
  16.         m_HeaderCtrl.GetItem(i,&hdItem);
  17.         hdItem.fmt|= HDF_OWNERDRAW;
  18.         m_HeaderCtrl.SetItem(i,&hdItem);
  19. }
复制代码


如果使用的是 CListView 的派生类,那么在 OnInitialUpdate 函数中添加如下代码:
  1. ///////////////////////SET UP THE MULTILINE HEADER CONTROL
  2. //m_NewHeaderFont is of type CFont
  3. m_NewHeaderFont.CreatePointFont(190,"MS Serif"); 

  4. CListCtrl& ListCtrl = GetListCtrl();

  5. CHeaderCtrl* pHeader = NULL;
  6. pHeader=ListCtrl.GetHeaderCtrl();

  7. if(pHeader==NULL)
  8.         return;
  9.         
  10. VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd));        

  11. //A BIGGER FONT MAKES THE CONTROL BIGGER
  12. m_HeaderCtrl.SetFont(&m_NewHeaderFont);

  13. HDITEM hdItem;

  14. hdItem.mask = HDI_FORMAT;

  15. for(i=0; i < m_HeaderCtrl.GetItemCount(); i++)
  16. {
  17.         m_HeaderCtrl.GetItem(i,&hdItem);
  18.         hdItem.fmt|= HDF_OWNERDRAW;
  19.                 
  20.         m_HeaderCtrl.SetItem(i,&hdItem);
  21. }
复制代码


OK了,说道这里,基本上完结了。大家不妨试试!相关源码文件在附件中,回复后可见!

帖子地址:http://www.cctry.com/thread-289436-1-1.html

猜你喜欢

转载自blog.csdn.net/net_syc/article/details/79629782