关于VS2010中使用CColorListBox 实现文本改变颜色

过程:

1)使用别人已经写好的类,CColorListBox 完成。其实过程很简单,只是在vs2010 中需要注意一些细节:

   首先,在新建的项目中加入这两个类;

   然后,  在vs对话框中添加CListBox m_list变量,然后将CListBox改为CColorListBox,这样就可以在点击BUTTON响应事件中,添加代码

   m_list.AddString(_T("nihao"),RGB(255,0,0));

  只是这样,结果并不会想想象的出现文本颜色的变化。

  需要做的是:修改m_list的属性:

           *)Owner Draw  为Variable 

           *)Selction 为Single

           *)use TabStops 为False

           *)Has Strings 为True 这个是我在运行是,一直没有找到的出问题的地方

开始的时候设置的为False 但是怎么都不行,就单步调试,跟进去看代码,存入的是这个值,怎么都不行,再看它的重绘,取出的值就是不对,就像可能是list的属性设置不正确,由于属性不正确,它不去取你设置的值,所以就看vc6.0的代码,选中了又字符串,默认的是False 所以要选中!!!!

/*****************************************************************

CColorListBox.h

#if !defined(AFX_COLORLISTBOX_H__5529A6B1_584A_11D2_A41A_006097BD277B__INCLUDED_)
#define AFX_COLORLISTBOX_H__5529A6B1_584A_11D2_A41A_006097BD277B__INCLUDED_


#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000


// ColorListBox.h : header file


//-------------------------------------------------------------------
//
// CColorListBox class - 
// A CListBox-derived class with optional colored items.
//
// Version: 1.0 01/10/1998 Copyright ?Patrice Godard
//
// Version: 2.0 09/17/1999 Copyright ?Paul M. Meidinger
//
//-------------------------------------------------------------------


/
// CColorListBox window


class CColorListBox : public CListBox
{
// Construction
public:
CColorListBox();


// Attributes
public:


// Operations
public:
int AddString(LPCTSTR lpszItem); // Adds a string to the list box
int AddString(LPCTSTR lpszItem, COLORREF rgb); // Adds a colored string to the list box
int InsertString(int nIndex, LPCTSTR lpszItem); // Inserts a string to the list box
int InsertString(int nIndex, LPCTSTR lpszItem, COLORREF rgb); // Inserts a colored string to the list box
void SetItemColor(int nIndex, COLORREF rgb); // Sets the color of an item in the list box
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorListBox)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
//}}AFX_VIRTUAL


// Implementation
public:
virtual ~CColorListBox();


// Generated message map functions
protected:
//{{AFX_MSG(CColorListBox)
//}}AFX_MSG


DECLARE_MESSAGE_MAP()
};


/


//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_COLORLISTBOX_H__5529A6B1_584A_11D2_A41A_006097BD277B__INCLUDED_)




/***************************************************************************************************************************************

CColorListBox.cpp

// ColorListBox.cpp : implementation file


//-------------------------------------------------------------------
//
// CColorListBox class - 
// A CListBox-derived class with optional colored items.
//
// Version: 1.0 01/10/1998 Copyright ?Patrice Godard
//
// Version: 2.0 09/17/1999 Copyright ?Paul M. Meidinger
//
//-------------------------------------------------------------------


#include "stdafx.h"
#include "ColorListBox.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/
// CColorListBox


//-------------------------------------------------------------------
//
CColorListBox::CColorListBox()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Standard constructor.
//
{
} // CColorListBox


//-------------------------------------------------------------------
//
CColorListBox::~CColorListBox()
//
// Return Value: None.
//
// Parameters : None.
//
// Remarks : Destructor.
//
{
} // ~CColorListBox()




BEGIN_MESSAGE_MAP(CColorListBox, CListBox)
//{{AFX_MSG_MAP(CColorListBox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// CColorListBox message handlers


//-------------------------------------------------------------------
//
void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
//
// Return Value: None.
//
// Parameters : lpDIS - A long pointer to a DRAWITEMSTRUCT structure 
// that contains information about the type of drawing required.
//
// Remarks : Called by the framework when a visual aspect of 
// an owner-draw list box changes. 
//
{
if ((int)lpDIS->itemID < 0)
return; 


CDC* pDC = CDC::FromHandle(lpDIS->hDC);


COLORREF crText;
CString sText;
COLORREF crNorm = (COLORREF)lpDIS->itemData; // Color information is in item data.
COLORREF crHilite = RGB(255-GetRValue(crNorm), 255-GetGValue(crNorm), 255-GetBValue(crNorm));


// If item has been selected, draw the highlight rectangle using the item's color.
if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
CBrush brush(crNorm);
pDC->FillRect(&lpDIS->rcItem, &brush);
}


// If item has been deselected, draw the rectangle using the window color.
if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT))
{
CBrush brush(::GetSysColor(COLOR_WINDOW));
pDC->FillRect(&lpDIS->rcItem, &brush);
}


// If item has focus, draw the focus rect.
if ((lpDIS->itemAction & ODA_FOCUS) && (lpDIS->itemState & ODS_FOCUS))
pDC->DrawFocusRect(&lpDIS->rcItem); 


// If item does not have focus, redraw (erase) the focus rect.
if ((lpDIS->itemAction & ODA_FOCUS) && !(lpDIS->itemState & ODS_FOCUS))
pDC->DrawFocusRect(&lpDIS->rcItem); 




// Set the background mode to TRANSPARENT to draw the text.
int nBkMode = pDC->SetBkMode(TRANSPARENT);


// If the item's color information is set, use the highlight color
// gray text color, or normal color for the text.
if (lpDIS->itemData)
{
if (lpDIS->itemState & ODS_SELECTED)
crText = pDC->SetTextColor(crHilite);
else if (lpDIS->itemState & ODS_DISABLED)
crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
else
crText = pDC->SetTextColor(crNorm);
}
// Else the item's color information is not set, so use the
// system colors for the text.
else
{
if (lpDIS->itemState & ODS_SELECTED)
crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
else if (lpDIS->itemState & ODS_DISABLED)
crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
else
crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
}




// Get and display item text.
GetText(lpDIS->itemID, sText);
CRect rect = lpDIS->rcItem;


// Setup the text format.
UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
if (GetStyle() & LBS_USETABSTOPS)
nFormat |= DT_EXPANDTABS;

// Calculate the rectangle size before drawing the text.
pDC->DrawText(sText, -1, &rect, nFormat | DT_CALCRECT);
pDC->DrawText(sText, -1, &rect, nFormat);


pDC->SetTextColor(crText); 
pDC->SetBkMode(nBkMode);
} // DrawItem


//-------------------------------------------------------------------
//
void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
//
// Return Value: None.
//
// Parameters : lpMIS - A long pointer to a 
// MEASUREITEMSTRUCT structure.
//
// Remarks : Called by the framework when a list box with 
// an owner-draw style is created. 
//
{
// ### Is the default list box item height the same as
// the menu check height???
lpMIS->itemHeight = ::GetSystemMetrics(SM_CYMENUCHECK);
} // MeasureItem


//-------------------------------------------------------------------
//
int CColorListBox::AddString(LPCTSTR lpszItem)
//
// Return Value: The zero-based index to the string in the list box. 
// The return value is LB_ERR if an error occurs; the 
// return value is LB_ERRSPACE if insufficient space 
// is available to store the new string.
//
// Parameters : lpszItem - Points to the null-terminated 
// string that is to be added.
//
// Remarks : Call this member function to add a string to a list 
// box. Provided because CListBox::AddString is NOT
// a virtual function.
//
{
return ((CListBox*)this)->AddString(lpszItem);
} // AddString


//-------------------------------------------------------------------
//
int CColorListBox::AddString(LPCTSTR lpszItem, COLORREF rgb)
//
// Return Value: The zero-based index to the string in the list box. 
// The return value is LB_ERR if an error occurs; the 
// return value is LB_ERRSPACE if insufficient space 
// is available to store the new string.
//
// Parameters : lpszItem - Points to the null-terminated 
// string that is to be added.
// rgb - Specifies the color to be associated with the item.
//
// Remarks : Call this member function to add a string to a list 
// box with a custom color.
//
{
int nItem = AddString(lpszItem);
if (nItem >= 0)
SetItemData(nItem, rgb);
return nItem;
} // AddString


//-------------------------------------------------------------------
//
int CColorListBox::InsertString(int nIndex, LPCTSTR lpszItem)
//
// Return Value: The zero-based index of the position at which the 
// string was inserted. The return value is LB_ERR if 
// an error occurs; the return value is LB_ERRSPACE if 
// insufficient space is available to store the new string.
//
// Parameters : nIndex - Specifies the zero-based index of the position
// to insert the string. If this parameter is ?, the string
// is added to the end of the list.
// lpszItem - Points to the null-terminated string that 
// is to be inserted.
//
// Remarks : Inserts a string into the list box. Provided because 
// CListBox::InsertString is NOT a virtual function.
//
{
return ((CListBox*)this)->InsertString(nIndex, lpszItem);
} // InsertString


//-------------------------------------------------------------------
//
int CColorListBox::InsertString(int nIndex, LPCTSTR lpszItem, COLORREF rgb)
//
// Return Value: The zero-based index of the position at which the 
// string was inserted. The return value is LB_ERR if 
// an error occurs; the return value is LB_ERRSPACE if 
// insufficient space is available to store the new string.
//
// Parameters : nIndex - Specifies the zero-based index of the position
// to insert the string. If this parameter is ?, the string
// is added to the end of the list.
// lpszItem - Points to the null-terminated string that 
// is to be inserted.
// rgb - Specifies the color to be associated with the item.
//
// Remarks : Inserts a colored string into the list box.
//
{
int nItem = ((CListBox*)this)->InsertString(nIndex,lpszItem);
if (nItem >= 0)
SetItemData(nItem, rgb);
return nItem;
} // InsertString


//-------------------------------------------------------------------
//
void CColorListBox::SetItemColor(int nIndex, COLORREF rgb)
//
// Return Value: None.
//
// Parameters : nIndex - Specifies the zero-based index of the item.
// rgb - Specifies the color to be associated with the item.
//
// Remarks : Sets the 32-bit value associated with the specified
// item in the list box.
//
{
SetItemData(nIndex, rgb);
RedrawWindow();
} // SetItemColor


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值