本文的代码也是根据网上现有的改编而来

首先是.h

#pragma once
#include "HeaderCtrlCl.h"
// CListCtrlClclass CListCtrlCl : public CListCtrl
{DECLARE_DYNAMIC(CListCtrlCl)public:CHeaderCtrlCl m_Header;CListCtrlCl();virtual ~CListCtrlCl();protected:DECLARE_MESSAGE_MAP()virtual void PreSubclassWindow();
public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
public:afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);afx_msg void OnLButtonDown(UINT nFlags, CPoint point){}afx_msg void OnRButtonDown(UINT nFlags, CPoint point){}
public:// 行高int m_nRowHeight;int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);
public:// Gradient - 渐变系数,立体背景用,不用渐变设为0void SetHeaderBKColor(int R, int G, int B, int Gradient);
public:// 设置表头高度void SetHeaderHeight(float Height);CPtrList m_ptrListCol;  //保存列颜色CPtrList m_ptrListItem; //保存Item颜色表CPtrList m_colTextColor; //保存列字体颜色CPtrList m_ItemTextColor; //保存单元格字体颜色CPtrList m_ItemFontSize;//保存单元格字体bool FindColColor(int col ,COLORREF &color); //查找列颜色bool FindItemColor(int col,int row,COLORREF &color);bool FindColTextColor(int col,COLORREF &color); //查找列字体颜色bool FindItemTextColor(int col,int row,COLORREF &color);bool FindItemFontSize(int col,int row,int &height,int &width);//查找字体大小void SetColColor(int col,COLORREF color);  //设置列颜色void SetItemColor(int col,int row,COLORREF color); //设置Item颜色void SetColTextColor(int col,COLORREF color);   //设置列文本颜色void SetItemTextColor(int col,int row,COLORREF color);void SetRowHeigt(int nHeight); //设置行高void SetHeaderFontHW(int nHeight,int nWith); //设置表头字体大小void SetHeaderTextColor(COLORREF color);COLORREF m_color;BOOL SetTextColor(COLORREF cr);void SetFontHW(int nHeight,int nWith);  //设置字体的高和宽void SetItemFontHW(int col,int row,int nHeight,int nWidth);
public:// 字体高度int m_fontHeight;
public:// 字体宽度int m_fontWith;
};

分割线


.cpp如下

