WEB开发网
开发学院软件开发VC 改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和... 阅读

改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景

 2009-02-07 20:00:42 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 一、 实现过程 1.表头修改新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,代码如下:void

本文示例源代码或素材下载

一、 实现过程

1.表头修改

新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头文件中定义函数

LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后手动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变高度,实现代码如下:

LRESULT CHeaderCtrlCl::OnLayout( WPARAM wParam, LPARAM lParam )
{
  LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);
  HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;
  RECT *prc = hdl.prc;
  WINDOWPOS *pwpos = hdl.pwpos;
  int nHeight = (int)(pwpos->cy * m_Height); //改变高度,m_Height为倍数
  pwpos->cy = nHeight;
  prc->top = nHeight;
  return lResult;
}
2. 表的修改

新建一个MFC类CListCtrlCl,其基类为CListCtrl,定义一个CHeaderCtrlCl的成员变量m_Header,重载PreSubclassWindow(),在函数中修改控件类型为自绘模式,然后子类化表头,代码如下:

void CListCtrlCl::PreSubclassWindow()
{
  // TODO: 在此添加专用代码和/或调用基类
  ModifyStyle(0,LVS_OWNERDRAWFIXED);
  CListCtrl::PreSubclassWindow();
  CHeaderCtrl *pHeader = GetHeaderCtrl();
  m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}
添加成员变量,保存一些基本信息。CPtrList m_ptrListCol; //保存列颜色
CPtrList m_ptrListItem; //保存Item颜色表
CPtrList m_colTextColor; //保存列字体颜色
CPtrList m_ItemTextColor; //保存单元格字体颜色
重载DrawItem()实现自绘,实现代码请参照代码。 手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
  if (m_nRowHeight>0)
  {
    lpMeasureItemStruct->itemHeight = m_nRowHeight;
  }
}
添加消息处理OnMeasureItem()void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
覆盖基类InsertColumn进行列信息保存int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
      int nFormat /* = LVCFMT_LEFT */,
      int nWidth /* = -1 */,
      int nSubItem /* = -1 */)
{
  m_Header.m_HChar.Add(lpszColumnHeading);
  if (nFormat==LVCFMT_LEFT)
  {
    m_Header.m_Format = m_Header.m_Format + "0";
  }
  else if (nFormat==LVCFMT_CENTER)
  {
    m_Header.m_Format = m_Header.m_Format + "1";
  }
  else if (nFormat==LVCFMT_RIGHT)
  {
    m_Header.m_Format = m_Header.m_Format + "2";
  }
  else
  {
    m_Header.m_Format = m_Header.m_Format + "1";
  }
  return CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
}
二、运行效果图如下:

改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景

1 2  下一页

Tags:改变 CListCtrl CHeaderCtrl

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接