⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treepropsheettreectrl.cpp

📁 人事管理系统
💻 CPP
字号:
// TreePropSheetTreeCtrl.cpp
//
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2004 by Yves Tkaczyk
// (http://www.tkaczyk.net - yves@tkaczyk.net)
//
// The contents of this file are subject to the Artistic License (the "License").
// You may not use this file except in compliance with the License. 
// You may obtain a copy of the License at:
// http://www.opensource.org/licenses/artistic-license.html
//
// Based on code by:
//
//  /////////////////////////////////////////////////////////////
//  //	
//  //	Author:		Sami (M.ALSAMSAM), ittiger@ittiger.net
//  //
//  //	Filename:	TreeCtrlEx.h
//  //
//  //	http	 :	www.ittiger.net
//  //
//  //////////////////////////////////////////////////////////////
// 
// Documentation: http://www.codeproject.com/property/treepropsheetex.asp
// CVS tree:      http://sourceforge.net/projects/treepropsheetex
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TreePropSheetTreeCtrl.h"
#include "TreePropSheetBase.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

namespace TreePropSheet
{
/////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
/////////////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CTreePropSheetTreeCtrl, CTreeCtrl)

CTreePropSheetTreeCtrl::CTreePropSheetTreeCtrl()
{
}

CTreePropSheetTreeCtrl::~CTreePropSheetTreeCtrl()
{
}

/////////////////////////////////////////////////////////////////////////////
// Properties
/////////////////////////////////////////////////////////////////////////////

void CTreePropSheetTreeCtrl::SetItemBold(const HTREEITEM hItem, const bool bBold)
{
	SetItemState(hItem, bBold ? TVIS_BOLD: 0, TVIS_BOLD);
}

//////////////////////////////////////////////////////////////////////
//
BOOL CTreePropSheetTreeCtrl::GetItemBold(const HTREEITEM hItem) const
{
  return (GetItemState(hItem, TVIS_BOLD) & TVIS_BOLD)?true:false;
}

//////////////////////////////////////////////////////////////////////
//
void CTreePropSheetTreeCtrl::SetItemColor(const HTREEITEM hItem, const COLORREF color)
{
  // If the color is the text color of the tree, remove the related entry 
  // from the tree.
  if( color == GetTextColor() )
  {
    m_mapTreeItemProperties.erase( hItem );
  }
  else
  {
    sTreeItemProperties treeItemProperty = m_mapTreeItemProperties[hItem];
    treeItemProperty.color = color;
    m_mapTreeItemProperties[hItem] = treeItemProperty;
  }
}

//////////////////////////////////////////////////////////////////////
//
COLORREF CTreePropSheetTreeCtrl::GetItemColor(const HTREEITEM hItem) const
{
  tTreeItemProperties::const_iterator cit = m_mapTreeItemProperties.find( hItem );
  if( m_mapTreeItemProperties.end() == cit )
  {
    return GetTextColor();
  }
  else
  {
    return cit->second.color;
  }
}

/////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////

BEGIN_MESSAGE_MAP(CTreePropSheetTreeCtrl, CTreeCtrl)
  //{{AFX_MSG_MAP(CTreePropSheetTreeCtrl)
  ON_WM_PAINT()
  ON_REGISTERED_MESSAGE(WMU_ENABLETREEITEM, OnSetItemColor)
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////

void CTreePropSheetTreeCtrl::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 update selected or drop highlighted items
		UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
	
		if( 0 == (GetItemState(hItem, selflag) & selflag) )
		{
      tTreeItemProperties::const_iterator cit = m_mapTreeItemProperties.find( hItem );
      if( cit != m_mapTreeItemProperties.end() )
      {
			  CFont *pFontDC;
			  CFont fontDC;
			  LOGFONT logfont;

  		  // Create a new font.
        CFont *pFont = GetFont();
			  pFont->GetLogFont( &logfont );

        // Update if bold.
			  if(GetItemBold(hItem))
        {
          logfont.lfWeight = 700;
        }

			  fontDC.CreateFontIndirect(&logfont);
			  pFontDC = memDC.SelectObject(&fontDC );

			  // Set the color.
        memDC.SetTextColor( cit->second.color);

			  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();
}

//////////////////////////////////////////////////////////////////////
//
LRESULT CTreePropSheetTreeCtrl::OnSetItemColor(WPARAM wParam, LPARAM lParam)
{
  // Convert parameters
  HTREEITEM hItem = reinterpret_cast<HTREEITEM>( wParam );
  COLORREF color = (COLORREF)lParam;

  SetItemColor( hItem, color );
  return 1L;
}

}  //namespace TreePropSheet

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -