SkinToolBar.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. // SkinToolBar.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SkinUI.h"
  5. #include "SkinToolBar.h"
  6. CSkinToolBarItem::CSkinToolBarItem( void )
  7. {
  8. m_nID = 0;
  9. m_dwStyle = STBI_STYLE_BUTTON;
  10. m_nWidth = m_nHeight = 0;
  11. m_nLeftWidth = m_nRightWidth = 0;
  12. m_nPadding = 0;
  13. m_strText = _T("");
  14. m_strToolTipText = _T("");
  15. m_lpBgImgN = m_lpBgImgH = m_lpBgImgD = NULL;
  16. m_lpLeftH = m_lpLeftD = NULL;
  17. m_lpRightH = m_lpRightD = NULL;
  18. m_lpSepartorImg = NULL;
  19. m_lpArrowImg = NULL;
  20. m_lpIconImg = NULL;
  21. m_bChecked = FALSE;
  22. }
  23. CSkinToolBarItem::~CSkinToolBarItem( void )
  24. {
  25. RenderEngine->RemoveImage(m_lpBgImgN);
  26. RenderEngine->RemoveImage(m_lpBgImgH);
  27. RenderEngine->RemoveImage(m_lpBgImgD);
  28. RenderEngine->RemoveImage(m_lpLeftH);
  29. RenderEngine->RemoveImage(m_lpLeftD);
  30. RenderEngine->RemoveImage(m_lpRightH);
  31. RenderEngine->RemoveImage(m_lpRightD);
  32. RenderEngine->RemoveImage(m_lpSepartorImg);
  33. RenderEngine->RemoveImage(m_lpArrowImg);
  34. RenderEngine->RemoveImage(m_lpIconImg);
  35. }
  36. //////////////////////////////////////////////////////////////////////////
  37. // CSkinToolBar
  38. IMPLEMENT_DYNAMIC(CSkinToolBar, CWnd)
  39. CSkinToolBar::CSkinToolBar()
  40. {
  41. m_lpBgImg = NULL;
  42. m_nPressIndex = m_nHoverIndex = -1;
  43. m_bPressLorR = m_bHoverLorR = FALSE;
  44. m_bMouseTracking = FALSE;
  45. m_nLeft = m_nTop = 0;
  46. m_bAutoSize = FALSE;
  47. }
  48. CSkinToolBar::~CSkinToolBar()
  49. {
  50. }
  51. BEGIN_MESSAGE_MAP(CSkinToolBar, CWnd)
  52. ON_WM_ERASEBKGND()
  53. ON_WM_PAINT()
  54. ON_WM_LBUTTONDOWN()
  55. ON_WM_LBUTTONUP()
  56. ON_WM_MOUSEMOVE()
  57. ON_WM_DESTROY()
  58. ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
  59. END_MESSAGE_MAP()
  60. // CSkinToolBar 消息处理程序
  61. void CSkinToolBar::SetLeftTop(int nLeft, int nTop)
  62. {
  63. m_nLeft = nLeft;
  64. m_nTop = nTop;
  65. }
  66. void CSkinToolBar::SetAutoSize(BOOL bAutoSize)
  67. {
  68. m_bAutoSize = bAutoSize;
  69. }
  70. BOOL CSkinToolBar::SetBgPic(LPCTSTR lpszFileName, CONST LPRECT lprcNinePart)
  71. {
  72. RenderEngine->RemoveImage(m_lpBgImg);
  73. m_lpBgImg = RenderEngine->GetImage(lpszFileName);
  74. if (NULL == m_lpBgImg)
  75. return FALSE;
  76. m_lpBgImg->SetNinePart(lprcNinePart);
  77. return TRUE;
  78. }
  79. int CSkinToolBar::AddItem(int nID, DWORD dwStyle)
  80. {
  81. CSkinToolBarItem * lpItem = new CSkinToolBarItem;
  82. if (NULL == lpItem)
  83. return -1;
  84. lpItem->m_nID = nID;
  85. lpItem->m_dwStyle = dwStyle;
  86. m_arrItems.push_back(lpItem);
  87. return m_arrItems.size() - 1;
  88. }
  89. void CSkinToolBar::SetItemStyle(int nIndex, int dwStyle)
  90. {
  91. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  92. if (lpItem != NULL)
  93. lpItem->m_dwStyle = dwStyle;
  94. }
  95. void CSkinToolBar::SetItemID(int nIndex, int nID)
  96. {
  97. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  98. if (lpItem != NULL)
  99. lpItem->m_nID = nID;
  100. }
  101. void CSkinToolBar::SetItemSize(int nIndex, int nWidth, int nHeight,
  102. int nLeftWidth/* = 0*/, int nRightWidth/* = 0*/)
  103. {
  104. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  105. if (lpItem != NULL)
  106. {
  107. lpItem->m_nWidth = nWidth;
  108. lpItem->m_nHeight = nHeight;
  109. lpItem->m_nLeftWidth = nLeftWidth;
  110. lpItem->m_nRightWidth = nRightWidth;
  111. }
  112. }
  113. void CSkinToolBar::SetItemPadding(int nIndex, int nPadding)
  114. {
  115. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  116. if (lpItem != NULL)
  117. lpItem->m_nPadding = nPadding;
  118. }
  119. void CSkinToolBar::SetItemText(int nIndex, LPCTSTR lpszText)
  120. {
  121. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  122. if (lpItem != NULL)
  123. lpItem->m_strText = lpszText;
  124. }
  125. void CSkinToolBar::SetItemToolTipText(int nIndex, LPCTSTR lpszText)
  126. {
  127. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  128. if (lpItem != NULL)
  129. lpItem->m_strToolTipText = lpszText;
  130. }
  131. BOOL CSkinToolBar::SetItemBgPic(int nIndex, LPCTSTR lpNormal,
  132. LPCTSTR lpHighlight, LPCTSTR lpDown, CONST LPRECT lprcNinePart)
  133. {
  134. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  135. if (NULL == lpItem)
  136. return FALSE;
  137. RenderEngine->RemoveImage(lpItem->m_lpBgImgN);
  138. RenderEngine->RemoveImage(lpItem->m_lpBgImgH);
  139. RenderEngine->RemoveImage(lpItem->m_lpBgImgD);
  140. lpItem->m_lpBgImgN = RenderEngine->GetImage(lpNormal);
  141. lpItem->m_lpBgImgH = RenderEngine->GetImage(lpHighlight);
  142. lpItem->m_lpBgImgD = RenderEngine->GetImage(lpDown);
  143. if (lpItem->m_lpBgImgN != NULL)
  144. lpItem->m_lpBgImgN->SetNinePart(lprcNinePart);
  145. if (lpItem->m_lpBgImgH != NULL)
  146. lpItem->m_lpBgImgH->SetNinePart(lprcNinePart);
  147. if (lpItem->m_lpBgImgD != NULL)
  148. lpItem->m_lpBgImgD->SetNinePart(lprcNinePart);
  149. if ((lpNormal != NULL && NULL == lpItem->m_lpBgImgN) ||
  150. (lpHighlight != NULL && NULL == lpItem->m_lpBgImgH) ||
  151. (lpDown != NULL && NULL == lpItem->m_lpBgImgD))
  152. return FALSE;
  153. else
  154. return TRUE;
  155. }
  156. BOOL CSkinToolBar::SetItemLeftBgPic(int nIndex, LPCTSTR lpHighlight,
  157. LPCTSTR lpDown, CONST LPRECT lprcNinePart)
  158. {
  159. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  160. if (NULL == lpItem)
  161. return FALSE;
  162. RenderEngine->RemoveImage(lpItem->m_lpLeftH);
  163. RenderEngine->RemoveImage(lpItem->m_lpLeftD);
  164. lpItem->m_lpLeftH = RenderEngine->GetImage(lpHighlight);
  165. lpItem->m_lpLeftD = RenderEngine->GetImage(lpDown);
  166. if (lpItem->m_lpLeftH != NULL)
  167. lpItem->m_lpLeftH->SetNinePart(lprcNinePart);
  168. if (lpItem->m_lpLeftD != NULL)
  169. lpItem->m_lpLeftD->SetNinePart(lprcNinePart);
  170. if ((lpHighlight != NULL && NULL == lpItem->m_lpLeftH) ||
  171. (lpDown != NULL && NULL == lpItem->m_lpLeftD))
  172. return FALSE;
  173. else
  174. return TRUE;
  175. }
  176. BOOL CSkinToolBar::SetItemRightBgPic(int nIndex, LPCTSTR lpHighlight,
  177. LPCTSTR lpDown, CONST LPRECT lprcNinePart)
  178. {
  179. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  180. if (NULL == lpItem)
  181. return FALSE;
  182. RenderEngine->RemoveImage(lpItem->m_lpRightH);
  183. RenderEngine->RemoveImage(lpItem->m_lpRightD);
  184. lpItem->m_lpRightH = RenderEngine->GetImage(lpHighlight);
  185. lpItem->m_lpRightD = RenderEngine->GetImage(lpDown);
  186. if (lpItem->m_lpRightH != NULL)
  187. lpItem->m_lpRightH->SetNinePart(lprcNinePart);
  188. if (lpItem->m_lpRightD != NULL)
  189. lpItem->m_lpRightD->SetNinePart(lprcNinePart);
  190. if ((lpHighlight != NULL && NULL == lpItem->m_lpRightH) ||
  191. (lpDown != NULL && NULL == lpItem->m_lpRightD))
  192. return FALSE;
  193. else
  194. return TRUE;
  195. }
  196. BOOL CSkinToolBar::SetItemSepartorPic(int nIndex, LPCTSTR lpszFileName)
  197. {
  198. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  199. if (NULL == lpItem)
  200. return FALSE;
  201. RenderEngine->RemoveImage(lpItem->m_lpSepartorImg);
  202. lpItem->m_lpSepartorImg = RenderEngine->GetImage(lpszFileName);
  203. if (NULL == lpItem->m_lpSepartorImg)
  204. return FALSE;
  205. else
  206. return TRUE;
  207. }
  208. BOOL CSkinToolBar::SetItemArrowPic(int nIndex, LPCTSTR lpszFileName)
  209. {
  210. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  211. if (NULL == lpItem)
  212. return FALSE;
  213. RenderEngine->RemoveImage(lpItem->m_lpArrowImg);
  214. lpItem->m_lpArrowImg = RenderEngine->GetImage(lpszFileName);
  215. if (NULL == lpItem->m_lpArrowImg)
  216. return FALSE;
  217. else
  218. return TRUE;
  219. }
  220. BOOL CSkinToolBar::SetItemIconPic(int nIndex, LPCTSTR lpszFileName)
  221. {
  222. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  223. if (NULL == lpItem)
  224. return FALSE;
  225. RenderEngine->RemoveImage(lpItem->m_lpIconImg);
  226. lpItem->m_lpIconImg = RenderEngine->GetImage(lpszFileName);
  227. if (NULL == lpItem->m_lpIconImg)
  228. return FALSE;
  229. else
  230. return TRUE;
  231. }
  232. BOOL CSkinToolBar::GetItemRectByIndex(int nIndex, CRect& rect)
  233. {
  234. CSkinToolBarItem * lpItem;
  235. int nLeft = m_nLeft, nTop = m_nTop;
  236. for (int i = 0; i < (int)m_arrItems.size(); i++)
  237. {
  238. lpItem = m_arrItems[i];
  239. if (lpItem != NULL)
  240. {
  241. if (i == nIndex)
  242. {
  243. rect = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
  244. return TRUE;
  245. }
  246. nLeft += lpItem->m_nWidth;
  247. nLeft += lpItem->m_nPadding;
  248. }
  249. }
  250. return FALSE;
  251. }
  252. BOOL CSkinToolBar::GetItemRectByID(int nID, CRect& rect)
  253. {
  254. CSkinToolBarItem * lpItem;
  255. int nLeft = m_nLeft, nTop = m_nTop;
  256. for (int i = 0; i < (int)m_arrItems.size(); i++)
  257. {
  258. lpItem = m_arrItems[i];
  259. if (lpItem != NULL)
  260. {
  261. if (lpItem->m_nID == nID)
  262. {
  263. rect = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
  264. return TRUE;
  265. }
  266. nLeft += lpItem->m_nWidth;
  267. nLeft += lpItem->m_nPadding;
  268. }
  269. }
  270. return FALSE;
  271. }
  272. BOOL CSkinToolBar::GetItemCheckState(int nIndex)
  273. {
  274. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  275. return ((lpItem != NULL) ? lpItem->m_bChecked : FALSE);
  276. }
  277. void CSkinToolBar::SetItemCheckState(int nIndex, BOOL bChecked)
  278. {
  279. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  280. if (lpItem != NULL && lpItem->m_bChecked != bChecked)
  281. {
  282. lpItem->m_bChecked = bChecked;
  283. }
  284. }
  285. BOOL CSkinToolBar::OnEraseBkgnd(CDC* pDC)
  286. {
  287. return TRUE;
  288. return __super::OnEraseBkgnd(pDC);
  289. }
  290. void CSkinToolBar::OnPaint()
  291. {
  292. CPaintDC dc(this); // device context for painting
  293. CRect rcClient;
  294. GetClientRect(&rcClient);
  295. CMemoryDC MemDC(&dc, rcClient);
  296. DrawParentWndBg(GetSafeHwnd(),MemDC.m_hDC);
  297. if ( CHECK_IMAGE(m_lpBgImg) )
  298. m_lpBgImg->Draw(&MemDC, rcClient);
  299. for (int i = 0; i < (int)m_arrItems.size(); i++)
  300. {
  301. DrawItem(&MemDC, i);
  302. }
  303. }
  304. void CSkinToolBar::OnLButtonDown(UINT nFlags, CPoint point)
  305. {
  306. SetFocus();
  307. m_nPressIndex = HitTest(point);
  308. if (m_nPressIndex != -1)
  309. {
  310. CSkinToolBarItem * lpItem = GetItemByIndex(m_nPressIndex);
  311. if (lpItem != NULL)
  312. {
  313. CRect rcItem;
  314. GetItemRectByIndex(m_nPressIndex, rcItem);
  315. CRect rcLeft, rcRight;
  316. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN ||
  317. lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
  318. {
  319. rcLeft = rcItem;
  320. rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
  321. rcRight = rcItem;
  322. rcRight.left += lpItem->m_nLeftWidth;
  323. rcRight.right = rcRight.left + lpItem->m_nRightWidth;
  324. if (rcLeft.PtInRect(point))
  325. m_bPressLorR = TRUE;
  326. if (rcRight.PtInRect(point))
  327. m_bPressLorR = FALSE;
  328. }
  329. if (lpItem->m_dwStyle & STBI_STYLE_CHECK && !((lpItem->m_dwStyle & STBI_STYLE_DROPDOWN) && !m_bPressLorR))
  330. {
  331. lpItem->m_bChecked = !lpItem->m_bChecked;
  332. Invalidate(FALSE);
  333. if (lpItem->m_bChecked)
  334. {
  335. ::SendMessage(::GetParent(m_hWnd), WM_COMMAND,
  336. MAKEWPARAM(lpItem->m_nID, BN_PUSHED), 0);
  337. }
  338. else
  339. {
  340. ::SendMessage(::GetParent(m_hWnd), WM_COMMAND,
  341. MAKEWPARAM(lpItem->m_nID, BN_UNPUSHED), 0);
  342. }
  343. }
  344. else
  345. {
  346. if ((lpItem->m_dwStyle & STBI_STYLE_DROPDOWN && !m_bPressLorR)
  347. || (lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN))
  348. {
  349. Invalidate(FALSE);
  350. NMTOOLBAR nmtb = {0};
  351. nmtb.hdr.hwndFrom = m_hWnd;
  352. nmtb.hdr.idFrom = GetDlgCtrlID();
  353. nmtb.hdr.code = TBN_DROPDOWN;
  354. nmtb.iItem = lpItem->m_nID;
  355. nmtb.rcButton = rcItem;
  356. ::SendMessage(::GetParent(m_hWnd), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmtb);
  357. m_nPressIndex = -1;
  358. Invalidate(FALSE);
  359. }
  360. else
  361. {
  362. Invalidate(FALSE);
  363. ::SetCapture(m_hWnd);
  364. }
  365. }
  366. }
  367. }
  368. __super::OnLButtonDown(nFlags, point);
  369. }
  370. void CSkinToolBar::OnLButtonUp(UINT nFlags, CPoint point)
  371. {
  372. HWND hWnd = ::GetCapture();
  373. if (m_hWnd == hWnd)
  374. ::ReleaseCapture();
  375. int nIndex = HitTest(point);
  376. BOOL bClicked;
  377. if (nIndex != -1 && nIndex == m_nPressIndex)
  378. bClicked = TRUE;
  379. else
  380. bClicked = FALSE;
  381. if (m_nPressIndex != -1)
  382. {
  383. m_nPressIndex = -1;
  384. Invalidate(FALSE);
  385. }
  386. if (bClicked)
  387. {
  388. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  389. if (lpItem != NULL)
  390. {
  391. CRect rcItem;
  392. GetItemRectByIndex(m_nPressIndex, rcItem);
  393. CRect rcLeft, rcRight;
  394. BOOL bClickLorR = FALSE;
  395. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN ||
  396. lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
  397. {
  398. rcLeft = rcItem;
  399. rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
  400. rcRight = rcItem;
  401. rcRight.left += lpItem->m_nLeftWidth;
  402. rcRight.right = rcRight.left + lpItem->m_nRightWidth;
  403. if (rcLeft.PtInRect(point))
  404. bClickLorR = TRUE;
  405. if (rcRight.PtInRect(point))
  406. bClickLorR = FALSE;
  407. }
  408. if ((!(lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN))
  409. || (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN && bClickLorR && bClickLorR == m_bPressLorR))
  410. ::SendMessage(::GetParent(m_hWnd), WM_COMMAND, MAKEWPARAM(lpItem->m_nID, BN_CLICKED), 0);
  411. }
  412. }
  413. __super::OnLButtonUp(nFlags, point);
  414. }
  415. void CSkinToolBar::OnMouseMove(UINT nFlags, CPoint point)
  416. {
  417. if (m_nPressIndex != -1)
  418. return;
  419. if (!m_bMouseTracking)
  420. {
  421. TrackMouseLeave(GetSafeHwnd());
  422. m_bMouseTracking = TRUE;
  423. }
  424. int nIndex;
  425. BOOL bHoverLorR = FALSE;
  426. nIndex = HitTest(point);
  427. if (nIndex != -1)
  428. {
  429. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  430. if (lpItem != NULL)
  431. {
  432. CRect rcItem;
  433. GetItemRectByIndex(nIndex, rcItem);
  434. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN ||
  435. lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
  436. {
  437. CRect rcLeft(rcItem);
  438. rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
  439. CRect rcRight(rcItem);
  440. rcRight.left += lpItem->m_nLeftWidth;
  441. rcRight.right = rcRight.left + lpItem->m_nRightWidth;
  442. if (rcLeft.PtInRect(point))
  443. bHoverLorR = TRUE;
  444. if (rcRight.PtInRect(point))
  445. bHoverLorR = FALSE;
  446. }
  447. if (nIndex != m_nHoverIndex && lpItem->m_strToolTipText.GetLength() > 0)
  448. {
  449. if (!m_ToolTipCtrl.GetSafeHwnd())
  450. {
  451. m_ToolTipCtrl.Create(this);
  452. m_ToolTipCtrl.SetMaxTipWidth(200);
  453. }
  454. if (m_ToolTipCtrl.GetSafeHwnd())
  455. {
  456. if (m_ToolTipCtrl.GetToolCount() <= 0)
  457. {
  458. m_ToolTipCtrl.Activate(TRUE);
  459. m_ToolTipCtrl.AddTool(this, lpItem->m_strToolTipText.GetBuffer(), &rcItem, 1);
  460. }
  461. else
  462. {
  463. m_ToolTipCtrl.Activate(TRUE);
  464. m_ToolTipCtrl.UpdateTipText(lpItem->m_strToolTipText.GetBuffer(), this, 1);
  465. m_ToolTipCtrl.SetToolRect(this, 1, &rcItem);
  466. }
  467. }
  468. }
  469. }
  470. }
  471. if (nIndex != m_nHoverIndex || m_bHoverLorR != bHoverLorR)
  472. {
  473. m_nHoverIndex = nIndex;
  474. m_bHoverLorR = bHoverLorR;
  475. Invalidate(FALSE);
  476. }
  477. __super::OnMouseMove(nFlags, point);
  478. }
  479. void CSkinToolBar::OnDestroy()
  480. {
  481. __super::OnDestroy();
  482. if (m_ToolTipCtrl.GetSafeHwnd())
  483. m_ToolTipCtrl.DestroyWindow();
  484. m_ToolTipCtrl.m_hWnd = NULL;
  485. CSkinToolBarItem * lpItem;
  486. for (int i = 0; i < (int)m_arrItems.size(); i++)
  487. {
  488. lpItem = m_arrItems[i];
  489. if (lpItem != NULL)
  490. delete lpItem;
  491. }
  492. m_arrItems.clear();
  493. RenderEngine->RemoveImage(m_lpBgImg);
  494. m_nPressIndex = m_nHoverIndex = -1;
  495. m_bPressLorR = m_bHoverLorR = FALSE;
  496. m_bMouseTracking = FALSE;
  497. m_nLeft = m_nTop = 0;
  498. m_bAutoSize = FALSE;
  499. }
  500. LRESULT CSkinToolBar::OnMouseLeave( WPARAM wparam, LPARAM lparam )
  501. {
  502. m_bMouseTracking = FALSE;
  503. int nIndex = -1;
  504. if (nIndex != m_nHoverIndex)
  505. {
  506. m_nHoverIndex = nIndex;
  507. Invalidate(FALSE);
  508. }
  509. return TRUE;
  510. }
  511. BOOL CSkinToolBar::PreTranslateMessage(MSG* pMsg)
  512. {
  513. if (m_ToolTipCtrl.GetSafeHwnd())
  514. m_ToolTipCtrl.RelayEvent(pMsg);
  515. return __super::PreTranslateMessage(pMsg);
  516. }
  517. CSkinToolBarItem * CSkinToolBar::GetItemByIndex(int nIndex)
  518. {
  519. if (nIndex >= 0 && nIndex < (int)m_arrItems.size())
  520. return m_arrItems[nIndex];
  521. else
  522. return NULL;
  523. }
  524. CSkinToolBarItem * CSkinToolBar::GetItemByID(int nID)
  525. {
  526. CSkinToolBarItem * lpItem;
  527. for (int i = 0; i < (int)m_arrItems.size(); i++)
  528. {
  529. lpItem = m_arrItems[i];
  530. if (lpItem != NULL && lpItem->m_nID == nID)
  531. return lpItem;
  532. }
  533. return NULL;
  534. }
  535. int CSkinToolBar::HitTest(POINT pt)
  536. {
  537. CSkinToolBarItem * lpItem;
  538. int nLeft = m_nLeft, nTop = m_nTop;
  539. CRect rcItem;
  540. for (int i = 0; i < (int)m_arrItems.size(); i++)
  541. {
  542. lpItem = m_arrItems[i];
  543. if (lpItem != NULL)
  544. {
  545. rcItem = CRect(nLeft, nTop, nLeft+lpItem->m_nWidth, nTop+lpItem->m_nHeight);
  546. if (rcItem.PtInRect(pt))
  547. {
  548. if (lpItem->m_dwStyle & STBI_STYLE_SEPARTOR)
  549. return -1;
  550. else
  551. return i;
  552. }
  553. nLeft += lpItem->m_nWidth;
  554. nLeft += lpItem->m_nPadding;
  555. }
  556. }
  557. return -1;
  558. }
  559. void CSkinToolBar::DrawItem(CDC*pDC, int nIndex)
  560. {
  561. CSkinToolBarItem * lpItem = GetItemByIndex(nIndex);
  562. if (NULL == lpItem)
  563. return;
  564. CRect rcItem;
  565. GetItemRectByIndex(nIndex, rcItem);
  566. CRect rcLeft, rcRight;
  567. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
  568. || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
  569. {
  570. rcLeft = rcItem;
  571. rcLeft.right = rcLeft.left + lpItem->m_nLeftWidth;
  572. rcRight = rcItem;
  573. rcRight.left += lpItem->m_nLeftWidth;
  574. rcRight.right = rcRight.left + lpItem->m_nRightWidth;
  575. }
  576. if (lpItem->m_dwStyle & STBI_STYLE_SEPARTOR)
  577. {
  578. if (lpItem->m_lpSepartorImg != NULL && !lpItem->m_lpSepartorImg->IsNull())
  579. lpItem->m_lpSepartorImg->Draw(pDC, rcItem);
  580. return;
  581. }
  582. if ((lpItem->m_dwStyle & STBI_STYLE_CHECK) && lpItem->m_bChecked)
  583. {
  584. if (lpItem->m_lpBgImgD != NULL && !lpItem->m_lpBgImgD->IsNull())
  585. lpItem->m_lpBgImgD->Draw(pDC, rcItem);
  586. rcItem.OffsetRect(1, 1);
  587. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
  588. {
  589. if (lpItem->m_lpLeftD != NULL && !lpItem->m_lpLeftD->IsNull())
  590. lpItem->m_lpLeftD->Draw(pDC, rcLeft);
  591. rcLeft.OffsetRect(1, 1);
  592. }
  593. if (m_nPressIndex == nIndex)
  594. {
  595. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
  596. {
  597. if (!m_bPressLorR)
  598. {
  599. if (lpItem->m_lpRightD != NULL && !lpItem->m_lpRightD->IsNull())
  600. lpItem->m_lpRightD->Draw(pDC, rcRight);
  601. rcRight.OffsetRect(1, 1);
  602. }
  603. }
  604. }
  605. else if (m_nHoverIndex == nIndex)
  606. {
  607. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
  608. {
  609. if (!m_bHoverLorR)
  610. {
  611. if (lpItem->m_lpRightH != NULL && !lpItem->m_lpRightH->IsNull())
  612. lpItem->m_lpRightH->Draw(pDC, rcRight);
  613. }
  614. }
  615. }
  616. }
  617. else
  618. {
  619. if (m_nPressIndex == nIndex)
  620. {
  621. if (lpItem->m_lpBgImgD != NULL && !lpItem->m_lpBgImgD->IsNull())
  622. lpItem->m_lpBgImgD->Draw(pDC, rcItem);
  623. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
  624. {
  625. if (m_bPressLorR)
  626. {
  627. if (lpItem->m_lpLeftD != NULL && !lpItem->m_lpLeftD->IsNull())
  628. lpItem->m_lpLeftD->Draw(pDC, rcLeft);
  629. }
  630. else
  631. {
  632. if (lpItem->m_lpRightD != NULL && !lpItem->m_lpRightD->IsNull())
  633. lpItem->m_lpRightD->Draw(pDC, rcRight);
  634. }
  635. }
  636. rcItem.OffsetRect(1, 1);
  637. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
  638. || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
  639. {
  640. if (m_bPressLorR)
  641. rcLeft.OffsetRect(1, 1);
  642. else
  643. rcRight.OffsetRect(1, 1);
  644. }
  645. }
  646. else if (m_nHoverIndex == nIndex)
  647. {
  648. if (lpItem->m_lpBgImgH != NULL && !lpItem->m_lpBgImgH->IsNull())
  649. lpItem->m_lpBgImgH->Draw(pDC, rcItem);
  650. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN)
  651. {
  652. if (m_bHoverLorR)
  653. {
  654. if (lpItem->m_lpLeftH != NULL && !lpItem->m_lpLeftH->IsNull())
  655. lpItem->m_lpLeftH->Draw(pDC, rcLeft);
  656. }
  657. else
  658. {
  659. if (lpItem->m_lpRightH != NULL && !lpItem->m_lpRightH->IsNull())
  660. lpItem->m_lpRightH->Draw(pDC, rcRight);
  661. }
  662. }
  663. }
  664. }
  665. BOOL bHasText = FALSE;
  666. if (lpItem->m_strText.GetLength() > 0)
  667. bHasText = TRUE;
  668. BOOL bHasIcon = FALSE;
  669. if (lpItem->m_lpIconImg != NULL && !lpItem->m_lpIconImg->IsNull())
  670. bHasIcon = TRUE;
  671. if (!(lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
  672. || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN))
  673. rcLeft = rcItem;
  674. if (bHasIcon && bHasText) // 带图标和文字
  675. {
  676. int cxIcon = lpItem->m_lpIconImg->GetWidth();
  677. int cyIcon = lpItem->m_lpIconImg->GetHeight();
  678. int nMode = pDC->SetBkMode(TRANSPARENT);
  679. HFONT hFont = (HFONT)SendMessage(WM_GETFONT, 0, 0);
  680. if (NULL == hFont)
  681. hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
  682. HFONT hOldFont = (HFONT)pDC->SelectObject(hFont);
  683. CRect rcText(0,0,0,0); // 计算文字宽高
  684. pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcText, DT_SINGLELINE | DT_CALCRECT);
  685. int cx = cxIcon+1+rcText.Width();
  686. int cy = cyIcon;
  687. CRect rcCenter;
  688. CalcCenterRect(rcLeft, cx, cy, rcCenter);
  689. CRect rcIcon(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
  690. lpItem->m_lpIconImg->Draw(pDC, rcIcon);
  691. UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  692. rcText = CRect(rcIcon.right+1, rcLeft.top, rcIcon.right+1+rcText.Width(), rcLeft.bottom);
  693. pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcText, nFormat);
  694. pDC->SelectObject(hOldFont);
  695. pDC->SetBkMode(nMode);
  696. }
  697. else if (bHasIcon) // 仅图标
  698. {
  699. int cxIcon = lpItem->m_lpIconImg->GetWidth();
  700. int cyIcon = lpItem->m_lpIconImg->GetHeight();
  701. CRect rcIcon;
  702. CalcCenterRect(rcLeft, cxIcon, cyIcon, rcIcon);
  703. lpItem->m_lpIconImg->Draw(pDC, rcIcon);
  704. }
  705. else if (bHasText) // 仅文字
  706. {
  707. UINT nFormat = DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  708. int nMode = pDC->SetBkMode( TRANSPARENT);
  709. HFONT hFont = (HFONT)SendMessage(WM_GETFONT, 0, 0);
  710. if (NULL == hFont)
  711. hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
  712. HFONT hOldFont = (HFONT)pDC->SelectObject(hFont);
  713. pDC->DrawText(lpItem->m_strText, lpItem->m_strText.GetLength(), &rcLeft, nFormat);
  714. pDC->SelectObject(hOldFont);
  715. pDC->SetBkMode(nMode);
  716. }
  717. if (lpItem->m_dwStyle & STBI_STYLE_DROPDOWN
  718. || lpItem->m_dwStyle & STBI_STYLE_WHOLEDROPDOWN)
  719. {
  720. if (lpItem->m_lpArrowImg != NULL && !lpItem->m_lpArrowImg->IsNull())
  721. {
  722. int cxArrow = lpItem->m_lpArrowImg->GetWidth();
  723. int cyArrow = lpItem->m_lpArrowImg->GetHeight();
  724. CRect rcArrow;
  725. CalcCenterRect(rcRight, cxArrow, cyArrow, rcArrow);
  726. rcArrow.left = rcRight.left;
  727. rcArrow.right = rcArrow.left + cxArrow;
  728. lpItem->m_lpArrowImg->Draw(pDC, rcArrow);
  729. }
  730. }
  731. }
  732. BOOL CSkinToolBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  733. {
  734. return __super::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,pParentWnd, nID);
  735. }
  736. void CSkinToolBar::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  737. {
  738. ISkinControl::SetAttribute(pstrName,pstrValue);
  739. }
  740. void CSkinToolBar::ParseItem( CXmlNode *root )
  741. {
  742. }
  743. BOOL CSkinToolBar::CreateControl( CWnd* pParentWnd )
  744. {
  745. if( !Create(WS_CHILD|WS_VISIBLE | WS_TABSTOP,CRect(0,0,0,0),pParentWnd,0) )
  746. return FALSE;
  747. m_pOwnWnd = this;
  748. return TRUE;
  749. }