用SetTextColor只能改变所以输出文本的颜色,我想只改变我所指定的那一列的颜色,其它列不变。问题解决马上结贴!
解决方案 »
- richedit ole
- ado中com抛的异常,会有什么原因导致?
- 我需要这样一个静态文件控件,可行吗?
- 求Programming Microsoft DirectShow for Digital Video and Television的源代码.
- 怎么样让函数返回_variant_t,C++函数怎么返回int、WCHAR、double不同类型参数,立马给分
- 获取多边形点,估计能做出来的人很少
- DLL中能向外发消息吗?
- 释放对象(CString型)的内存空间?
- 为什么我一调用beginthread 就告诉我出错 代码是从MSDN上抄下来的
- 掌握Visual C++——MFC程序设计与剖析
- 大家帮忙看一下这个怎么写:把我的vc的程序设置为一个文件的打开方式,如何得到打开的文件名!
- 关于msdn的,在线等,请大家帮忙
/////////////////////////////////////////////////////////////
//
// Author: Sami (M.ALSAMSAM), [email protected]
//
// Filename: TreeCtrlEx.h
//
// http : www.ittiger.net
//
//////////////////////////////////////////////////////////////
#if !defined(AFX_TREECTRLEX_H__5D969ED4_7DEA_4FB5_8C1D_E12D1CCF0989__INCLUDED_)
#define AFX_TREECTRLEX_H__5D969ED4_7DEA_4FB5_8C1D_E12D1CCF0989__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include <afxtempl.h>//////////////////////////////////////////////////////////////////////
class CTreeCtrlEx : public CTreeCtrl
{
DECLARE_DYNAMIC(CTreeCtrlEx)public:
CTreeCtrlEx();
virtual ~CTreeCtrlEx(); void SetItemFont(HTREEITEM, LOGFONT&);
void SetItemBold(HTREEITEM, BOOL);
void SetItemColor(HTREEITEM, COLORREF);
BOOL GetItemFont(HTREEITEM, LOGFONT *);
BOOL GetItemBold(HTREEITEM);
COLORREF GetItemColor(HTREEITEM);protected: struct Color_Font {
COLORREF color;
LOGFONT logfont;
}; CMap <void*, void*, Color_Font, Color_Font&> m_mapColorFont; protected:
//{{AFX_MSG(CTreeCtrlEx)
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()};#endif // !defined(AFX_TREECTRLEX_H__5D969ED4_7DEA_4FB5_8C1D_E12D1CCF0989__INCLUDED_)
//
// Author: Sami (M.ALSAMSAM), [email protected]
//
// Filename: TreeCtrlEx.cpp
//
// http : www.ittiger.net
//
//////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ColorTree.h"
#include "TreeCtrlEx.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////
CTreeCtrlEx::CTreeCtrlEx()
{
}CTreeCtrlEx::~CTreeCtrlEx()
{
}//////////////////////////////////
IMPLEMENT_DYNAMIC(CTreeCtrlEx, CTreeCtrl)BEGIN_MESSAGE_MAP(CTreeCtrlEx, CTreeCtrl)
//{{AFX_MSG_MAP(CTreeCtrlEx)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()//////////////////////////////////////////////////////////////////////
void CTreeCtrlEx::SetItemFont(HTREEITEM hItem, LOGFONT& logfont)
{
Color_Font cf;
if( !m_mapColorFont.Lookup( hItem, cf ) )
cf.color = (COLORREF)-1;
cf.logfont = logfont;
m_mapColorFont[hItem] = cf;
}//////////////////////////////////////////////////////////////////////
void CTreeCtrlEx::SetItemBold(HTREEITEM hItem, BOOL bBold)
{
SetItemState(hItem, bBold ? TVIS_BOLD: 0, TVIS_BOLD);
}//////////////////////////////////////////////////////////////////////
void CTreeCtrlEx::SetItemColor(HTREEITEM hItem, COLORREF color)
{
Color_Font cf;
if(!m_mapColorFont.Lookup(hItem, cf))
cf.logfont.lfFaceName[0] = '\0';
cf.color = color;
m_mapColorFont[hItem] = cf;
}//////////////////////////////////////////////////////////////////////
BOOL CTreeCtrlEx::GetItemFont(HTREEITEM hItem, LOGFONT * plogfont)
{
Color_Font cf;
if(!m_mapColorFont.Lookup(hItem, cf))
return FALSE;
if(cf.logfont.lfFaceName[0] == '\0')
return FALSE;
*plogfont = cf.logfont;
return TRUE;}//////////////////////////////////////////////////////////////////////
BOOL CTreeCtrlEx::GetItemBold(HTREEITEM hItem)
{
return GetItemState(hItem, TVIS_BOLD) & TVIS_BOLD;
}//////////////////////////////////////////////////////////////////////
COLORREF CTreeCtrlEx::GetItemColor(HTREEITEM hItem)
{
// Returns (COLORREF)-1 if color was not set
Color_Font cf;
if(!m_mapColorFont.Lookup(hItem, cf))
return (COLORREF) - 1;
return cf.color;}//////////////////////////////////////////////////////////////////////
void CTreeCtrlEx::OnPaint()
{
CPaintDC dc(this); // Create a memory DC compatible with the paint DC
CDC memDC;
memDC.CreateCompatibleDC(&dc); CRect rcClip, rcClient;
dc.GetClipBox( &rcClip );
GetClientRect(&rcClient); // Select a compatible bitmap into the memory DC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
memDC.SelectObject( &bitmap );
// Set clip region to be same as that in paint DC
CRgn rgn;
rgn.CreateRectRgnIndirect( &rcClip );
memDC.SelectClipRgn(&rgn);
rgn.DeleteObject();
// First let the control do its default drawing.
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0); HTREEITEM hItem = GetFirstVisibleItem(); int iItemCount = GetVisibleCount() + 1;
while(hItem && iItemCount--)
{
CRect rect; // Do not meddle with selected items or drop highlighted items
UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
Color_Font cf;
//if ( !(GetTreeCtrl().GetItemState( hItem, selflag ) & selflag )
// && m_mapColorFont.Lookup( hItem, cf ))
if ((GetItemState(hItem, selflag) & selflag)
&& ::GetFocus() == m_hWnd)
;
else if (m_mapColorFont.Lookup(hItem, cf))
{
CFont *pFontDC;
CFont fontDC;
LOGFONT logfont; if(cf.logfont.lfFaceName[0] != '\0')
logfont = cf.logfont;
else {
// No font specified, so use window font
CFont *pFont = GetFont();
pFont->GetLogFont( &logfont );
} if(GetItemBold(hItem))
logfont.lfWeight = 700; fontDC.CreateFontIndirect(&logfont);
pFontDC = memDC.SelectObject(&fontDC ); if(cf.color != (COLORREF) - 1)
memDC.SetTextColor(cf.color);
else
memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
CString sItem = GetItemText(hItem); GetItemRect(hItem, &rect, TRUE);
memDC.SetBkColor( GetSysColor(COLOR_WINDOW));
memDC.TextOut(rect.left + 2, rect.top + 1, sItem);
memDC.SelectObject(pFontDC);
}
hItem = GetNextVisibleItem(hItem);
}
dc.BitBlt(rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC,
rcClip.left, rcClip.top, SRCCOPY); memDC.DeleteDC();
}
重载DrawItem, 在传入的item 的dc设置颜色.或者用custom draw.作起来不是一两个语句的, www.codeguru.com 有例子, 自己找.
不错。好像是 XP style 的 ListCtrl
主要响应自绘事件
//……
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//……
END_MESSAGE_MAP()
2.在.h头文件中加入: afx_msg void OnCustomDraw(NMHDR*, LRESULT*);
3.在.cpp文件中重载NM_CUSTOMDRAW:void CMyView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加消息处理程序代码
// Contains information specific to an NM_CUSTOMDRAW
// notification message sent by a list-view control.
// mean:draw each item.set txt color,bkcolor....
NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)(pNMHDR); // Take the default processing unless we set this to something else below.
*pResult = CDRF_NEWFONT; // First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if ( pLVCD->nmcd.dwDrawStage==CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.
else if ( pLVCD->nmcd.dwDrawStage==CDDS_ITEMPREPAINT )
{
COLORREF m_crTextBk , m_clrText;
int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
CListCtrl &m_list = GetListCtrl();
CString str1 = m_list.GetItemText(nItem ,15);
bool bDBImplFail = false ;
if (pLVCD->nmcd.dwItemSpec%2==0)
{
m_crTextBk = RGB(253,241,249) ;
m_clrText = RGB(0,0,0) ;
}
else
{
m_crTextBk = RGB(51,153,255);
m_clrText = RGB(0,0,0);
}
pLVCD->clrTextBk = m_crTextBk;
pLVCD->clrText = m_clrText;
*pResult = CDRF_DODEFAULT;
}
}
//……
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//……
END_MESSAGE_MAP()
2.在.h头文件中加入: afx_msg void OnCustomDraw(NMHDR*, LRESULT*);
3.在.cpp文件中重载NM_CUSTOMDRAW:void CMyView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加消息处理程序代码
// Contains information specific to an NM_CUSTOMDRAW
// notification message sent by a list-view control.
// mean:draw each item.set txt color,bkcolor....
NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)(pNMHDR); // Take the default processing unless we set this to something else below.
*pResult = CDRF_NEWFONT; // First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if ( pLVCD->nmcd.dwDrawStage==CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.
else if ( pLVCD->nmcd.dwDrawStage==CDDS_ITEMPREPAINT )
{
COLORREF m_crTextBk , m_clrText;
int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
CListCtrl &m_list = GetListCtrl();
CString str1 = m_list.GetItemText(nItem ,15);
bool bDBImplFail = false ;
if (pLVCD->nmcd.dwItemSpec%2==0)
{
m_crTextBk = RGB(253,241,249) ;
m_clrText = RGB(0,0,0) ;
}
else
{
m_crTextBk = RGB(51,153,255);
m_clrText = RGB(0,0,0);
}
pLVCD->clrTextBk = m_crTextBk;
pLVCD->clrText = m_clrText;
*pResult = CDRF_DODEFAULT;
}
}
afx_msg void OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult );//testdlg.cpp
BEGIN_MESSAGE_MAP(CTest6Dlg, CDialog)
//{{AFX_MSG_MAP(CTest6Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_NOTIFY ( NM_CUSTOMDRAW, IDC_LISTCTRL, OnCustomdrawMyList )
END_MESSAGE_MAP()void CTest6Dlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
*pResult = CDRF_DODEFAULT; if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else
if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else
if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
if( (m_nSubItem == pLVCD->iSubItem))
{
clrNewTextColor = RGB(255,0,0);
clrNewBkColor = RGB(255,255,0);
}
else
{
clrNewTextColor = RGB(0,0,0);
clrNewBkColor = RGB(255,255,255);
}
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
*pResult = CDRF_DODEFAULT;
}
}m_nSubItem就是需要改变的行请在找到你需要改变的l列后调用
m_List.RedrawItems(0, m_List.GetItemCount());