SkinTreeCtrl.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. // SkinTreeCtrl.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Resource.h"
  5. #include "SkinTreeCtrl.h"
  6. // CSkinTreeCtrl
  7. IMPLEMENT_DYNAMIC(CSkinTreeCtrl, CTreeCtrl)
  8. CSkinTreeCtrl::CSkinTreeCtrl()
  9. {
  10. m_hItemMouseHover=NULL;
  11. m_colBack = RGB(255,255,255);
  12. m_uCursorRes = 0;
  13. m_pImageButton = NULL;
  14. m_pHovenImg = m_pPressImg = NULL;
  15. m_MapItemInfo.clear();
  16. m_colHoven = RGB(255,0,0);
  17. m_colPress = RGB(253,231,161);
  18. }
  19. CSkinTreeCtrl::~CSkinTreeCtrl()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CSkinTreeCtrl, CTreeCtrl)
  23. ON_WM_PAINT()
  24. ON_WM_SETCURSOR()
  25. ON_WM_DESTROY()
  26. END_MESSAGE_MAP()
  27. // CSkinTreeCtrl 消息处理程序
  28. void CSkinTreeCtrl::OnPaint()
  29. {
  30. CPaintDC dc(this); // device context for painting
  31. //获取位置
  32. CRect rcClient;
  33. GetClientRect(&rcClient);
  34. CMemoryDC BufferDC(&dc,rcClient);
  35. //剪切位置
  36. CRect rcClipBox;
  37. BufferDC.GetClipBox(&rcClipBox);
  38. //绘制背景
  39. BufferDC.FillSolidRect(rcClient,m_colBack);
  40. DrawParentWndBg(GetSafeHwnd(),BufferDC->GetSafeHdc());
  41. DrawTreeItem(&BufferDC,rcClient,rcClipBox);
  42. }
  43. VOID CSkinTreeCtrl::DrawTreeItem( CDC * pDC, CRect & rcClient, CRect & rcClipBox )
  44. {
  45. //首项判断
  46. HTREEITEM hItemCurrent=GetFirstVisibleItem();
  47. if (hItemCurrent==NULL) return;
  48. //获取属性
  49. UINT uTreeStyte = GetStyle();
  50. //绘画子项
  51. do
  52. {
  53. //变量定义
  54. CRect rcItem;
  55. CRect rcRect;
  56. //获取状态
  57. HTREEITEM hParent=GetParentItem(hItemCurrent);
  58. UINT uItemState=GetItemState(hItemCurrent,TVIF_STATE);
  59. //获取属性
  60. bool bDrawChildren=(ItemHasChildren(hItemCurrent)==TRUE);
  61. bool bDrawSelected=(uItemState&TVIS_SELECTED)&&((this==GetFocus())||(uTreeStyte&TVS_SHOWSELALWAYS));
  62. //获取区域
  63. if (GetItemRect(hItemCurrent,rcItem,TRUE))
  64. {
  65. //绘画过滤
  66. if (rcItem.top>=rcClient.bottom) break;
  67. if (rcItem.top>=rcClipBox.bottom) continue;
  68. //设置位置
  69. rcRect.left=0;
  70. rcRect.top=rcItem.top+1;
  71. rcRect.bottom=rcItem.bottom;
  72. rcRect.right=rcClient.Width();
  73. //绘画选择
  74. if (bDrawSelected)
  75. {
  76. if (m_pPressImg != NULL && !m_pPressImg->IsNull())
  77. m_pPressImg->Draw(pDC,rcRect);
  78. else
  79. pDC->FillSolidRect(&rcRect,m_colPress);
  80. }
  81. //绘画经过
  82. if ((bDrawSelected==false)&&(m_hItemMouseHover==hItemCurrent))
  83. {
  84. if (m_pHovenImg != NULL && !m_pHovenImg->IsNull())
  85. m_pHovenImg->Draw(pDC,rcRect);
  86. else
  87. pDC->FillSolidRect(&rcRect,m_colHoven);
  88. }
  89. //绘制箭头
  90. if (bDrawChildren && (uTreeStyte&TVS_HASBUTTONS) )
  91. {
  92. if (m_pImageButton != NULL && !m_pImageButton->IsNull())
  93. {
  94. //计算位置
  95. INT nXPos=rcItem.left-m_pImageButton->GetWidth()/2;
  96. INT nYPos=rcItem.top+1+(rcItem.Height()-m_pImageButton->GetHeight())/2;
  97. //绘画图标
  98. INT nIndex=(uItemState&TVIS_EXPANDED)?1L:0L;
  99. m_pImageButton->DrawImage(pDC,nXPos,nYPos,m_pImageButton->GetWidth()/2,m_pImageButton->GetHeight(),nIndex*m_pImageButton->GetWidth()/2,0);
  100. rcItem.left += m_pImageButton->GetWidth();
  101. rcItem.right += m_pImageButton->GetWidth();;
  102. }
  103. }
  104. //绘制列表
  105. DrawListImage(pDC,rcItem,hItemCurrent,bDrawSelected);
  106. //绘制文本
  107. DrawItemString(pDC,rcItem,hItemCurrent,bDrawSelected);
  108. }
  109. } while ((hItemCurrent=GetNextVisibleItem(hItemCurrent))!= NULL);
  110. }
  111. VOID CSkinTreeCtrl::DrawListImage( CDC * pDC, CRect rcRect, HTREEITEM hTreeItem, bool bSelected )
  112. {
  113. CMapItemInfo::iterator iter= m_MapItemInfo.find(hTreeItem);
  114. if( iter == m_MapItemInfo.end() )
  115. {
  116. CImageList *pImageList = GetImageList(TVSIL_NORMAL);
  117. if( pImageList == NULL ) return;
  118. //获取属性
  119. INT nImage,nSelectedImage;
  120. GetItemImage(hTreeItem,nImage,nSelectedImage);
  121. //获取信息
  122. IMAGEINFO ImageInfo;
  123. pImageList->GetImageInfo(bSelected?nSelectedImage:nImage,&ImageInfo);
  124. //绘画图标
  125. INT nImageWidth=ImageInfo.rcImage.right-ImageInfo.rcImage.left;
  126. INT nImageHeight=ImageInfo.rcImage.bottom-ImageInfo.rcImage.top;
  127. pImageList->Draw(pDC,bSelected?nSelectedImage:nImage,CPoint(rcRect.left-nImageWidth-3,rcRect.top+(rcRect.Height()-nImageHeight)/2+1),ILD_TRANSPARENT);
  128. }
  129. else
  130. {
  131. CImageEx *pImage = iter->second.pImage;
  132. pImage->DrawImage(pDC,rcRect.left-pImage->GetWidth()-3,rcRect.top+(rcRect.Height()-pImage->GetHeight())/2+1);
  133. }
  134. }
  135. VOID CSkinTreeCtrl::DrawItemString( CDC * pDC, CRect rcRect, HTREEITEM hTreeItem, bool bSelected )
  136. {
  137. //设置环境
  138. pDC->SelectObject(GetCtrlFont());
  139. pDC->SetBkMode(TRANSPARENT);
  140. if( !IsWindowEnabled() ) pDC->SetTextColor(m_colDisableText);
  141. else pDC->SetTextColor(bSelected?m_colSelectText:m_colNormalText);
  142. //绘画字体
  143. rcRect.right += 5;
  144. CString strString=GetItemText(hTreeItem);
  145. pDC->DrawText(strString,rcRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
  146. return;
  147. }
  148. BOOL CSkinTreeCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  149. {
  150. //获取光标
  151. CPoint MousePoint;
  152. GetCursorPos(&MousePoint);
  153. ScreenToClient(&MousePoint);
  154. //子项测试
  155. HTREEITEM hItemMouseHover=HitTest(MousePoint);
  156. //重画判断
  157. if ((hItemMouseHover!=NULL)&&(hItemMouseHover!=m_hItemMouseHover))
  158. {
  159. //设置变量
  160. m_hItemMouseHover=hItemMouseHover;
  161. //重画界面
  162. Invalidate(FALSE);
  163. }
  164. //设置光标
  165. if (hItemMouseHover!=NULL)
  166. {
  167. if( m_uCursorRes )
  168. SetCursor(LoadCursor(GetModuleHandle(SKINUI_DLL_NAME),MAKEINTRESOURCE(m_uCursorRes)));
  169. return true;
  170. }
  171. return __super::OnSetCursor(pWnd, nHitTest, message);
  172. }
  173. void CSkinTreeCtrl::SetCursorStyle(UINT uID)
  174. {
  175. m_uCursorRes = uID;
  176. }
  177. BOOL CSkinTreeCtrl::SetButtonImage( LPCTSTR lpszFileName )
  178. {
  179. RenderEngine->RemoveImage(m_pImageButton);
  180. m_pImageButton = RenderEngine->GetImage(lpszFileName);
  181. if (NULL == m_pImageButton)
  182. return FALSE;
  183. else
  184. return TRUE;
  185. }
  186. void CSkinTreeCtrl::OnDestroy()
  187. {
  188. __super::OnDestroy();
  189. RenderEngine->RemoveImage(m_pImageButton);
  190. CMapItemInfo::iterator iter= m_MapItemInfo.begin();
  191. for (;iter!= m_MapItemInfo.end();++iter)
  192. {
  193. RenderEngine->RemoveImage(iter->second.pImage);
  194. }
  195. }
  196. BOOL CSkinTreeCtrl::InsertImage( HTREEITEM hTreeItem,LPCTSTR lpszFileName )
  197. {
  198. CMapItemInfo::iterator iter= m_MapItemInfo.find(hTreeItem);
  199. if ( iter != m_MapItemInfo.end())
  200. {
  201. CImageEx *pImage = RenderEngine->GetImage(lpszFileName);
  202. if (NULL == pImage)
  203. return FALSE;
  204. else
  205. {
  206. iter->second.pImage = pImage;
  207. return TRUE;
  208. }
  209. }
  210. else
  211. {
  212. tagItemInfo _ItemInfo;
  213. _ItemInfo.hTreeItem = hTreeItem;
  214. _ItemInfo.pImage = RenderEngine->GetImage(lpszFileName);
  215. if (NULL == _ItemInfo.pImage) return FALSE;
  216. m_MapItemInfo.insert(pair<HTREEITEM,tagItemInfo>(hTreeItem,_ItemInfo));
  217. return TRUE;
  218. }
  219. }
  220. BOOL CSkinTreeCtrl::SetHovenImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
  221. {
  222. RenderEngine->RemoveImage(m_pHovenImg);
  223. m_pHovenImg = RenderEngine->GetImage(lpszFileName);
  224. if (NULL == m_pHovenImg)
  225. return FALSE;
  226. else
  227. {
  228. m_pHovenImg->SetNinePart(lprcNinePart);
  229. return TRUE;
  230. }
  231. }
  232. BOOL CSkinTreeCtrl::SetPressImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
  233. {
  234. RenderEngine->RemoveImage(m_pPressImg);
  235. m_pPressImg = RenderEngine->GetImage(lpszFileName);
  236. if (NULL == m_pPressImg)
  237. return FALSE;
  238. else
  239. {
  240. m_pPressImg->SetNinePart(lprcNinePart);
  241. return TRUE;
  242. }
  243. }
  244. void CSkinTreeCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  245. {
  246. ISkinControl::SetAttribute(pstrName,pstrValue);
  247. }
  248. BOOL CSkinTreeCtrl::CreateControl( CWnd* pParentWnd )
  249. {
  250. if( !Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES | WS_BORDER | WS_HSCROLL | WS_TABSTOP,CRect(0,0,0,0),pParentWnd,0) )
  251. return FALSE;
  252. m_pOwnWnd = this;
  253. return TRUE;
  254. }
  255. void CSkinTreeCtrl::ParseItem( CXmlNode *root )
  256. {
  257. }