在使用CListCtrl控件的过程中,我们会发现使用及其不方便,特别是在使用“report”显示模式时, 想给指定条目添加背景颜色,CListCtrl控件所提供的设置颜色函数只能使得控件的界面变得好看一些,根本不能满足我们的要求,我们无法把特定的一项或几项添加上不同的颜色以示区别。 幸运的是很多VC的使用者在改造CListCtrl类,使之更加功能强大上做了很多工作,开发出了各种各样的继承类来实现这个功能,Sven Freitag 就是其中的一员。他开发出了CListCtrl的继承类CColorListCtrl来实现给指定的条目加背景色的功能,并无偿的在网上公布给VC的使用者,我在源代码中收集了他的源程序,各位读者可以先阅读学习一下。
CColorListCtrl类示例代码运行效果如下图所示:
怎样使用CColorListCtrl类:
1、把下面的文件加入你的工程中去:
1.
color.h
2.
color.cpp
3.
ColorListCtrl.h
4.
ColorListCtrl.cpp
2、在对话框头文件中加入ColorListCtrl.h的说明,然后用CColorListCtrl代替CListCtrl声明成员变量。
3、具体的使用方法,请看示例代码中的ColoredListCtrlDlg.cpp文件。
CColorListCtrl类存在的不足:
在使用CColorListCtrl类的过程中,我体会到了随意添加条目颜色的乐趣,但同时也发现它存在的一些不足之处。下面我列出color.h和color.cpp文件代码来进行分析。color.h源代码如下所示:
001.
// Author: SFr frydaysoft@gmx.de
002.
003.
ifndef AFX_COLOR_H__9FC7D36B_FC88_42FD_8DAA_2F70016038BA__INCLUDED_
004.
define AFX_COLOR_H__9FC7D36B_FC88_42FD_8DAA_2F70016038BA__INCLUDED_
005.
006.
include “windows.h”
007.
008.
typedef enum
009.
{
010.
DEF_BACKGROUND=0, DEF_TEXT, DEF_SELBACKGROUND, DEF_SELTEXT, DEF_DESELBACKGROUND, DEF_DESELTEXT,
011.
BLACK,BLUE,GREEN,CYAN,RED,
012.
MANGENTA,YELLOW,WHITE,DARKBLUE,DARKGREEN,
013.
BLUEGREEN,BROWN,PURPUR,OLIV,DARKGRAY,
014.
LIGHTGRAY,LIGHTBLUE,DARKWHITE,MIDDLEGRAY
015.
}
016.
ITEM_COLOR;
017.
018.
typedef struct
019.
{
020.
char str[50];
021.
ITEM_COLOR col;
022.
}ColorList;
023.
024.
define COLLIST_MAX 25
025.
026.
extern ColorList colList[COLLIST_MAX];
027.
028.
COLORREF GetColorRef(ITEM_COLOR lParam);
029.
030.
endif
031.
032.
033.
color.cpp源代码如下所示:
034.
035.
// Author: SFr frydaysoft@gmx.de
036.
037.
include “stdafx.h”
038.
include “color.h”
039.
040.
ColorList colList[COLLIST_MAX]=
041.
{
042.
{“DEF_BACKGROUND”,DEF_BACKGROUND},
043.
{“DEF_TEXT”,DEF_TEXT},
044.
{“DEF_SELBACKGROUND”,DEF_SELBACKGROUND},
045.
{“DEF_SELTEXT”,DEF_SELTEXT},
046.
{“DEF_DESELBACKGROUND”,DEF_DESELBACKGROUND},
047.
{“DEF_DESELTEXT”,DEF_DESELTEXT},
048.
{“BLACK”,BLACK},
049.
{“BLUE”,BLUE},
050.
{“GREEN”,GREEN},
051.
{“CYAN”,CYAN},
052.
{“RED”,RED},
053.
{“MANGENTA”,MANGENTA},
054.
{“YELLOW”,YELLOW},
055.
{“WHITE”,WHITE},
056.
{“DARKBLUE”,DARKBLUE},
057.
{“DARKGREEN”,DARKGREEN},
058.
{“BLUEGREEN”,BLUEGREEN},
059.
{“BROWN”,BROWN},
060.
{“PURPUR”,PURPUR},
061.
{“OLIV”,OLIV},
062.
{“DARKGRAY”,DARKGRAY},
063.
{“LIGHTGRAY”,LIGHTGRAY},
064.
{“LIGHTBLUE”,LIGHTBLUE},
065.
{“DARKWHITE”,DARKWHITE},
066.
{“MIDDLEGRAY”,MIDDLEGRAY}
067.
};
068.
069.
COLORREF GetColorRef(ITEM_COLOR lParam)
070.
{
071.
switch (lParam)
072.
{
073.
case DEF_BACKGROUND: return ::GetSysColor(COLOR_WINDOW); break;
074.
case DEF_TEXT: return ::GetSysColor(COLOR_WINDOWTEXT); break;
075.
case DEF_SELBACKGROUND: return ::GetSysColor(COLOR_ACTIVECAPTION); break;
076.
case DEF_SELTEXT: return ::GetSysColor(COLOR_HIGHLIGHTTEXT); break;
077.
case DEF_DESELBACKGROUND: return ::GetSysColor(COLOR_INACTIVECAPTION); break;
078.
case DEF_DESELTEXT: return ::GetSysColor(COLOR_INACTIVECAPTIONTEXT ); break;
079.
case BLACK: return RGB(0,0,0); break; //black
080.
case BLUE: return RGB(0,0,255); break; //blue
081.
case GREEN: return RGB(0,255,0); break; //green
082.
case CYAN: return RGB(0,255,255); break; //cyan
083.
case RED: return RGB(255,0,0); break; //red
084.
case MANGENTA: return RGB(255,0,255); break; //mangenta
085.
case YELLOW: return RGB(255,255,0); break; //yellow
086.
case WHITE: return RGB(255,255,255);break; //white
087.
case DARKBLUE: return RGB(0,0,128); break; //dark-blue
088.
case DARKGREEN: return RGB(0,128,0); break; //dark-green
089.
case BLUEGREEN: return RGB(0,128,128); break; //blue-green
090.
case BROWN: return RGB(128,0,0); break; //brown
091.
case PURPUR: return RGB(128,0,128); break; //purpur
092.
case OLIV: return RGB(128,128,0); break; //oliv
093.
case DARKGRAY: return RGB(128,128,128);break; //dark-gray
094.
case LIGHTGRAY: return RGB(192,192,192);break; //light-gray
095.
case LIGHTBLUE: return RGB(166,202,240);break; //light-blue
096.
case DARKWHITE: return RGB(255,251,240);break; //dark-white
097.
case MIDDLEGRAY: return RGB(160,160,164);break; //middle-gray
098.
default: return RGB(0,128,0); break; //dark-green
099.
}
100.
}
由上述源代码可以看出,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的定义和函数说明中进行如下修改:
源代码:
01.
ITEM_COLOR *m_pBackColor;
02.
ITEM_COLOR *m_pTextColor;
03.
04.
m_pBackColor=new ITEM_COLOR[column_count];
05.
m_pTextColor=new ITEM_COLOR[column_count];
06.
07.
BOOL SetBackColor(ITEM_COLOR color, int iSub)
08.
{
09.
if (iSub