| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- // SkinTreeCtrl.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "Resource.h"
- #include "SkinTreeCtrl.h"
- // CSkinTreeCtrl
- IMPLEMENT_DYNAMIC(CSkinTreeCtrl, CTreeCtrl)
- CSkinTreeCtrl::CSkinTreeCtrl()
- {
- m_hItemMouseHover=NULL;
- m_colBack = RGB(255,255,255);
- m_uCursorRes = 0;
- m_pImageButton = NULL;
- m_pHovenImg = m_pPressImg = NULL;
- m_MapItemInfo.clear();
- m_colHoven = RGB(255,0,0);
- m_colPress = RGB(253,231,161);
- }
- CSkinTreeCtrl::~CSkinTreeCtrl()
- {
- }
- BEGIN_MESSAGE_MAP(CSkinTreeCtrl, CTreeCtrl)
- ON_WM_PAINT()
- ON_WM_SETCURSOR()
- ON_WM_DESTROY()
- END_MESSAGE_MAP()
- // CSkinTreeCtrl 消息处理程序
- void CSkinTreeCtrl::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
-
- //获取位置
- CRect rcClient;
- GetClientRect(&rcClient);
- CMemoryDC BufferDC(&dc,rcClient);
- //剪切位置
- CRect rcClipBox;
- BufferDC.GetClipBox(&rcClipBox);
- //绘制背景
- BufferDC.FillSolidRect(rcClient,m_colBack);
- DrawParentWndBg(GetSafeHwnd(),BufferDC->GetSafeHdc());
- DrawTreeItem(&BufferDC,rcClient,rcClipBox);
- }
- VOID CSkinTreeCtrl::DrawTreeItem( CDC * pDC, CRect & rcClient, CRect & rcClipBox )
- {
- //首项判断
- HTREEITEM hItemCurrent=GetFirstVisibleItem();
- if (hItemCurrent==NULL) return;
- //获取属性
- UINT uTreeStyte = GetStyle();
- //绘画子项
- do
- {
- //变量定义
- CRect rcItem;
- CRect rcRect;
- //获取状态
- HTREEITEM hParent=GetParentItem(hItemCurrent);
- UINT uItemState=GetItemState(hItemCurrent,TVIF_STATE);
- //获取属性
- bool bDrawChildren=(ItemHasChildren(hItemCurrent)==TRUE);
- bool bDrawSelected=(uItemState&TVIS_SELECTED)&&((this==GetFocus())||(uTreeStyte&TVS_SHOWSELALWAYS));
- //获取区域
- if (GetItemRect(hItemCurrent,rcItem,TRUE))
- {
- //绘画过滤
- if (rcItem.top>=rcClient.bottom) break;
- if (rcItem.top>=rcClipBox.bottom) continue;
- //设置位置
- rcRect.left=0;
- rcRect.top=rcItem.top+1;
- rcRect.bottom=rcItem.bottom;
- rcRect.right=rcClient.Width();
- //绘画选择
- if (bDrawSelected)
- {
- if (m_pPressImg != NULL && !m_pPressImg->IsNull())
- m_pPressImg->Draw(pDC,rcRect);
- else
- pDC->FillSolidRect(&rcRect,m_colPress);
- }
- //绘画经过
- if ((bDrawSelected==false)&&(m_hItemMouseHover==hItemCurrent))
- {
- if (m_pHovenImg != NULL && !m_pHovenImg->IsNull())
- m_pHovenImg->Draw(pDC,rcRect);
- else
- pDC->FillSolidRect(&rcRect,m_colHoven);
- }
- //绘制箭头
- if (bDrawChildren && (uTreeStyte&TVS_HASBUTTONS) )
- {
- if (m_pImageButton != NULL && !m_pImageButton->IsNull())
- {
- //计算位置
- INT nXPos=rcItem.left-m_pImageButton->GetWidth()/2;
- INT nYPos=rcItem.top+1+(rcItem.Height()-m_pImageButton->GetHeight())/2;
- //绘画图标
- INT nIndex=(uItemState&TVIS_EXPANDED)?1L:0L;
- m_pImageButton->DrawImage(pDC,nXPos,nYPos,m_pImageButton->GetWidth()/2,m_pImageButton->GetHeight(),nIndex*m_pImageButton->GetWidth()/2,0);
-
- rcItem.left += m_pImageButton->GetWidth();
- rcItem.right += m_pImageButton->GetWidth();;
- }
- }
- //绘制列表
- DrawListImage(pDC,rcItem,hItemCurrent,bDrawSelected);
- //绘制文本
- DrawItemString(pDC,rcItem,hItemCurrent,bDrawSelected);
- }
- } while ((hItemCurrent=GetNextVisibleItem(hItemCurrent))!= NULL);
- }
- VOID CSkinTreeCtrl::DrawListImage( CDC * pDC, CRect rcRect, HTREEITEM hTreeItem, bool bSelected )
- {
- CMapItemInfo::iterator iter= m_MapItemInfo.find(hTreeItem);
- if( iter == m_MapItemInfo.end() )
- {
- CImageList *pImageList = GetImageList(TVSIL_NORMAL);
- if( pImageList == NULL ) return;
- //获取属性
- INT nImage,nSelectedImage;
- GetItemImage(hTreeItem,nImage,nSelectedImage);
- //获取信息
- IMAGEINFO ImageInfo;
- pImageList->GetImageInfo(bSelected?nSelectedImage:nImage,&ImageInfo);
- //绘画图标
- INT nImageWidth=ImageInfo.rcImage.right-ImageInfo.rcImage.left;
- INT nImageHeight=ImageInfo.rcImage.bottom-ImageInfo.rcImage.top;
- pImageList->Draw(pDC,bSelected?nSelectedImage:nImage,CPoint(rcRect.left-nImageWidth-3,rcRect.top+(rcRect.Height()-nImageHeight)/2+1),ILD_TRANSPARENT);
- }
- else
- {
- CImageEx *pImage = iter->second.pImage;
- pImage->DrawImage(pDC,rcRect.left-pImage->GetWidth()-3,rcRect.top+(rcRect.Height()-pImage->GetHeight())/2+1);
- }
- }
- VOID CSkinTreeCtrl::DrawItemString( CDC * pDC, CRect rcRect, HTREEITEM hTreeItem, bool bSelected )
- {
- //设置环境
- pDC->SelectObject(GetCtrlFont());
- pDC->SetBkMode(TRANSPARENT);
- if( !IsWindowEnabled() ) pDC->SetTextColor(m_colDisableText);
- else pDC->SetTextColor(bSelected?m_colSelectText:m_colNormalText);
- //绘画字体
- rcRect.right += 5;
- CString strString=GetItemText(hTreeItem);
- pDC->DrawText(strString,rcRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
- return;
- }
- BOOL CSkinTreeCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
- {
- //获取光标
- CPoint MousePoint;
- GetCursorPos(&MousePoint);
- ScreenToClient(&MousePoint);
- //子项测试
- HTREEITEM hItemMouseHover=HitTest(MousePoint);
- //重画判断
- if ((hItemMouseHover!=NULL)&&(hItemMouseHover!=m_hItemMouseHover))
- {
- //设置变量
- m_hItemMouseHover=hItemMouseHover;
- //重画界面
- Invalidate(FALSE);
- }
- //设置光标
- if (hItemMouseHover!=NULL)
- {
- if( m_uCursorRes )
- SetCursor(LoadCursor(GetModuleHandle(SKINUI_DLL_NAME),MAKEINTRESOURCE(m_uCursorRes)));
- return true;
- }
- return __super::OnSetCursor(pWnd, nHitTest, message);
- }
- void CSkinTreeCtrl::SetCursorStyle(UINT uID)
- {
- m_uCursorRes = uID;
- }
- BOOL CSkinTreeCtrl::SetButtonImage( LPCTSTR lpszFileName )
- {
- RenderEngine->RemoveImage(m_pImageButton);
- m_pImageButton = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pImageButton)
- return FALSE;
- else
- return TRUE;
- }
- void CSkinTreeCtrl::OnDestroy()
- {
- __super::OnDestroy();
- RenderEngine->RemoveImage(m_pImageButton);
- CMapItemInfo::iterator iter= m_MapItemInfo.begin();
- for (;iter!= m_MapItemInfo.end();++iter)
- {
- RenderEngine->RemoveImage(iter->second.pImage);
- }
- }
- BOOL CSkinTreeCtrl::InsertImage( HTREEITEM hTreeItem,LPCTSTR lpszFileName )
- {
- CMapItemInfo::iterator iter= m_MapItemInfo.find(hTreeItem);
- if ( iter != m_MapItemInfo.end())
- {
- CImageEx *pImage = RenderEngine->GetImage(lpszFileName);
- if (NULL == pImage)
- return FALSE;
- else
- {
- iter->second.pImage = pImage;
- return TRUE;
- }
- }
- else
- {
- tagItemInfo _ItemInfo;
- _ItemInfo.hTreeItem = hTreeItem;
- _ItemInfo.pImage = RenderEngine->GetImage(lpszFileName);
- if (NULL == _ItemInfo.pImage) return FALSE;
- m_MapItemInfo.insert(pair<HTREEITEM,tagItemInfo>(hTreeItem,_ItemInfo));
- return TRUE;
- }
- }
- BOOL CSkinTreeCtrl::SetHovenImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
- {
- RenderEngine->RemoveImage(m_pHovenImg);
- m_pHovenImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pHovenImg)
- return FALSE;
- else
- {
- m_pHovenImg->SetNinePart(lprcNinePart);
- return TRUE;
- }
- }
- BOOL CSkinTreeCtrl::SetPressImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
- {
- RenderEngine->RemoveImage(m_pPressImg);
- m_pPressImg = RenderEngine->GetImage(lpszFileName);
- if (NULL == m_pPressImg)
- return FALSE;
- else
- {
- m_pPressImg->SetNinePart(lprcNinePart);
- return TRUE;
- }
- }
- void CSkinTreeCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
- {
- ISkinControl::SetAttribute(pstrName,pstrValue);
- }
- BOOL CSkinTreeCtrl::CreateControl( CWnd* pParentWnd )
- {
- if( !Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES | WS_BORDER | WS_HSCROLL | WS_TABSTOP,CRect(0,0,0,0),pParentWnd,0) )
- return FALSE;
- m_pOwnWnd = this;
- return TRUE;
- }
- void CSkinTreeCtrl::ParseItem( CXmlNode *root )
- {
- }
|