CListCtrl 实现按需设置单元格颜色,求高手、大牛帮忙解决!!!

迷路的老男孩 2015-08-08 06:45:25
http://blog.csdn.net/lightlater/article/details/7341838 我在这里看了下,已经copy,但是还是缺乏灵活性啊,我想通过外部传参,实现指定的改变,比如,添加类函数 SetCellcolor(int nItem ,int nSubItem,COLORREF clrText,COLORREF clrBak)然后调用这函数来实现改变颜色,关键就是不知道怎么处理了,我新手莫见怪!这是那链接里的重绘代码
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);  

if ( CDDS_PREPAINT ==pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.

*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
int nItem=static_cast<int>(pLVCD->nmcd.dwItemSpec );
switch(pLVCD->iSubItem)
{
case 2:
case 4:
{
if (nItem % 2 == 0)
{

COLORREF clrNewTextColor, clrNewBkColor;
clrNewTextColor = RGB(0,0,0);
clrNewBkColor = RGB(198,202,198);

pLVCD->clrText =clrNewTextColor;
pLVCD->clrTextBk =clrNewBkColor;
*pResult = CDRF_DODEFAULT;
break;
}
}
default:
pLVCD->clrText = RGB(0,0,0);
pLVCD->clrTextBk = RGB(255,255,255);
*pResult = CDRF_DODEFAULT;
break;
}
}
...全文
361 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2015-09-26
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
就是那个党伟 2015-08-22
  • 打赏
  • 举报
回复
把他们代码拷过去,调试下,看看效果 从里边把东西摘出来
迷路的老男孩 2015-08-21
  • 打赏
  • 举报
回复
引用 3 楼 wxhxj0268 的回复:
1、新建一个以CMFCListCtrl为基类的新类,例如:

// CMyListCtrl

class CMyListCtrl : public CMFCListCtrl
{
	DECLARE_DYNAMIC(CMyListCtrl)

public:
	CMyListCtrl();
	virtual ~CMyListCtrl();

protected:
	DECLARE_MESSAGE_MAP()

	/*通过虚函数可修改表的行、列的颜色和字体*/
	virtual COLORREF OnGetCellBkColor(int nRow, int nColum);				// 修改背景色
	virtual COLORREF OnGetCellTextColor(int nRow, int nColum);				// 修改文本色
	virtual HFONT OnGetCellFont(int nRow, int nColum, DWORD dwData = 0);	// 修改字体
	// 排序处理
	virtual int OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn);
2、修改虚函数 virtual COLORREF OnGetCellBkColor(int nRow, int nColum);

// 修改背景色
COLORREF CMyListCtrl::OnGetCellBkColor(int nRow, int nColum)
{
	CMainFrame* pFm=(CMainFrame*)AfxGetMainWnd();
	CAnalysisRs232View* pView=(CAnalysisRs232View*)pFm->GetActiveView();

	if(!pView->GetListIsFocus())
	{
		// 当表失去焦点时模拟选中
		if(nRow==pView->GetItem())
		{
			COLORREF crBackground = ::GetSysColor(COLOR_HIGHLIGHT);	// 系统背景色
			return crBackground;
		}
	}
	// 非B通道不处理
	if(GetItemText(nRow,0)!=L"1")
	{
		return CMFCListCtrl::OnGetCellBkColor(nRow, nColum);
	}
	// 返回背景颜色
	return RGB(245, 230, 240);			// 使用自定义背景色
}
至于为什么该函数名为 GetCellBkColor,而不是SetCellBkColor,就只能靠你自己去想了,当然有它的意义。
额,不懂,我菜鸟,觉得这没有解决我的问题
迷路的老男孩 2015-08-21
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
使用这个类可以实现,颜色可以按列、按行、按单元格设置,里面包括了实现代码,楼主可以学习 同时这个类可以实现按列排序等多种功能 http://download.csdn.net/detail/paschen/8927009
10分有点多啊,你下过吗?发我一份怎样?
paschen 2015-08-09
  • 打赏
  • 举报
回复
使用这个类可以实现,颜色可以按列、按行、按单元格设置,里面包括了实现代码,楼主可以学习 同时这个类可以实现按列排序等多种功能 http://download.csdn.net/detail/paschen/8927009
笨笨仔 2015-08-09
  • 打赏
  • 举报
回复
上面2、只是一个例子,如果写此程序你自己动手。
笨笨仔 2015-08-09
  • 打赏
  • 举报
回复
1、新建一个以CMFCListCtrl为基类的新类,例如:

// CMyListCtrl

class CMyListCtrl : public CMFCListCtrl
{
	DECLARE_DYNAMIC(CMyListCtrl)

public:
	CMyListCtrl();
	virtual ~CMyListCtrl();

protected:
	DECLARE_MESSAGE_MAP()

	/*通过虚函数可修改表的行、列的颜色和字体*/
	virtual COLORREF OnGetCellBkColor(int nRow, int nColum);				// 修改背景色
	virtual COLORREF OnGetCellTextColor(int nRow, int nColum);				// 修改文本色
	virtual HFONT OnGetCellFont(int nRow, int nColum, DWORD dwData = 0);	// 修改字体
	// 排序处理
	virtual int OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn);
2、修改虚函数 virtual COLORREF OnGetCellBkColor(int nRow, int nColum);

// 修改背景色
COLORREF CMyListCtrl::OnGetCellBkColor(int nRow, int nColum)
{
	CMainFrame* pFm=(CMainFrame*)AfxGetMainWnd();
	CAnalysisRs232View* pView=(CAnalysisRs232View*)pFm->GetActiveView();

	if(!pView->GetListIsFocus())
	{
		// 当表失去焦点时模拟选中
		if(nRow==pView->GetItem())
		{
			COLORREF crBackground = ::GetSysColor(COLOR_HIGHLIGHT);	// 系统背景色
			return crBackground;
		}
	}
	// 非B通道不处理
	if(GetItemText(nRow,0)!=L"1")
	{
		return CMFCListCtrl::OnGetCellBkColor(nRow, nColum);
	}
	// 返回背景颜色
	return RGB(245, 230, 240);			// 使用自定义背景色
}
至于为什么该函数名为 GetCellBkColor,而不是SetCellBkColor,就只能靠你自己去想了,当然有它的意义。
大鱼> 2015-08-08
  • 打赏
  • 举报
回复
一般控件的自绘都很麻烦,我以前遇到时候都在网上查了很多代码做了很多尝试。最好自己去摸索,这样理解深一些。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