#include "stdafx.h"
#include "ListCtrlCl.h"struct stColor
{int nRow;int nCol;COLORREF rgb;
};struct stFont
{int nRow;int nCol;int nFontWidth;int nFontHeight;
};
// CListCtrlClIMPLEMENT_DYNAMIC(CListCtrlCl, CListCtrl)CListCtrlCl::CListCtrlCl()
: m_nRowHeight(0)
, m_fontHeight(12)
, m_fontWith(0)
{m_color = RGB(0,0,0);
}CListCtrlCl::~CListCtrlCl()
{
}BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)ON_WM_MEASUREITEM()ON_WM_MEASUREITEM_REFLECT()ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()// CListCtrlCl 消息处理程序void CListCtrlCl::PreSubclassWindow()
{// TODO: 在此添加专用代码和/或调用基类ModifyStyle(0,LVS_OWNERDRAWFIXED);CListCtrl::PreSubclassWindow();CHeaderCtrl *pHeader = GetHeaderCtrl();m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{// TODO:  添加您的代码以绘制指定项TCHAR lpBuffer[256];LV_ITEM lvi;lvi.mask = LVIF_TEXT | LVIF_PARAM ;lvi.iItem = lpDrawItemStruct->itemID ; lvi.iSubItem = 0;lvi.pszText = lpBuffer ;lvi.cchTextMax = sizeof(lpBuffer);VERIFY(GetItem(&lvi));LV_COLUMN lvc, lvcprev ;::ZeroMemory(&lvc, sizeof(lvc));::ZeroMemory(&lvcprev, sizeof(lvcprev));lvc.mask = LVCF_WIDTH | LVCF_FMT;lvcprev.mask = LVCF_WIDTH | LVCF_FMT;CDC* pDC;pDC = CDC::FromHandle(lpDrawItemStruct->hDC);CRect rtClient;GetClientRect(&rtClient);for ( int nCol=0; GetColumn(nCol, &lvc); nCol++){if ( nCol > 0 ) {// Get Previous Column Width in order to move the next display itemGetColumn(nCol-1, &lvcprev) ;lpDrawItemStruct->rcItem.left += lvcprev.cx ;lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; }CRect rcItem;   if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))   continue;   ::ZeroMemory(&lvi, sizeof(lvi));lvi.iItem = lpDrawItemStruct->itemID;lvi.mask = LVIF_TEXT | LVIF_PARAM;lvi.iSubItem = nCol;lvi.pszText = lpBuffer;lvi.cchTextMax = sizeof(lpBuffer);VERIFY(GetItem(&lvi));CRect rcTemp;rcTemp = rcItem;if (nCol==0){rcTemp.left -=2;}if ( lpDrawItemStruct->itemState & ODS_SELECTED ){pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;}else{COLORREF color;color = GetBkColor();pDC->FillSolidRect(rcTemp,color);if (FindColColor(nCol,color)){pDC->FillSolidRect(rcTemp,color);}if (FindItemColor(nCol,lpDrawItemStruct->itemID,color)){pDC->FillSolidRect(rcTemp,color);}//pDC->SetTextColor(m_color);}pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));UINT   uFormat    = DT_CENTER ;if (m_Header.m_Format[nCol]=='0'){uFormat = DT_LEFT;}else if (m_Header.m_Format[nCol]=='1'){uFormat = DT_CENTER;}else if (m_Header.m_Format[nCol]=='2'){uFormat = DT_RIGHT;}pDC->SetTextColor(m_color);COLORREF color;if (FindColTextColor(nCol,color)){pDC->SetTextColor(color);}if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color)){pDC->SetTextColor(color);}CFont nFont ,* nOldFont; int fontheight, fontwidth;if(FindItemFontSize(nCol,lpDrawItemStruct->itemID,fontheight,fontwidth)){nFont.CreateFont(fontheight,fontwidth,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont);int ofst;ofst = rcItem.Height() - fontheight;rcItem.OffsetRect(0,ofst/2);//居中显示}else{nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont);TEXTMETRIC metric;metric.tmHeight;pDC->GetTextMetrics(&metric);int ofst;ofst = rcItem.Height() - metric.tmHeight;rcItem.OffsetRect(0,ofst/2);//居中显示}DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat) ;DeleteObject(&nFont);pDC->SelectStockObject(SYSTEM_FONT) ;}}void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{if (m_nRowHeight>0){lpMeasureItemStruct->itemHeight = m_nRowHeight;}
}
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);
}
// Gradient - 渐变系数,立体背景用,不用渐变设为0
void CListCtrlCl::SetHeaderBKColor(int R, int G, int B, int Gradient) //设置表头背景色
{m_Header.m_R = R;m_Header.m_G = G;m_Header.m_B = B;m_Header.m_Gradient = Gradient;
}// 设置表头高度
void CListCtrlCl::SetHeaderHeight(float Height) //设置表头高度
{m_Header.m_Height = Height;
}
bool CListCtrlCl::FindColColor(int col,COLORREF &color) //查找列颜色
{int flag = 0;for (POSITION pos = m_ptrListCol.GetHeadPosition();pos!=NULL;){stColor *pColor = (stColor*)m_ptrListCol.GetNext(pos);if (pColor->nCol==col){flag = 1;color = pColor->rgb;break;}}if (1==flag){return true;}return false;
}
bool CListCtrlCl::FindItemColor(int col,int row,COLORREF &color) //查找颜色
{int flag = 0;for (POSITION pos = m_ptrListItem.GetHeadPosition();pos!=NULL;){stColor *pColor = (stColor*)m_ptrListItem.GetNext(pos);if (pColor->nCol==col&&pColor->nRow==row){flag = 1;color = pColor->rgb;break;}}if (1==flag){return true;}return false;
}
void CListCtrlCl::SetColColor(int col,COLORREF color) //设置列颜色
{stColor *pColor  = new stColor;pColor->nCol = col;pColor->rgb = color;m_ptrListCol.AddTail(pColor);
}
void CListCtrlCl::SetItemColor(int col,int row,COLORREF color) //设置格子颜色
{stColor *pColor  = new stColor;pColor->nCol = col;pColor->nRow = row;pColor->rgb = color;m_ptrListItem.AddTail(pColor);
}
void CListCtrlCl::SetRowHeigt(int nHeight) //高置行高
{m_nRowHeight = nHeight;CRect rcWin;GetWindowRect(&rcWin);WINDOWPOS wp;wp.hwnd = m_hWnd;wp.cx = rcWin.Width();wp.cy = rcWin.Height();wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
}
void CListCtrlCl::SetHeaderFontHW(int nHeight,int nWith) //设置头部字体宽和高
{m_Header.m_fontHeight = nHeight;m_Header.m_fontWith = nWith;
}
void CListCtrlCl::SetHeaderTextColor(COLORREF color) //设置头部字体颜色
{m_Header.m_color = color;
}
BOOL CListCtrlCl::SetTextColor(COLORREF cr)  //设置字体颜色
{m_color = cr;return TRUE;
}
void CListCtrlCl::SetFontHW(int nHeight,int nWith) //设置字体高和宽
{m_fontHeight = nHeight;m_fontWith = nWith;
}
void CListCtrlCl::SetColTextColor(int col,COLORREF color)
{stColor *pColor = new stColor;pColor->nCol = col;pColor->rgb = color;m_colTextColor.AddTail(pColor);
}bool CListCtrlCl::FindColTextColor(int col,COLORREF &color)
{int flag = 0;for (POSITION pos = m_colTextColor.GetHeadPosition();pos!=NULL;){stColor *pColor = (stColor*)m_colTextColor.GetNext(pos);if (pColor->nCol==col){flag = 1;color = pColor->rgb;break;}}if (1==flag){return true;}return false;
}bool CListCtrlCl::FindItemTextColor(int col,int row,COLORREF &color)
{int flag = 0;for (POSITION pos = m_ItemTextColor.GetHeadPosition();pos!=NULL;){stColor *pColor = (stColor*)m_ItemTextColor.GetNext(pos);if (pColor->nCol==col&&pColor->nRow==row){flag = 1;color = pColor->rgb;break;}}if (1==flag){return true;}return false;
}void CListCtrlCl::SetItemTextColor(int col,int row,COLORREF color)
{stColor *pColor = new stColor;pColor->nCol = col;pColor->nRow = row;pColor->rgb = color;m_ItemTextColor.AddTail(pColor);
}void CListCtrlCl::SetItemFontHW(int col,int row,int nHeight,int nWidth)
{stFont *pFont=new stFont;pFont->nCol=col;pFont->nRow=row;pFont->nFontHeight=nHeight;pFont->nFontWidth=nWidth;m_ItemFontSize.AddTail(pFont);
}
bool CListCtrlCl::FindItemFontSize(int col,int row,int &height,int &width)
{int flag = 0;for (POSITION pos = m_ItemFontSize.GetHeadPosition();pos!=NULL;){stFont *pFont = (stFont*)m_ItemFontSize.GetNext(pos);if (pFont->nCol==col&&pFont->nRow==row){flag = 1;height=pFont->nFontHeight;width = pFont->nFontWidth;break;}}if (1==flag){return true;}return false;
}

