?? newtreelistctrl.cpp
字號:
{
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));
}
if(pItem->m_Bold)
{
dc.SelectObject( &fontDC );
}
}
hItem = GetNextVisibleItem( hItem );
n--;
}
dc.SelectObject( pFontDC );
}
void CNewTreeListCtrl::ResetVertScrollBar()
{
CTLFrame *pFrame = (CTLFrame*)GetParent();
CRect m_treeRect;
GetClientRect(&m_treeRect);
CRect m_wndRect;
pFrame->GetClientRect(&m_wndRect);
CRect m_headerRect;
m_wndHeader.GetClientRect(&m_headerRect);
CRect m_barRect;
pFrame->m_horScrollBar.GetClientRect(&m_barRect);
if(!pFrame->HorizontalScrollVisible())
SetWindowPos(&wndTop, 0, 0, m_wndRect.Width(), m_wndRect.Height()-m_headerRect.Height(), SWP_NOMOVE);
else
SetWindowPos(&wndTop, 0, 0, m_wndRect.Width(), m_wndRect.Height()-m_barRect.Height()-m_headerRect.Height(), SWP_NOMOVE);
if(pFrame->HorizontalScrollVisible())
{
if(!pFrame->VerticalScrollVisible())
{
pFrame->m_horScrollBar.SetWindowPos(&wndTop, 0, 0, m_wndRect.Width(), m_barRect.Height(), SWP_NOMOVE);
int nMin, nMax;
pFrame->m_horScrollBar.GetScrollRange(&nMin, &nMax);
if((nMax-nMin) == (GetColumnsWidth()-m_treeRect.Width()+GetSystemMetrics(SM_CXVSCROLL)))
// i.e. it disappeared because of calling
// SetWindowPos
{
if(nMax - GetSystemMetrics(SM_CXVSCROLL) > 0)
pFrame->m_horScrollBar.SetScrollRange(nMin, nMax - GetSystemMetrics(SM_CXVSCROLL));
else
// hide the horz scroll bar and update the tree
{
pFrame->m_horScrollBar.EnableWindow(FALSE);
// we no longer need it, so hide it!
{
pFrame->m_horScrollBar.ShowWindow(SW_HIDE);
SetWindowPos(&wndTop, 0, 0, m_wndRect.Width(), m_wndRect.Height() - m_headerRect.Height(), SWP_NOMOVE);
// the tree takes scroll's place
}
pFrame->m_horScrollBar.SetScrollRange(0, 0);
// set scroll offset to zero
{
m_nOffset = 0;
Invalidate();
m_wndHeader.GetWindowRect(&m_headerRect);
m_wndHeader.SetWindowPos(&wndTop, m_nOffset, 0, max(pFrame->StretchWidth(GetColumnsWidth(),m_wndRect.Width()),m_wndRect.Width()), m_headerRect.Height(), SWP_SHOWWINDOW);
}
}
}
}
else
{
pFrame->m_horScrollBar.SetWindowPos(&wndTop, 0, 0, m_wndRect.Width() - GetSystemMetrics(SM_CXVSCROLL), m_barRect.Height(), SWP_NOMOVE);
int nMin, nMax;
pFrame->m_horScrollBar.GetScrollRange(&nMin, &nMax);
if((nMax-nMin) == (GetColumnsWidth()-m_treeRect.Width()-GetSystemMetrics(SM_CXVSCROLL)))
// i.e. it appeared because of calling
// SetWindowPos
{
pFrame->m_horScrollBar.SetScrollRange(nMin, nMax + GetSystemMetrics(SM_CXVSCROLL));
}
}
}
else
if(pFrame->VerticalScrollVisible())
{
if(GetColumnsWidth()>m_treeRect.Width())
// the vertical scroll bar takes some place
// and the columns are a bit bigger than the client
// area but smaller than (client area + vertical scroll width)
{
// show the horz scroll bar
{
pFrame->m_horScrollBar.EnableWindow(TRUE);
pFrame->m_horScrollBar.ShowWindow(SW_SHOW);
// the tree becomes smaller
SetWindowPos(&wndTop, 0, 0, m_wndRect.Width(), m_wndRect.Height()-m_barRect.Height()-m_headerRect.Height(), SWP_NOMOVE);
pFrame->m_horScrollBar.SetWindowPos(&wndTop, 0, 0, m_wndRect.Width() - GetSystemMetrics(SM_CXVSCROLL), m_barRect.Height(), SWP_NOMOVE);
}
pFrame->m_horScrollBar.SetScrollRange(0, GetColumnsWidth()-m_treeRect.Width());
}
}
}
void CNewTreeListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT flags;
HTREEITEM m_selectedItem = HitTest(point, &flags);
if((flags & TVHT_ONITEMRIGHT) || (flags & TVHT_ONITEMINDENT) ||
(flags & TVHT_ONITEM))
{
SelectItem(m_selectedItem);
}
if((GetColumnsNum()==0) || (point.x<GetColumnWidth(0)))
{
point.x -= m_nOffset;
m_selectedItem = HitTest(point, &flags);
if(flags & TVHT_ONITEMBUTTON)
{
Expand(m_selectedItem, TVE_TOGGLE);
}
}
SetFocus();
ResetVertScrollBar();
// CTreeCtrl::OnLButtonDown(nFlags, point);
}
void CNewTreeListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if((GetColumnsNum()==0) || (point.x<GetColumnWidth(0)))
{
CTreeCtrl::OnLButtonDblClk(nFlags, point);
ResetVertScrollBar();
}
SetFocus();
}
void CNewTreeListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
ResetVertScrollBar();
}
BOOL CNewTreeListCtrl::SetItemData(HTREEITEM hItem, DWORD dwData)
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return FALSE;
pItem->itemData = dwData;
return CTreeCtrl::SetItemData(hItem, (LPARAM)pItem);
}
DWORD CNewTreeListCtrl::GetItemData(HTREEITEM hItem) const
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return NULL;
return pItem->itemData;
}
HTREEITEM CNewTreeListCtrl::InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter)
{
CTLItem *pItem = new CTLItem;
pItem->InsertItem(lpszItem);
m_nItems++;
((CTLFrame*)GetParent())->ResetScrollBar();
return CTreeCtrl::InsertItem(TVIF_PARAM|TVIF_TEXT, "", 0, 0, 0, 0, (LPARAM)pItem, hParent, hInsertAfter);
}
HTREEITEM CNewTreeListCtrl::InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)
{
CTLItem *pItem = new CTLItem;
pItem->InsertItem(lpszItem);
m_nItems++;
((CTLFrame*)GetParent())->ResetScrollBar();
return CTreeCtrl::InsertItem(TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE, "", nImage, nSelectedImage, 0, 0, (LPARAM)pItem, hParent, hInsertAfter);
}
HTREEITEM CNewTreeListCtrl::InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter )
{
CTLItem *pItem = new CTLItem;
pItem->InsertItem(lpszItem);
pItem->itemData = lParam;
m_nItems++;
((CTLFrame*)GetParent())->ResetScrollBar();
return CTreeCtrl::InsertItem(nMask, "", nImage, nSelectedImage, nState, nStateMask, (LPARAM)pItem, hParent, hInsertAfter);
}
HTREEITEM CNewTreeListCtrl::CopyItem(HTREEITEM hItem, HTREEITEM hParent, HTREEITEM hInsertAfter)
{
if(ItemHasChildren(hItem))
return NULL;
TV_ITEM item;
item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_STATE | TVIF_TEXT;
item.hItem = hItem;
GetItem(&item);
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
CTLItem *pNewItem = new CTLItem(*pItem);
item.lParam = (LPARAM)pNewItem;
TV_INSERTSTRUCT insStruct;
insStruct.item = item;
insStruct.hParent = hParent;
insStruct.hInsertAfter = hInsertAfter;
return CTreeCtrl::InsertItem(&insStruct);
}
HTREEITEM CNewTreeListCtrl::MoveItem(HTREEITEM hItem, HTREEITEM hParent, HTREEITEM hInsertAfter)
{
if(ItemHasChildren(hItem))
return NULL;
TV_ITEM item;
item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_STATE | TVIF_TEXT;
item.hItem = hItem;
GetItem(&item);
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
CTLItem *pNewItem = new CTLItem(*pItem);
DeleteItem(hItem);
item.lParam = (LPARAM)pNewItem;
TV_INSERTSTRUCT insStruct;
insStruct.item = item;
insStruct.hParent = hParent;
insStruct.hInsertAfter = hInsertAfter;
return CTreeCtrl::InsertItem(&insStruct);
}
BOOL CNewTreeListCtrl::SetItemText( HTREEITEM hItem, int nCol ,LPCTSTR lpszItem )
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return FALSE;
pItem->SetSubstring(nCol, lpszItem);
return CTreeCtrl::SetItemData(hItem, (LPARAM)pItem);
}
BOOL CNewTreeListCtrl::SetItemColor( HTREEITEM hItem, COLORREF m_newColor, BOOL m_bInvalidate )
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return FALSE;
pItem->m_Color = m_newColor;
if(!CTreeCtrl::SetItemData(hItem, (LPARAM)pItem))
return FALSE;
if(m_bInvalidate)
Invalidate();
return TRUE;
}
BOOL CNewTreeListCtrl::SetItemBold( HTREEITEM hItem, BOOL m_Bold, BOOL m_bInvalidate )
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return FALSE;
pItem->m_Bold = m_Bold;
if(!CTreeCtrl::SetItemData(hItem, (LPARAM)pItem))
return FALSE;
if(m_bInvalidate)
Invalidate();
return TRUE;
}
CString CNewTreeListCtrl::GetItemText( HTREEITEM hItem, int nSubItem )
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return _T("");
return pItem->GetSubstring(nSubItem);
}
CString CNewTreeListCtrl::GetItemText( int nItem, int nSubItem )
{
return GetItemText(GetTreeItem(nItem), nSubItem);
}
BOOL CNewTreeListCtrl::DeleteItem( HTREEITEM hItem )
{
CTLItem *pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(!pItem)
return FALSE;
m_nItems -- ;
return CTreeCtrl::DeleteItem(hItem);
}
BOOL CNewTreeListCtrl::DeleteItem( int nItem )
{
return DeleteItem(GetTreeItem(nItem));
}
int CALLBACK CNewTreeListCtrl::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CTLItem *pItem1 = (CTLItem *)lParam1;
CTLItem *pItem2 = (CTLItem *)lParam2;
SSortType *pSortType = (SSortType *)lParamSort;
CString str1 = pItem1->GetSubstring(pSortType->nCol);
CString str2 = pItem2->GetSubstring(pSortType->nCol);
int m_nComp;
// compare the two strings, but
// notice:
// in this case, "xxxx10" comes after "xxxx2"
{
CString tmpStr1, tmpStr2;
int index = str1.FindOneOf("0123456789");
if(index!=-1)
tmpStr1 = str1.Right(str1.GetLength()-index);
index = str2.FindOneOf("0123456789");
if(index!=-1)
tmpStr2 = str2.Right(str2.GetLength()-index);
tmpStr1 = tmpStr1.SpanIncluding("0123456789");
tmpStr2 = tmpStr2.SpanIncluding("0123456789");
if((tmpStr1=="") && (tmpStr2==""))
m_nComp = str1.CompareNoCase(str2);
else
{
int num1 = atoi(tmpStr1);
int num2 = atoi(tmpStr2);
tmpStr1 = str1.SpanExcluding("0123456789");
tmpStr2 = str2.SpanExcluding("0123456789");
if(tmpStr1 == tmpStr2)
{
if(num1 > num2)
m_nComp = 1;
else
if(num1 < num2)
m_nComp = -1;
else
m_nComp = str1.CompareNoCase(str2);
}
else
m_nComp = str1.CompareNoCase(str2);
}
}
if(!pSortType->bAscending)
{
if(m_nComp == 1)
m_nComp = -1;
else
if(m_nComp == -1)
m_nComp = 1;
}
return m_nComp;
}
BOOL CNewTreeListCtrl::SortItems( int nCol, BOOL bAscending, HTREEITEM low)
{
TV_SORTCB tSort;
tSort.hParent = low;
tSort.lpfnCompare = CompareFunc;
SSortType *pSortType = new SSortType;
pSortType->nCol = nCol;
pSortType->bAscending = bAscending;
tSort.lParam = (LPARAM)pSortType;
BOOL m_bReturn = SortChildrenCB(&tSort);
delete pSortType;
return m_bReturn;
}
void CNewTreeListCtrl::MemDeleteAllItems(HTREEITEM hParent)
{
HTREEITEM hItem = hParent;
CTLItem *pItem;
while(hItem!=NULL)
{
pItem = (CTLItem *)CTreeCtrl::GetItemData(hItem);
if(pItem)
delete pItem;
if(ItemHasChildren(hItem))
MemDeleteAllItems(GetChildItem(hItem));
hItem = GetNextSiblingItem(hItem);
}
}
BOOL CNewTreeListCtrl::DeleteAllItems()
{
LockWindowUpdate();
BeginWaitCursor();
MemDeleteAllItems(GetRootItem());
BOOL m_bReturn = CTreeCtrl::DeleteAllItems();
EndWaitCursor();
UnlockWindowUpdate();
return m_bReturn;
}
void CNewTreeListCtrl::OnDestroy()
{
MemDeleteAllItems(GetRootItem());
CTreeCtrl::OnDestroy();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -