2024-12-21 10:04:04 +08:00
|
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// 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();
|
|
|
|
|
}
|
|
|
|
|
|