原理:要明白DrawItem是关键, 即绘每一个项,我们就在这里面搞事!CPtrList 看名字就知道叫指针列表,用来保存要修改的项,如果那项要修改,stFont与stColor就是我们要添加进去的指针,哪里要修改哪里就new一个,再addtail(添加到尾部),再写一个Find方法,某项有无被设置了颜色或者字体等属性,并在DrawItem里调用,找到就设置某项,基本原理即清楚了!附一张效果图:

不得不说还是相当的美观!

下载链接:http://download.csdn.net/detail/what951006/9805027
更多文章:http://blog.csdn.net/what951006?viewmode=list
Powered by:小乌龟在大乌龟背上~

MFC 自定义CListCtrl相关推荐

  1. mfc的CListCtrl关于InsertItem

    mfc的CListCtrl关于InsertItem 他有3个同名函数,一般我们只用 int InsertItem(int nItem, LPCTSTR lpszItem) int InsertItem ...

  2. MFC自定义右上角关闭按钮功能

    MFC自定义右上角关闭按钮功能 VS2010 [类视图]- [右键]- [类向导(MFC Class Wizard)]- [选择指定的项目]- [消息]- [选中VM_CLOSE]- [添加处理程序] ...

  3. error C2440 无法转换到 AFX_PMSG mfc自定义信号及实现 PostMessage FindWindow

    这两天在用自定义信号,期间除了一些问题,看似简单,实际上花了我好长时间.也是因为本身没怎么用过mfc,纯粹是被赶鸭子上架,赶上来的. 奔着分享和记录的目的,希望碰到同样问题的猿们快速解决问题. 首先说 ...

  4. 关于MFC中CListCtrl::InsertColumn()和InsertItem()和SetItemText()的一些认识

    才开始写博客,有很多不懂的或者表达不清楚的,请谅解!还有因为是自己在自学,所有可能有些话是错的,所以请朋友们看到后留言指出错误,大家一起学习,非常感谢!! 刚刚在学习MFC中的List Control ...

  5. MFC中CListCtrl添加复选框,实现单选

    记录MFC项目中CListCtrl添加复选框,实现单选步骤 添加复选框 绑定控件变量 CListCtrl m_ctrList; OnInitDialog函数中添加 m_ctrList.SetExten ...

  6. VC/MFC列表CListCtrl类的LVCOLUMN和LVITEM详解

    列表视图控件(List Control) 列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来.与树视图类似,列表控 ...

  7. MFC 列表控件CListCtrl加载类似QQ界面的头像与文字

    本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn.InsertItem.SetItemTe ...

  8. CListCtrl 使用技巧

    以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 "ListView_"开头的一些宏.如 ListView ...

  9. CListCtrl使用技巧汇总

    以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 "ListView_"开头的一些宏.如 ListView ...

