分享
 
 
 

修改一个完全颜色的CListCtrl类

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

修改一个完全颜色的CListCtrl类

作者:lypindream

下载源代码

在使用CListCtrl控件的过程中,我们会发现使用及其不方便,特别是在使用“report"显示模式时,

想给指定条目添加背景颜色,CListCtrl控件所提供的设置颜色函数只能使得控件的界面变得好看一些,根本不能满足我们的要求,我们无法把特定的一项或几项添加上不同的颜色以示区别。

幸运的是很多VC的使用者在改造CListCtrl类,使之更加功能强大上做了很多工作,开发出了各种各样的继承类来实现这个功能,Sven

Freitag 就是其中的一员。他开发出了CListCtrl的继承类CColorListCtrl来实现给指定的条目加背景色的功能,并无偿的在网上公布给VC的使用者,我在源代码中收集了他的源程序,各位读者可以先阅读学习一下。

CColorListCtrl类示例代码运行效果如下图所示:

怎样使用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控件的所有项罗列出已排序的项。如果哪位高手有独到的解决方法,请不吝指教!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有