改變 CListCtrl、CHeaderCtrl 高度、字體、顏色和背景

改變 CListCtrl、CHeaderCtrl 高度、字體、顏色和背景

本文示例源代碼或素材下載

  一、 實現過程

  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 高度、字體、顏色和背景

 三、使用方法

  把HeaderCtrlCl.h, HeaderCtrlCl.cpp, ListCtrlCl.h, ListCtrlCl.cpp添加到你的工程中,在拖一個CListCtrl控件到對話框上,添加成員變量,然後在頭文件中#include “ListCtrlCl.h”,把剛添加的成員變量類型改爲 CListCtrlCl ,在對話框的OnInitDialog()中添加初始化代碼:


m_ListCtrl.SetColColor(0,RGB(10,150,20)); //設置列背景色
m_ListCtrl.SetColColor(2,RGB(30,100,90)); //設置列背景色
m_ListCtrl.SetBkColor(RGB(50,10,10));    //設置背景色
m_ListCtrl.SetItemColor(1,1,RGB(100,100,10)); //設置指定單元背景色
m_ListCtrl.SetRowHeigt(25);        //設置行高度
m_ListCtrl.SetHeaderHeight(1.5);     //設置頭部高度
m_ListCtrl.SetHeaderFontHW(16,0);  //設置頭部字體高度,和寬度,0表示缺省,自適應
m_ListCtrl.SetHeaderTextColor(RGB(255,200,100)); //設置頭部字體顏色
m_ListCtrl.SetTextColor(RGB(0,255,255)); //設置文本顏色
m_ListCtrl.SetHeaderBKColor(100,255,100,8); //設置頭部背景色
m_ListCtrl.SetFontHW(15,0);        //設置字體高度,和寬度,0表示缺省寬度
m_ListCtrl.SetColTextColor(2,RGB(255,255,100)); //設置列文本顏色
m_ListCtrl.SetItemTextColor(3,1,RGB(255,0,0)); //設置單元格字體顏色
四、結語

  本文僅介紹了一些主要的修改地方,詳細請看源代碼。對於修改類的不足和錯誤的地方請批評指正,本人十分感激。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章