/////////////////////////////////////////////////////////////
//
// Author: Sami (M.ALSAMSAM), ittiger@ittiger.net
//
// 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();
}
- 1
- 2
- 3
前往页