182 lines
9 KiB
C++
182 lines
9 KiB
C++
/////////////////////////////////////////////////////////////
|
||
//
|
||
// 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.SetBkColor( RGB(0,0,0));
|
||
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();
|
||
}
|
||
|