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

📄 tlcdragwnd.cpp

📁 一个关于数据结结的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					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 + -