vs2010设置CListBox字体颜色

本文介绍如何在Visual Studio 2010中使用CListBox类实现自定义绘制,通过设置LBS_OWNERDRAWVARIABLE和LBS_HASSTRINGS样式,实现了列表项颜色的动态变化,并提供了具体的代码实现。
摘要由CSDN通过智能技术生成

      VS2010中使用多文档模式动态创建CListBox模块输出结果,为了方便改变每一行的字体颜色,参考了CColorListBox类的封装,在添加了virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);重载函数后发现该函数并没有被调用,查其原因是因为在创建输出模块时没有添加 LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS;属性,

const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS;

对应到VC6.0中是属性框中所有者绘制选可变,有字串中勾选上。附上代码:

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
void COutputList::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 COutputList::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 COutputList::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 COutputList::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 COutputList::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 COutputList::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 COutputList::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、付费专栏及课程。

余额充值