65.9K
CodeProject 正在变化。 阅读更多。
Home

CListCtrl 内部的多行标题控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (13投票s)

2000年5月8日

viewsIcon

437851

downloadIcon

7588

如何使 CListCtrl 的标题变为多行

  • 下载源文件 - 18.8 Kb
  • 下载演示项目 - 8 Kb

    Sample Image - HeaderCtrlEx.jpg

    首先,我必须提到 Alon Peleg 帮助我找到了问题的解决方案,因此我认为以作者的名义提及他的名字是公平的。

    在一个最近的项目中,我需要将 CListCtrl 的标题控件设置为多行。这个小项目展示了如何通过子类化 CListCtrlCHeaderCtrl 来实现它。

    如果您想使用这段代码,只需将 HeaderCtrlExt.h 和 HeaderCtrlExt.cpp 文件添加到您的源代码中即可。

    此外,在您的 CListViewCListCtrl 派生类中,添加一个类型为 CHeaderCtrlEx 的成员变量和一个类型为 CFont 的成员变量。

    如果您正在使用没有视图的 CListCtrl,则将以下代码放在 CListCtrlOnCreate 处理程序的末尾。

    ///////////////////////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 或任何由其派生的类,则将以下代码添加到 CListViewOnInitialUpdate 重写中。

    ///////////////////////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);
    }
    

    这两段代码之间的唯一区别在于我们获取标题控件指针的方式。

    就这样。尽情享受吧!

  • © . All rights reserved.