没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-11-07 10:36:00.000|阅读 1644 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
在使用CListCtrl控件的过程中,我们会发现使用及其不方便,特别是在使用“report"显示模式时,
想给指定条目添加背景颜色,CListCtrl控件所提供的设置颜色函数只能使得控件的界面变得好看一些,根本不能满足我们的要求,我们无法把特定的一项或几项添加上不同的颜色以示区别。
幸运的是很多VC的使用者在改造CListCtrl类,使之更加功能强大上做了很多工作,开发出了各种各样的继承类来实现这个功能,Sven Freitag
就是其中的一员。他开发出了CListCtrl的继承类CColorListCtrl来实现给指定的条目加背景色的功能,并无偿的在网上公布给VC的使用者,我在源代码中收集了他的源程序,各位读者可以先阅读学习一下。
怎样使用CColorListCtrl类:
1、把下面的文件加入你的工程中去:
color.h
color.cpp
ColorListCtrl.h
ColorListCtrl.cpp
2、在对话框头文件中加入ColorListCtrl.h的说明,然后用CColorListCtrl代替CListCtrl声明成员变量。
3、具体的使用方法,请看示例代码中的ColoredListCtrlDlg.cpp文件。
CColorListCtrl类存在的不足:
在使用CColorListCtrl类的过程中,我体会到了随意添加条目颜色的乐趣,但同时也发现它存在的一些不足之处。下面我列出color.h和color.cpp文件代码来进行分析。color.h源代码如下所示:
// Author: SFr frydaysoft@gmx.de
#ifndef AFX_COLOR_H__9FC7D36B_FC88_42FD_8DAA_2F70016038BA__INCLUDED_
#define AFX_COLOR_H__9FC7D36B_FC88_42FD_8DAA_2F70016038BA__INCLUDED_
#include "windows.h"
typedef enum
{
DEF_BACKGROUND=0, DEF_TEXT, DEF_SELBACKGROUND, DEF_SELTEXT, DEF_DESELBACKGROUND,
DEF_DESELTEXT,
BLACK,BLUE,GREEN,CYAN,RED,
MANGENTA,YELLOW,WHITE,DARKBLUE,DARKGREEN,
BLUEGREEN,BROWN,PURPUR,OLIV,DARKGRAY,
LIGHTGRAY,LIGHTBLUE,DARKWHITE,MIDDLEGRAY
}
ITEM_COLOR;
typedef struct
{
char str[50];
ITEM_COLOR col;
}ColorList;
#define COLLIST_MAX 25
extern ColorList colList[COLLIST_MAX];
COLORREF GetColorRef(ITEM_COLOR lParam);
#endif
color.cpp源代码如下所示:
// Author: SFr frydaysoft@gmx.de
#include "stdafx.h"
#include "color.h"
ColorList colList[COLLIST_MAX]=
{
{"DEF_BACKGROUND",DEF_BACKGROUND},
{"DEF_TEXT",DEF_TEXT},
{"DEF_SELBACKGROUND",DEF_SELBACKGROUND},
{"DEF_SELTEXT",DEF_SELTEXT},
{"DEF_DESELBACKGROUND",DEF_DESELBACKGROUND},
{"DEF_DESELTEXT",DEF_DESELTEXT},
{"BLACK",BLACK},
{"BLUE",BLUE},
{"GREEN",GREEN},
{"CYAN",CYAN},
{"RED",RED},
{"MANGENTA",MANGENTA},
{"YELLOW",YELLOW},
{"WHITE",WHITE},
{"DARKBLUE",DARKBLUE},
{"DARKGREEN",DARKGREEN},
{"BLUEGREEN",BLUEGREEN},
{"BROWN",BROWN},
{"PURPUR",PURPUR},
{"OLIV",OLIV},
{"DARKGRAY",DARKGRAY},
{"LIGHTGRAY",LIGHTGRAY},
{"LIGHTBLUE",LIGHTBLUE},
{"DARKWHITE",DARKWHITE},
{"MIDDLEGRAY",MIDDLEGRAY}
};
COLORREF GetColorRef(ITEM_COLOR lParam)
{
switch (lParam)
{
case DEF_BACKGROUND: return ::GetSysColor(COLOR_WINDOW); break;
case DEF_TEXT: return ::GetSysColor(COLOR_WINDOWTEXT); break;
case DEF_SELBACKGROUND: return ::GetSysColor(COLOR_ACTIVECAPTION); break;
case DEF_SELTEXT: return ::GetSysColor(COLOR_HIGHLIGHTTEXT); break;
case DEF_DESELBACKGROUND: return ::GetSysColor(COLOR_INACTIVECAPTION); break;
case DEF_DESELTEXT: return ::GetSysColor(COLOR_INACTIVECAPTIONTEXT ); break;
case BLACK: return RGB(0,0,0); break; //black
case BLUE: return RGB(0,0,255); break; //blue
case GREEN: return RGB(0,255,0); break; //green
case CYAN: return RGB(0,255,255); break; //cyan
case RED: return RGB(255,0,0); break; //red
case MANGENTA: return RGB(255,0,255); break; //mangenta
case YELLOW: return RGB(255,255,0); break; //yellow
case WHITE: return RGB(255,255,255);break; //white
case DARKBLUE: return RGB(0,0,128); break; //dark-blue
case DARKGREEN: return RGB(0,128,0); break; //dark-green
case BLUEGREEN: return RGB(0,128,128); break; //blue-green
case BROWN: return RGB(128,0,0); break; //brown
case PURPUR: return RGB(128,0,128); break; //purpur
case OLIV: return RGB(128,128,0); break; //oliv
case DARKGRAY: return RGB(128,128,128);break; //dark-gray
case LIGHTGRAY: return RGB(192,192,192);break; //light-gray
case LIGHTBLUE: return RGB(166,202,240);break; //light-blue
case DARKWHITE: return RGB(255,251,240);break; //dark-white
case MIDDLEGRAY: return RGB(160,160,164);break; //middle-gray
default: return RGB(0,128,0); break; //dark-green
}
}
由上述源代码可以看出,CColorListCtrl类给我们提供的可供填充的颜色数量十分有限,只有BLACK,BLUE,GREEN,CYAN,RED,MANGENTA,YELLOW,WHITE,DARKBLUE,DARKGREEN,BLUEGREEN,BROWN,PURPUR,
OLIV,DARKGRAY,LIGHTGRAY,LIGHTBLUE,DARKWHITE,MIDDLEGRAY等几种,完全不能满足我们随时定制自己所需颜色的要求,因此我对这个类进行了一些修改,以使得能随心所欲的填充任何颜色。
对CColorListCtrl类修改的地方如下所示:
1、完全去掉color.h和color.cpp源文件,只把ColorListCtrl.h和ColorListCtrl.cpp源文件导入自己的工程中;
2、把ColorListCtrl.h头文件中的#include"color.h"去掉;
3、在类CMyLParam的定义和函数说明中进行如下修改:
源代码:
ITEM_COLOR *m_pBackColor;
ITEM_COLOR *m_pTextColor;
m_pBackColor=new ITEM_COLOR[column_count];
m_pTextColor=new ITEM_COLOR[column_count];
BOOL SetBackColor(ITEM_COLOR color, int iSub)
{
if (iSub<m_column_count) {
m_pBackColor[iSub] = color;
return TRUE;
} else return FALSE;
}
BOOL SetTextColor(ITEM_COLOR color, int iSub)
{
if (iSub<m_column_count) {
m_pTextColor[iSub] = color;
return TRUE;
} else return FALSE; }
COLORREF GetBackColor(int iSub)
{
if (iSub<m_column_count)
return GetColorRef(m_pBackColor[iSub]);
else
return GetColorRef(DEF_BACKGROUND);}
COLORREF GetTextColor(int iSub)
{
if (iSub<m_column_count)
return GetColorRef(m_pTextColor[iSub]);
else
return GetColorRef(DEF_TEXT);
}
修改后的代码: COLORREF *m_pBackColor;
COLORREF *m_pTextColor;
m_pBackColor=new COLORREF[column_count];
m_pTextColor=new COLORREF[column_count];
BOOL SetBackColor(COLORREF color, int iSub) {
if (iSub<m_column_count) {
m_pBackColor[iSub] = color;
return TRUE;
} else return FALSE; }
BOOL SetTextColor(COLORREF color, int iSub)
{
if (iSub<m_column_count) {
m_pTextColor[iSub] = color;
return TRUE;
} else return FALSE; }
COLORREF GetBackColor(int iSub)
{
if (iSub<m_column_count)
return m_pBackColor[iSub];
else
return ::GetSysColor(COLOR_WINDOW);}
COLORREF GetTextColor(int iSub)
{
if (iSub<m_column_count)
return m_pTextColor[iSub];
else
return ::GetSysColor(COLOR_WINDOWTEXT);}
4、在类CColorListCtrl的定义和函数说明中进行如下修改:
源代码: BOOL SetItemTextColor(ITEM_COLOR color, int Index, int iSub);
BOOL SetItemBackgndColor(ITEM_COLOR color, int Index, int iSub);
BOOL CColorListCtrl::SetItemBackgndColor(ITEM_COLOR color, int Index, int iSub)
BOOL CColorListCtrl::SetItemTextColor(ITEM_COLOR color, int Index, int iSub)
修改后的代码: BOOL SetItemTextColor(COLORREF color, int Index, int iSub);
BOOL SetItemBackgndColor(COLORREF color, int Index, int iSub);
BOOL CColorListCtrl::SetItemBackgndColor(COLORREF color, int Index, int iSub)
BOOL CColorListCtrl::SetItemTextColor(COLORREF color, int Index, int iSub)
删除的源代码: // only for TEST
if (ret_index<3)
{
p->SetBackColor(ITEM_COLOR(ret_index+BLUE),0);
p->SetTextColor(ITEM_COLOR(ret_index+RED ),0);
}
else
if (ret_index<=6)
{
p->SetBackColor(ITEM_COLOR(ret_index+BLUE),1);
p->SetTextColor(ITEM_COLOR(ret_index+RED ),1);
}
else
{
p->SetBackColor(ITEM_COLOR((ret_index+BLUE)&0xF),2);
p->SetTextColor(ITEM_COLOR((ret_index+RED )&0xF),2);
}
// end: only for TEST
5、替换如下所示的代码:
DEF_BACKGROUND替换成::GetSysColor(COLOR_WINDOW);
DEF_TEXT替换成::GetSysColor(COLOR_WINDOWTEXT);
GetColorRef(DEF_DESELTEXT)替换成::GetSysColor(COLOR_HIGHLIGHTTEXT);
GetColorRef(DEF_SELBACKGROUND)替换成::GetSysColor(COLOR_ACTIVECAPTION);
GetColorRef(DEF_SELTEXT)替换成::GetSysColor(COLOR_HIGHLIGHTTEXT);
GetColorRef(DEF_DESELBACKGROUND)替换成::GetSysColor(COLOR_INACTIVECAPTION);
pDC->SetTextColor(pMyLParam->GetTextColor(DEF_DESELTEXT))替换成pDC->SetTextColor(pMyLParam->GetTextColor(5));
修改后的示例程序如下图所示,基本功能与原来的程序一样。
本来我还计划把对CListCtrl类的排序功能加入其中,可是到实现的时候才发现异常复杂,因为在CListCtrl控件的“More
Style”属性中已选中“Owner draw fixed”选项,对CListCtrl控件颜色的修改实际上是通过自画来实现的,导致了CListCtrl控件某些函数的不可使用,例如InsertItem()等等,我尝试做了一下排序,总是会出现一些无法理解的错误,照我的理解只能把项全部存进列表中,然后对列表进行排序,再清空CListCtrl控件的所有项罗列出已排序的项。如果哪位高手有独到的解决方法,请不吝指教!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号