• 修改一个完全颜色的CListCtrl类


    在使用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

  • 相关阅读:
    2021.5.10-(叶子相似的树)
    2021.5.8-N皇后(回溯)
    2021.5.6-(雪糕最大数)
    2021.4.23刷题(回溯-全排列)
    可持久化动态图上树状数组维护01背包
    Infinite String Comparision
    第6章 操作系统 存储器管理(二)
    markdown
    操作系统 第6章 存储管理(一)
    操作系统 第五章 死锁 (二)
  • 原文地址:https://www.cnblogs.com/fag888/p/5789132.html
Copyright © 2020-2023  润新知