最新文章

  1. 互联网架构为什么要做服务化
  2. 为什么输出流会有一个flsh_交流会| “流量”还是“留量”,如何成为电商风口上的赢家?...
  3. 【连载】优秀程序员的 45 个习惯之习惯35
  4. Acwing第 33 场周赛【完结】
  5. 《Docker进阶与实战》——3.2节使用Docker image
  6. SolidGraph CAD System
  7. AIO,BIO,NIO:同步阻塞式IO,同步非阻塞IO,异步非阻塞IO
  8. 洛谷 绕钉子的长绳子
  9. 条款2. 最好使用C++转型操作符
  10. PATB 1019. 数字黑洞 (20)
  11. 小程序二维码(扫描二维码到小程序页面)
  12. H5基础阶段二(表格、表单)
  13. c语言上届报告,51单片机摇摇棒制作资料,包含c代码PCB原理图与设计报告
  14. 5e服务器显示fps被锁定,csgo强制被锁60帧 被锁60fps解决方法
  15. 春考计算机专业PS考点,春考辅导:春考PS的学习方法和技巧
  16. 【强化学习】First-visit MC prediction
  17. 谈一谈安全运营工作是什么
  18. 原型工具axure7.0 正式版免费下载
  19. Unity3d C#实现显示计时器(游戏运行时间、录制时长等)功能(含项目源码)
  20. idea 文件夹样式更改插件地址

热门文章

  1. 用Python大声说出“我爱你”
  2. java中fork什么意思,需要帮助掌握关于fork()的一些概念
  3. PlayStation的CD格式
  4. java导出excel 打不开,poi 通过浏览器导出excel文件打不开
  5. grpc-go源码剖析十一之平衡器相关介绍
  6. 基于dlib库关键点检测(图片和视频)demo
  7. C语言学习系列-->【函数的递归】
  8. python3打印如何换行_浅谈Python3中print函数的换行
  9. RT-thread SPI SFUD读写W25Q128
  10. 谈谈 C++ 中的 new/delete 和 new[]/delete[]