?? newtreelistctrl.cpp
字號:
// NewTreeListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "TLView.h"
#include "NewTreeListCtrl.h"
#include "TLFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ID_TREE_LIST_HEADER 370
/////////////////////////////////////////////////////////////////////////////
// CTLItem
CTLItem::CTLItem()
{
m_cEnding = ' ';
m_itemString = "";
m_Bold = FALSE;
m_Color = ::GetSysColor(COLOR_WINDOWTEXT);
}
CTLItem::CTLItem(CTLItem ©Item)
{
m_cEnding = copyItem.m_cEnding;
m_itemString = copyItem.GetItemString();
m_Bold = copyItem.m_Bold;
m_Color = copyItem.m_Color;
itemData = copyItem.itemData;
}
CString CTLItem::GetSubstring(int m_nSub)
{
CString m_tmpStr("");
int i=0, nHits=0;
int length = m_itemString.GetLength();
while((i<length) && (nHits<=m_nSub))
{
if(m_itemString[i]==m_cEnding)
{
nHits++;
}
else
if(nHits==m_nSub)
m_tmpStr+=m_itemString[i];
i++;
}
if((i>=length) && (nHits<m_nSub))
return "";
else
return m_tmpStr;
void CTLItem::SetSubstring(int m_nSub, CString m_sText)
{
CString m_tmpStr("");
int i=0, nHits=0, first=0;
int length = m_itemString.GetLength();
while((i<length) && (nHits<=m_nSub))
{
if(m_itemString[i]==m_cEnding)
{
if(nHits!=m_nSub)
first = i;
nHits++;
}
i++;
}
CString m_newStr("");
if((nHits>m_nSub) || ((nHits==m_nSub) && (i>=length)))
{
// insert in the middle
if(first!=0)
{
m_newStr = m_itemString.Left(first);
m_newStr += m_cEnding;
}
m_newStr += m_sText;
if(i<length)
{
m_newStr += m_cEnding;
m_newStr += m_itemString.Right(m_itemString.GetLength()-i);
}
m_itemString=m_newStr;
}
else
{
// insert at the end
for(i=nHits;i<m_nSub;i++)
m_itemString+=m_cEnding;
m_itemString+=m_sText;
}
}
/////////////////////////////////////////////////////////////////////////////
// CNewTreeListCtrl
CNewTreeListCtrl::CNewTreeListCtrl()
{
m_nColumns = m_nColumnsWidth = 0;
m_nOffset = 0;
}
CNewTreeListCtrl::~CNewTreeListCtrl()
{
}
BEGIN_MESSAGE_MAP(CNewTreeListCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CNewTreeListCtrl)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_KEYDOWN()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewTreeListCtrl message handlers
int CNewTreeListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
HTREEITEM CNewTreeListCtrl::GetTreeItem(int nItem)
{
HTREEITEM m_ParentItem = GetRootItem();
int m_nCount = 0;
while((m_ParentItem!=NULL) && (m_nCount<nItem))
{
m_nCount ++ ;
GetNextSiblingItem(m_ParentItem);
}
return m_ParentItem;
}
int CNewTreeListCtrl::GetListItem(HTREEITEM hItem)
{
HTREEITEM m_ParentItem = GetRootItem();
int m_nCount = 0;
while((m_ParentItem!=NULL) && (m_ParentItem!=hItem))
{
m_nCount ++ ;
GetNextSiblingItem(m_ParentItem);
}
return m_nCount;
}
int CNewTreeListCtrl::InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem)
{
HD_ITEM hdi;
hdi.mask = HDI_TEXT | HDI_FORMAT;
if(nWidth!=-1)
{
hdi.mask |= HDI_WIDTH;
hdi.cxy = nWidth;
}
hdi.pszText = (LPTSTR)lpszColumnHeading;
hdi.fmt = HDF_OWNERDRAW;
if(nFormat == LVCFMT_RIGHT)
hdi.fmt |= HDF_RIGHT;
else
if(nFormat == LVCFMT_CENTER)
hdi.fmt |= HDF_CENTER;
else
hdi.fmt |= HDF_LEFT;
m_nColumns ++ ;
int m_nReturn = m_wndHeader.InsertItem(nCol, &hdi);
if(m_nColumns==1)
{
m_wndHeader.SetItemImage(m_nReturn, 0);
}
RecalcColumnsWidth();
return m_nReturn;
}
int CNewTreeListCtrl::GetColumnWidth(int nCol)
{
HD_ITEM hItem;
hItem.mask = HDI_WIDTH;
if(!m_wndHeader.GetItem(nCol, &hItem))
return 0;
return hItem.cxy;
}
int CNewTreeListCtrl::GetColumnAlign(int nCol)
{
HD_ITEM hItem;
hItem.mask = HDI_FORMAT;
if(!m_wndHeader.GetItem(nCol, &hItem))
return LVCFMT_LEFT;
if(hItem.fmt & HDF_RIGHT)
return LVCFMT_RIGHT;
else
if(hItem.fmt & HDF_CENTER)
return LVCFMT_CENTER;
else
return LVCFMT_LEFT;
}
void CNewTreeListCtrl::RecalcColumnsWidth()
{
m_nColumnsWidth = 0;
for(int i=0;i<m_nColumns;i++)
m_nColumnsWidth += GetColumnWidth(i);
}
void CNewTreeListCtrl::DrawItemText (CDC* pDC, CString text, CRect rect, int nWidth, int nFormat)
{
//
// Make sure the text will fit in the prescribed rectangle, and truncate
// it if it won't.
//
BOOL bNeedDots = FALSE;
int nMaxWidth = nWidth - 4;
while ((text.GetLength()>0) && (pDC->GetTextExtent((LPCTSTR) text).cx > (nMaxWidth - 4))) {
text = text.Left (text.GetLength () - 1);
bNeedDots = TRUE;
}
if (bNeedDots) {
if (text.GetLength () >= 1)
text = text.Left (text.GetLength () - 1);
text += "...";
}
//
// Draw the text into the rectangle using MFC's handy CDC::DrawText
// function.
//
rect.right = rect.left + nMaxWidth;
UINT nStyle = DT_VCENTER | DT_SINGLELINE;
if (nFormat == LVCFMT_LEFT)
nStyle |= DT_LEFT;
else if (nFormat == LVCFMT_CENTER)
nStyle |= DT_CENTER;
else // nFormat == LVCFMT_RIGHT
nStyle |= DT_RIGHT;
if((text.GetLength()>0) && (rect.right>rect.left))
pDC->DrawText (text, rect, nStyle);
}
void CNewTreeListCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClip, rcClient;
dc.GetClipBox( &rcClip );
GetClientRect(&rcClient);
// Set clip region to be same as that in paint DC
CRgn rgn;
rgn.CreateRectRgnIndirect( &rcClip );
dc.SelectClipRgn(&rgn);
rgn.DeleteObject();
COLORREF m_wndColor = GetSysColor( COLOR_WINDOW );
dc.SetViewportOrg(m_nOffset, 0);
dc.SetTextColor(m_wndColor);
// First let the control do its default drawing.
CWnd::DefWindowProc( WM_PAINT, (WPARAM)dc.m_hDC, 0 );
HTREEITEM hItem = GetFirstVisibleItem();
int n = GetVisibleCount(), m_nWidth;
dc.FillSolidRect(GetColumnWidth(0),1,rcClient.Width(),rcClient.Height(),m_wndColor);
CTLItem *pItem;
// the most urgent thing is to erase the labels that were drawn by the tree
while(hItem!=NULL && n>=0)
{
CRect rect;
UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
CRect m_labelRect;
GetItemRect( hItem, &m_labelRect, TRUE );
GetItemRect( hItem, &rect, FALSE );
if(GetColumnsNum()>1)
rect.left = min(m_labelRect.left, GetColumnWidth(0));
else
rect.left = m_labelRect.left;
rect.right = m_nColumnsWidth;
dc.FillSolidRect(rect.left,rect.top,rect.Width(),rect.Height(),m_wndColor);
hItem = GetNextVisibleItem( hItem );
n--;
}
// create the font
CFont *pFontDC;
CFont fontDC, boldFontDC;
LOGFONT logfont;
CFont *pFont = GetFont();
pFont->GetLogFont( &logfont );
fontDC.CreateFontIndirect( &logfont );
pFontDC = dc.SelectObject( &fontDC );
logfont.lfWeight = 700;
boldFontDC.CreateFontIndirect( &logfont );
// and now let's get to the painting itself
hItem = GetFirstVisibleItem();
n = GetVisibleCount();
while(hItem!=NULL && n>=0)
{
CRect rect;
UINT selflag = TVIS_DROPHILITED | TVIS_SELECTED;
if ( !(GetItemState( hItem, selflag ) & selflag ))
{
dc.SetBkMode(TRANSPARENT);
pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
CString sItem = pItem->GetItemText();
CRect m_labelRect;
GetItemRect( hItem, &m_labelRect, TRUE );
GetItemRect( hItem, &rect, FALSE );
if(GetColumnsNum()>1)
rect.left = min(m_labelRect.left, GetColumnWidth(0));
else
rect.left = m_labelRect.left;
rect.right = m_nColumnsWidth;
dc.SetBkColor( m_wndColor );
dc.SetTextColor( pItem->m_Color );
if(pItem->m_Bold)
{
dc.SelectObject( &boldFontDC );
}
DrawItemText(&dc, sItem, CRect(rect.left+2, rect.top, GetColumnWidth(0), rect.bottom), GetColumnWidth(0)-rect.left-2, GetColumnAlign(0));
m_nWidth = 0;
for(int i=1;i<m_nColumns;i++)
{
m_nWidth += GetColumnWidth(i-1);
DrawItemText(&dc, pItem->GetSubstring(i), CRect(m_nWidth, rect.top, m_nWidth+GetColumnWidth(i), rect.bottom), GetColumnWidth(i), GetColumnAlign(i));
}
dc.SetTextColor(::GetSysColor (COLOR_WINDOWTEXT ));
if(pItem->m_Bold)
{
dc.SelectObject( &fontDC );
}
}
else
{
CRect m_labelRect;
GetItemRect( hItem, &m_labelRect, TRUE );
GetItemRect( hItem, &rect, FALSE );
if(GetColumnsNum()>1)
rect.left = min(m_labelRect.left, GetColumnWidth(0));
else
rect.left = m_labelRect.left;
rect.right = m_nColumnsWidth;
// If the item is selected, paint the rectangle with the system color
// COLOR_HIGHLIGHT
COLORREF m_highlightColor = ::GetSysColor (COLOR_HIGHLIGHT);
CBrush brush(m_highlightColor);
dc.FillRect (rect, &brush);
// draw a dotted focus rectangle
dc.DrawFocusRect (rect);
pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
CString sItem = pItem->GetItemText();
dc.SetBkColor(m_highlightColor);
dc.SetTextColor(::GetSysColor (COLOR_HIGHLIGHTTEXT));
if(pItem->m_Bold)
{
dc.SelectObject( &boldFontDC );
}
DrawItemText(&dc, sItem, CRect(rect.left+2, rect.top, GetColumnWidth(0), rect.bottom), GetColumnWidth(0)-rect.left-2, GetColumnAlign(0));
m_nWidth = 0;
for(int i=1;i<m_nColumns;i++)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -