📄 tlcdragwnd.cpp
字号:
rcCheckBox.SetRect( 0, 0, TLL_WIDTH, TLL_WIDTH );
rcCheckBox.OffsetRect( rcColumn.left + nPerfix, rcColumn.top + ( rcColumn.Height() - TLL_HEIGHT)/2 );
rcExclude = rcColumn & rcCheckBox;
if( !rcExclude.IsRectEmpty() )
pDC->ExcludeClipRect( rcExclude );
nPerfix += TLL_HEIGHT;
}
}
if( m_pTreeListCtrl->m_dwStyle&TLC_LOCKBOX )
{
if( pItem->GetState()&TLIS_SHOWLOCKBOX )
{
CRect rcLockBox;
rcLockBox.SetRect( 0, 0, TLL_WIDTH / 2, TLL_WIDTH );
rcLockBox.OffsetRect( rcColumn.left + nPerfix, rcColumn.top + ( rcColumn.Height() - TLL_HEIGHT)/2 );
rcExclude = rcColumn & rcLockBox;
if( !rcExclude.IsRectEmpty() )
pDC->ExcludeClipRect( rcExclude );
nPerfix += TLL_HEIGHT / 2;
}
}
if( m_pTreeListCtrl->m_dwStyle&TLC_IMAGE )
{
if( pItem->GetState()&TLIS_SHOWTREEIMAGE )
{
CRect rcImage;
rcImage.SetRect( 0, 0, TLL_WIDTH, TLL_WIDTH );
rcImage.OffsetRect( rcColumn.left + nPerfix, rcColumn.top + ( rcColumn.Height() - TLL_HEIGHT)/2 );
rcExclude = rcColumn & rcImage;
if( !rcExclude.IsRectEmpty() )
pDC->ExcludeClipRect( rcExclude );
nPerfix += TLL_HEIGHT;
}
}
break;
}
}
}
void CTLCDragWnd::DrawItemTree( CDC* pDC, CRect rcColumn, CTreeListItem* pItem, int iCol )
{
// draw tree column of treelist control
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_pTreeListCtrl->m_arColumns[iCol];
CRect rcGraph;
rcGraph = rcColumn;
rcGraph.DeflateRect( TLL_BORDER, 0, TLL_BORDER+1, 0 );
if( rcGraph.IsRectEmpty() )
return;
CRect rcTree;
rcTree = rcGraph;
rcTree.right = rcTree.left + TLL_WIDTH;
int nPerfix = TLL_BORDER;
// draw prefix vertical line
for( int iLevel=1; iLevel<pItem->m_nLevel; iLevel++, nPerfix += TLL_WIDTH )
{
CTreeListItem* pCheckItem = pItem;
while( pCheckItem->m_nLevel != iLevel )
{
pCheckItem = pCheckItem->m_pParent;
}
rcTree.left = rcColumn.left + nPerfix;
rcTree.right = rcTree.left + TLL_WIDTH;
if( pCheckItem->m_pNext != NULL )
{
if( iLevel != 1 || m_pTreeListCtrl->m_dwStyle&TLC_ROOTLINE )
{
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_TOP | TLL_BOTTOM ); // ┃
}
}
}
// draw cross line
if( m_pTreeListCtrl->m_dwStyle&(TLC_TREELINE|TLC_BUTTON) )
{
rcTree.left = rcColumn.left + nPerfix;
rcTree.right = rcTree.left + TLL_WIDTH;
if( pItem->m_nLevel == 1 )
{
// child item of root item
if( m_pTreeListCtrl->m_dwStyle&TLC_ROOTLINE )
{
if( pItem->m_pPrev == NULL && pItem->m_pNext == NULL )
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT ); // ━ ( right part )
else if( pItem->m_pPrev == NULL )
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT | TLL_BOTTOM ); // ┏
else if( pItem->m_pNext == NULL )
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT | TLL_TOP ); // ┗
else
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT | TLL_TOP | TLL_BOTTOM );// ┣
}
else
{
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT ); // ━ ( right part )
}
}
else
{
// child item of other items ( not root item )
if( pItem->m_pNext == NULL )
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT | TLL_TOP ); // ┗
else
m_pTreeListCtrl->DrawItemTreeLine( pDC, rcGraph, rcTree, TLL_RIGHT | TLL_TOP | TLL_BOTTOM ); // ┣
}
// draw button of child item of root item
if( m_pTreeListCtrl->m_dwStyle&TLC_BUTTON )
{
if( pItem->GetState()&TLIS_EXPANDEDONCE )
{
if( pItem->m_pChild != NULL )
{
if( pItem->GetState()&TLIS_EXPANDED )
m_pTreeListCtrl->DrawItemTreeButton( pDC, rcGraph, rcTree, TLB_MINUS );
else
m_pTreeListCtrl->DrawItemTreeButton( pDC, rcGraph, rcTree, TLB_PLUS );
}
}
else
{
m_pTreeListCtrl->DrawItemTreeButton( pDC, rcGraph, rcTree, TLB_UNKNOW );
}
}
nPerfix += TLL_WIDTH;
}
// draw check box
if( m_pTreeListCtrl->m_dwStyle&TLC_CHECKBOX )
{
if( pItem->GetState()&TLIS_SHOWCHECKBOX )
{
CRect rcCheckBox;
rcCheckBox = rcGraph;
rcCheckBox.left = rcColumn.left + nPerfix;
rcCheckBox.right = rcCheckBox.left + TLL_WIDTH;
POINT pt;
pt.x = rcCheckBox.left;
pt.y = rcCheckBox.top + (rcCheckBox.Height() - TLL_HEIGHT)/2;
pDC->IntersectClipRect( rcGraph );
pDC->IntersectClipRect( rcCheckBox );
m_pTreeListCtrl->m_imgCheck.Draw( pDC, pItem->GetCheck(), pt, ILD_TRANSPARENT );
::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
nPerfix += TLL_WIDTH;
}
}
// draw lock box
if( m_pTreeListCtrl->m_dwStyle&TLC_LOCKBOX )
{
if( pItem->GetState()&TLIS_SHOWLOCKBOX )
{
CRect rcLockBox;
rcLockBox = rcGraph;
rcLockBox.left = rcColumn.left + nPerfix;
rcLockBox.right = rcLockBox.left + TLL_WIDTH/2;
POINT pt;
pt.x = rcLockBox.left;
pt.y = rcLockBox.top + (rcLockBox.Height() - TLL_HEIGHT)/2;
pDC->IntersectClipRect( rcGraph );
pDC->IntersectClipRect( rcLockBox );
m_pTreeListCtrl->m_imgLock.Draw( pDC, pItem->GetLock(), pt, ILD_TRANSPARENT );
::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
nPerfix += TLL_WIDTH/2;
}
}
// draw image box
if( m_pTreeListCtrl->m_dwStyle&TLC_IMAGE )
{
if( pItem->GetState()&TLIS_SHOWTREEIMAGE )
{
CRect rcImage;
rcImage = rcGraph;
rcImage.left = rcColumn.left + nPerfix;
rcImage.right = rcImage.left + TLL_WIDTH;
POINT pt;
pt.x = rcImage.left;
pt.y = rcImage.top + (rcImage.Height() - TLL_HEIGHT)/2;
pDC->IntersectClipRect( rcGraph );
pDC->IntersectClipRect( rcImage );
if( pItem->GetState()&TLIS_EXPANDED && pItem->m_pChild != NULL )
{
if( m_pTreeListCtrl->m_arSelects.GetSize() > 0 && pItem == (CTreeListItem*)m_pTreeListCtrl->m_arSelects[0] )
m_pTreeListCtrl->m_pImageList->Draw( pDC, pItem->m_nExpandSelectedImage, pt, ILD_TRANSPARENT );
else
m_pTreeListCtrl->m_pImageList->Draw( pDC, pItem->m_nSelectedImage, pt, ILD_TRANSPARENT );
}
else
{
if( m_pTreeListCtrl->m_arSelects.GetSize() > 0 && pItem == (CTreeListItem*)m_pTreeListCtrl->m_arSelects[0] )
m_pTreeListCtrl->m_pImageList->Draw( pDC, pItem->m_nExpandImage, pt, ILD_TRANSPARENT );
else
m_pTreeListCtrl->m_pImageList->Draw( pDC, pItem->m_nImage, pt, ILD_TRANSPARENT );
}
::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
nPerfix += TLL_WIDTH;
}
}
// add gaps between text and image
if( m_pTreeListCtrl->m_dwStyle&TLC_LOCKBOX || m_pTreeListCtrl->m_dwStyle&TLC_IMAGE )
nPerfix += 2;
// draw item text
CRect rcBkgnd;
rcBkgnd = rcColumn;
rcBkgnd.left = rcColumn.left + nPerfix;
DrawItemTreeText( pDC, rcBkgnd, pItem, iCol );
// draw vertical grid line of tree
if( m_pTreeListCtrl->m_dwStyle&TLC_TGRID )
{
pDC->MoveTo( rcColumn.left, rcColumn.bottom - 1);
pDC->LineTo( rcColumn.right-1, rcColumn.bottom - 1);
}
if( m_pTreeListCtrl->m_dwStyle&TLC_VGRID )
{
pDC->MoveTo( rcColumn.right-1, rcColumn.bottom - 1);
pDC->LineTo( rcColumn.right-1, rcColumn.top - 1 );
}
return;
}
void CTLCDragWnd::DrawItemMain( CDC* pDC, CRect rcColumn, CTreeListItem* pItem, int iCol )
{
// draw main column of list
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_pTreeListCtrl->m_arColumns[iCol];
CRect rcGraph;
rcGraph = rcColumn;
rcGraph.DeflateRect( TLL_BORDER, 0, TLL_BORDER+1, 0 );
if( rcGraph.Width() <= 0 )
return;
CRect rcTree;
rcTree = rcGraph;
rcTree.right = rcTree.left + TLL_WIDTH;
int nPerfix = TLL_BORDER;
// draw check box
if( m_pTreeListCtrl->m_dwStyle&TLC_CHECKBOX )
{
if( pItem->GetState()&TLIS_SHOWCHECKBOX )
{
CRect rcCheckBox;
rcCheckBox = rcGraph;
rcCheckBox.left = rcColumn.left + nPerfix;
rcCheckBox.right = rcCheckBox.left + TLL_WIDTH;
POINT pt;
pt.x = rcCheckBox.left;
pt.y = rcCheckBox.top + (rcCheckBox.Height() - TLL_HEIGHT)/2;
pDC->IntersectClipRect( rcGraph );
pDC->IntersectClipRect( rcCheckBox );
m_pTreeListCtrl->m_imgCheck.Draw( pDC, pItem->GetCheck(), pt, ILD_TRANSPARENT );
::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
nPerfix += TLL_WIDTH;
}
}
// draw lock box
if( m_pTreeListCtrl->m_dwStyle&TLC_LOCKBOX )
{
if( pItem->GetState()&TLIS_SHOWLOCKBOX )
{
CRect rcLockBox;
rcLockBox = rcGraph;
rcLockBox.left = rcColumn.left + nPerfix;
rcLockBox.right = rcLockBox.left + TLL_WIDTH/2;
POINT pt;
pt.x = rcLockBox.left;
pt.y = rcLockBox.top + (rcLockBox.Height() - TLL_HEIGHT)/2;
pDC->IntersectClipRect( rcGraph );
pDC->IntersectClipRect( rcLockBox );
m_pTreeListCtrl->m_imgLock.Draw( pDC, pItem->GetLock(), pt, ILD_TRANSPARENT );
::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
nPerfix += TLL_WIDTH/2;
}
}
// draw image box
if( m_pTreeListCtrl->m_dwStyle&TLC_IMAGE )
{
if( pItem->GetState()&TLIS_SHOWTREEIMAGE )
{
CRect rcImage;
rcImage = rcGraph;
rcImage.left = rcColumn.left + nPerfix;
rcImage.right = rcImage.left + TLL_WIDTH;
POINT pt;
pt.x = rcImage.left;
pt.y = rcImage.top + (rcImage.Height() - TLL_HEIGHT)/2;
pDC->IntersectClipRect( rcGraph );
pDC->IntersectClipRect( rcImage );
if( m_pTreeListCtrl->m_arSelects.GetSize() > 0 && pItem == (CTreeListItem*)m_pTreeListCtrl->m_arSelects[0] )
m_pTreeListCtrl->m_pImageList->Draw( pDC, pItem->m_nExpandImage, pt, ILD_TRANSPARENT );
else
m_pTreeListCtrl->m_pImageList->Draw( pDC, pItem->m_nImage, pt, ILD_TRANSPARENT );
::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
nPerfix += TLL_WIDTH;
}
}
// add gaps between text and image
if( m_pTreeListCtrl->m_dwStyle&TLC_LOCKBOX || m_pTreeListCtrl->m_dwStyle&TLC_IMAGE )
nPerfix += 2;
// draw item text
CRect rcBkgnd;
rcBkgnd = rcColumn;
rcBkgnd.left = rcColumn.left + nPerfix;
DrawItemTreeText( pDC, rcBkgnd, pItem, iCol );
// draw vertical grid line of tree
if( m_pTreeListCtrl->m_dwStyle&TLC_TGRID )
{
pDC->MoveTo( rcColumn.left, rcColumn.bottom - 1);
pDC->LineTo( rcColumn.right-1, rcColumn.bottom - 1);
}
if( m_pTreeListCtrl->m_dwStyle&TLC_VGRID )
{
pDC->MoveTo( rcColumn.right-1, rcColumn.bottom - 1);
pDC->LineTo( rcColumn.right-1, rcColumn.top - 1 );
}
}
void CTLCDragWnd::DrawItemList( CDC* pDC, CRect rcColumn, CTreeListItem* pItem, int iCol )
{
// draw list
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_pTreeListCtrl->m_arColumns[iCol];
CRect rcBkgnd;
rcBkgnd = rcColumn;
rcBkgnd.left = rcColumn.left;
DrawItemListText( pDC, rcBkgnd, pItem, iCol );
// draw vertical grid line and horizonal grid lin
if( m_pTreeListCtrl->m_dwStyle&TLC_HGRID )
{
pDC->MoveTo( rcColumn.left, rcColumn.bottom - 1);
pDC->LineTo( rcColumn.right, rcColumn.bottom - 1);
}
if( m_pTreeListCtrl->m_dwStyle&TLC_VGRID )
{
pDC->MoveTo( rcColumn.right-1, rcColumn.bottom - 1);
pDC->LineTo( rcColumn.right-1, rcColumn.top - 1 );
}
}
void CTLCDragWnd::DrawItemTreeText( CDC* pDC, CRect rcBkgnd, CTreeListItem* pItem, int iCol )
{
// draw text on tree
CRect rcText;
rcText = rcBkgnd;
rcText.DeflateRect( 2, 0, 3, 0 );
rcBkgnd.bottom = rcBkgnd.bottom - 1;
DrawItemText( pDC, rcBkgnd, rcText, pItem, iCol );
}
void CTLCDragWnd::DrawItemListText( CDC* pDC, CRect rcBkgnd, CTreeListItem* pItem, int iCol )
{
// draw text on list
CRect rcText;
rcText = rcBkgnd;
rcText.DeflateRect( 2, 0, 3, 0 );
rcBkgnd.bottom = rcBkgnd.bottom - 1;
DrawItemText( pDC, rcBkgnd, rcText, pItem, iCol );
}
void CTLCDragWnd::DrawItemText( CDC* pDC, CRect rcBkgnd, CRect rcText, CTreeListItem* pItem, int iCol )
{
// draw item text
COLORREF crBkgnd;
COLORREF crText = m_pTreeListCtrl->m_crText;
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_pTreeListCtrl->m_arColumns[iCol];
// do not draw zero width
if( rcBkgnd.IsRectEmpty() )
return;
// do not draw not selected item
BOOL bSelected = FALSE;
CTreeListItem* pTempItem = pItem;
while( pTempItem != NULL )
{
if( pTempItem->GetSelected() )
{
bSelected = TRUE;
break;
}
pTempItem = pTempItem->m_pParent;
}
if( !bSelected )
return;
// select text and background color
if( pItem->GetSelected() )
{
if( m_pTreeListCtrl->GetState( TLS_FOCUS ) )
{
if( !(m_pTreeListCtrl->m_dwStyle&TLC_MULTIPLESELECT) )
{
// single select
if( iCol == m_pTreeListCtrl->m_iSelCol && m_pTreeListCtrl->m_dwStyle&TLC_SHOWSELACTIVE )
{
crBkgnd = m_pTreeListCtrl->m_crBkSelectedColumn;
crText = m_pTreeListCtrl->m_crTextSelectedColumn;
}
else
{
crBkgnd = m_pTreeListCtrl->m_crBkSelectedRow;
crText = m_pTreeListCtrl->m_crTextSelectedRow;
}
}
else
{
// multiple select
if( m_pTreeListCtrl->m_arSelects.GetSize() > 0 && pItem == (CTreeListItem*)m_pTreeListCtrl->m_arSelects[0] )
{
if( iCol == m_pTreeListCtrl->m_iSelCol && m_pTreeListCtrl->m_dwStyle&TLC_SHOWSELACTIVE )
{
crBkgnd = m_pTreeListCtrl->m_crBkSelectedColumn;
crText = m_pTreeListCtrl->m_crTextSelectedColumn;
}
else
{
crBkgnd = m_pTreeListCtrl->m_crBkSelectedRow;
crText = m_pTreeListCtrl->m_crTextSelectedRow;
}
}
else
{
crBkgnd = m_pTreeListCtrl->m_crBkSelected;
crText = m_pTreeListCtrl->m_crTextSelected;
}
}
pDC->FillSolidRect( rcBkgnd, crBkgnd );
}
else
{
crBkgnd = m_pTreeListCtrl->m_crBkSelectedNoFocus;
crText = m_pTreeListCtrl->m_crTextSelectedNoFocus;
if( !(GetStyle()&TLC_SHOWSELFULLROWS) )
pDC->FillSolidRect( rcBkgnd, crBkgnd );
}
}
// draw text
COLORREF crOldText;
UINT dwFormat = pColumnInfo->GetTextFormat();
crOldText = pDC->SetTextColor( crText );
pDC->DrawText( pItem->GetText(iCol), rcText, dwFormat );
pDC->SetTextColor( crOldText );
}
BOOL CTLCDragWnd::Show()
{
SetWindowPos( &wndTop, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );
if( m_bLayeredWindows )
OnPaintBMP();
return TRUE;
}
BOOL CTLCDragWnd::Hide()
{
SetWindowPos( &wndTop, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -