// ExListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "ExListCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExListCtrl
CExListCtrl::CExListCtrl()
{
m_nHeight = 20;
InitFont();
m_clrBackDefault = DEFAULT_BACK_CLR;
m_clrTextDefault = DEFAULT_TEXT_CLR;
m_clrSelBackDefault = DEFAULT_SEL_BACK_CLR;
m_clrSelTextDefault = DEFAULT_SEL_TEXT_CLR;
m_arySubItemStyle.RemoveAll();
}
CExListCtrl::~CExListCtrl()
{
m_arySubItemStyle.RemoveAll();
}
BEGIN_MESSAGE_MAP(CExListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CExListCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
ON_WM_MEASUREITEM()
ON_WM_MEASUREITEM_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CExListCtrl message handlers
void CExListCtrl::PreSubclassWindow()
{
ModifyStyle(LVS_SORTASCENDING|LVS_SORTDESCENDING,LVS_OWNERDRAWFIXED|LVS_REPORT);//修改样式
CListCtrl::PreSubclassWindow();
}
void CExListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC); //设备上下文
CFont* pOldFont = pDC->SelectObject(&m_Font); //选中字体
int rowIndex = lpDIS->itemID; //行索引
int columncount = GetHeaderCtrl()->GetItemCount(); //列数
if (lpDIS->itemAction & ODA_DRAWENTIRE) //需要重绘
{
for (int i=0; i<columncount; i++) //循环所有的列
{
CString strText = GetItemText(rowIndex, i); //文本
CRect ItemRect; //一个单元格的矩形框
GetSubItemRect(rowIndex, i, LVIR_LABEL, ItemRect);
SUBITEMSTYLE subitemstyl;
GetSubItemStyle(rowIndex, i, subitemstyl); //获取样式
if (lpDIS->itemState & ODS_SELECTED) //选中状态
{
pDC->FillRect(ItemRect, &CBrush(subitemstyl.clrSelBack)); //背景色
pDC->SetTextColor(subitemstyl.clrSelText); //字体颜色
}
else //非选中状态
{
pDC->FillRect(ItemRect, &CBrush(subitemstyl.clrBack)); //背景色
pDC->SetTextColor(subitemstyl.clrText); //字体颜色
}
pDC->DrawEdge(ItemRect, EDGE_ETCHED, BF_RECT); //边框
pDC->DrawText(strText, lstrlen(strText), &ItemRect, DT_CENTER|DT_VCENTER|DT_NOPREFIX|DT_SINGLELINE);
}
}
pDC->SelectObject(pOldFont);
}
void CExListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CExListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = m_nHeight;// (m_nHeight即你想要的高度)
}
//设置行高,同时设置字体高度,行高的一半
void CExListCtrl::SetItemHeight(int nHeight)
{
m_nHeight = 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);
InitFont();
}
//设置字体,高度为行高的一半
void CExListCtrl::InitFont()
{
m_Font.DeleteObject();
LOGFONT log;
GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(log),&log);
log.lfHeight=m_nHeight/2; //通过行高设置字高
log.lfCharSet=GB2312_CHARSET;
lstrcpy(log.lfFaceName,"宋体");
m_Font.CreateFontIndirect(&log);
}
//根据行和列的索引,查找样式,找到了返回TRUE,否则返回FALSE
BOOL CExListCtrl::GetSubItemStyle(int rowindex, int columnindex, SUBITEMSTYLE& subitemstle)
{
if (m_arySubItemStyle.GetSize()>0 && rowindex>=0 && columnindex>=0)
{
for (int i=0; i<m_arySubItemStyle.GetSize(); i++)
{
if (m_arySubItemStyle[i].nRowIndex == rowindex
&& m_arySubItemStyle[i].nColumnIndex == columnindex)
{
subitemstle.clrBack = m_arySubItemStyle[i].clrBack;
subitemstle.clrText = m_arySubItemStyle[i].clrText;
subitemstle.clrSelBack = m_arySubItemStyle[i].clrSelBack;
subitemstle.clrSelText = m_arySubItemStyle[i].clrSelText;
return TRUE;
}
}
}
//没有找到,返回默认样式
subitemstle.clrBack = m_clrBackDefault;
subitemstle.clrText = m_clrTextDefault;
subitemstle.clrSelBack = m_clrSelBackDefault;
subitemstle.clrSelText = m_clrSelTextDefault;
return FALSE;
}
//设置默认颜色(背景色、文字颜色,选中背景色,选中文字颜色)
void CExListCtrl::SetDefaultClr(COLORREF clrBack /* = DEFAULT_BACK_CLR */,
COLORREF clrText /* = DEFAULT_TEXT_CLR */,
COLORREF clrSelBack /* = DEFAULT_SEL_BACK_CLR */,
COLORREF clrSelText /* = DEFAULT_SEL_TEXT_CLR */)
{
m_clrBackDefault = clrBack;
m_clrTextDefault = clrText;
m_clrSelTextDefault = clrSelText;
m_clrSelBackDefault = clrSelBack;
}
//插入行
int CExListCtrl::InsertItem(int nItem, LPCTSTR lpszItem,
COLORREF clrBack /* = NULL */,
COLORREF clrText /* = NULL */,
COLORREF clrSelBack /* = NULL */,
COLORREF clrSelText /* = NULL */ )
{
if (IsNeedAddStyle(clrBack, clrText, clrSelBack, clrSelText))
{
//插入之前滚号
RollAry(nItem, TRUE, FALSE);
int cout = GetHeaderCtrl()->GetItemCount();
for (int i=0; i<cout; i++)
{
AddStyle(nItem, i, clrBack, clrText, clrSelBack, clrSelText);
}
}
return CListCtrl::InsertItem(nItem, lpszItem);
}
//判断是否需要添加样式,不是默认颜色时添加
BOOL CExListCtrl::IsNeedAddStyle(COLORREF clrBack, COLORREF clrText,COLORREF clrSelBack, COLORREF clrSelText)
{
if (clrBack == NULL && clrText == NULL && clrSelBack == NULL && clrSelText == NULL)
{
return FALSE;
}
if (clrBack == m_clrBackDefault && clrText == m_clrTextDefault
&& clrSelBack == m_clrSelBackDefault && clrSelText == m_clrSelTextDefault)
{
return FALSE;
}
return TRUE;
}
//添加样式,如果已经存在则替换
void CExListCtrl::AddStyle(int rowindex, int columnindex, COLORREF clrBack, COLORREF clrText,COLORREF clrSelBack, COLORREF clrSelText)
{
if (clrBack == NULL)
{
clrBack = m_clrBackDefault;
}
if (clrText == NULL)
{
clrText = m_clrTextDefault;
}
if (clrSelBack == NULL)
{
clrSelBack = m_clrSelBackDefault;
}
if (clrSelText == NULL)
{
clrSelText = m_clrSelTextDefault;
}
for (int i=0; i<m_arySubItemStyle.GetSize(); i++)
{
if (m_arySubItemStyle[i].nRowIndex == rowindex && m_arySubItemStyle[i].nColumnIndex == columnindex)
{
m_arySubItemStyle[i].clrBack = clrBack;
m_arySubItemStyle[i].clrText = clrText;
m_arySubItemStyle[i].clrSelBack = clrSelBack;
m_arySubItemStyle[i].clrSelText = clrSelText;
return;
}
}
//没有,添加一个
SUBITEMSTYLE st;
st.nRowIndex = rowindex;
st.nColumnIndex = columnindex;
st.clrBack = clrBack;
st.clrText = clrText;
st.clrSelBack = clrSelBack;
st.clrSelText = clrSelText;
m_arySubItemStyle.Add(st);
}
//删除样式
void CExListCtrl::DelStyle(int rowindex, int columnindex)
{
int count = m_arySubItemStyle.GetSize();
for (int i=count-1; i>=0; i--)
{
if (m_arySubItemStyle[i].nRowIndex == rowindex && m_arySubItemStyle[i].nColumnIndex == columnindex)
{
m_arySubItemStyle.RemoveAt(i);
return;
}
}
}
//样式列表滚动 开始的索引, 行或列,滚号方向,
//插入行、插入列时,方向False 删除行删除列时方向为TRUE
//从索引号比index大的开始,索引值-1(bUp=TRUE) 或+1(bUp=FALSE)
//插入之前翻滚,删除之后翻滚
void CExListCtrl::RollAry(int index, BOOL bRow, BOOL bUp)
{
for (int i=0; i<m_arySubItemStyle.GetSize(); i++)
{
if (bRow) //行号翻滚
{
if (m_arySubItemStyle[i].nRowIndex >= index)
{
if (bUp)
{
m_arySubItemStyle[i].nRowIndex -= 1;
}
else
{
m_arySubItemStyle[i].nRowIndex += 1;
}
}
}
else //列号翻滚
{
if (m_arySubItemStyle[i].nColumnIndex >= index)
{
if (bUp)
{
m_arySubItemS
一个扩展的CListCtrl类支持修改背景颜色以及字体颜色
5星 · 超过95%的资源 需积分: 50 122 浏览量
2013-11-01
15:06:59
上传
评论 4
收藏 5KB RAR 举报
xdragon88
- 粉丝: 0
- 资源: 1
最新资源
- SRS-CentOS7-x86-64-5.0-r1.zip
- 全文检索使用ElasticSearch实现全文检索的详细说明和实践探索
- 基于matlab主成分分析图像压缩重建系统代码14
- C语言《基于AT89C52单片机搭建的PID直流电机控制程序,主要用于Proteus电路仿真》+源代码
- C++《基于规划和汽车动力学的自动驾驶项目仿真(基于ROS的自动驾驶项目仿真,使用DWA路径规划算法和双PID控制器)》+源代码
- vos3000客户端2.1.7.03、2.1.8.05、2.1.9.07
- c++《用于船舶控制方法研究的3D船舶运动仿真软件》+源代码
- globalmapper24
- Python 小游戏 (贪吃蛇、五子棋、扫雷、俄罗斯方块)源码.zip
- Map data that can be used for 2D raster map path planning
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页