SkinButton.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. // ButtonEx.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SkinButton.h"
  5. // CSkinButton
  6. IMPLEMENT_DYNAMIC(CSkinButton, CButton)
  7. CSkinButton::CSkinButton()
  8. {
  9. m_pBackImgN = m_pBackImgH = m_pBackImgD = m_pBackImgF = NULL;
  10. m_pCheckImgN = m_pCheckImgH = m_pCheckImgTickN = m_pCheckImgTickH = NULL;
  11. m_pArrowImg = m_pIconImg = NULL;
  12. m_bFocus = m_bPress = m_bHover = m_bMouseTracking = FALSE;
  13. m_nBtnType = en_PushButton;
  14. m_hMenu = NULL;
  15. m_hBackDC = NULL;
  16. m_bPushed = false;
  17. m_lpszUrl = NULL;
  18. }
  19. CSkinButton::~CSkinButton()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CSkinButton, CButton)
  23. ON_WM_MOUSEMOVE()
  24. ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
  25. ON_WM_ERASEBKGND()
  26. ON_WM_DESTROY()
  27. ON_WM_LBUTTONDOWN()
  28. ON_WM_LBUTTONUP()
  29. ON_WM_SETFOCUS()
  30. ON_WM_KILLFOCUS()
  31. ON_WM_PAINT()
  32. ON_WM_LBUTTONDBLCLK()
  33. END_MESSAGE_MAP()
  34. // CSkinButton 消息处理程序
  35. void CSkinButton::SetButtonType( UI_BUTTON_TYPE type )
  36. {
  37. m_nBtnType = type;
  38. if ( type == en_CheckButton ) ModifyStyle(0,BS_AUTOCHECKBOX);
  39. else if ( type == en_RadioButton ) ModifyStyle(0,BS_AUTORADIOBUTTON);
  40. }
  41. //鼠标移动消息
  42. void CSkinButton::OnMouseMove(UINT nFlags, CPoint point)
  43. {
  44. if (!m_bMouseTracking)
  45. {
  46. TrackMouseLeave(GetSafeHwnd());
  47. m_bMouseTracking = TRUE;
  48. m_bHover = TRUE;
  49. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  50. }
  51. __super::OnMouseMove(nFlags, point);
  52. }
  53. //鼠标离开消息
  54. LRESULT CSkinButton::OnMouseLeave(WPARAM wparam, LPARAM lparam)
  55. {
  56. m_bMouseTracking = FALSE;
  57. m_bHover = FALSE;
  58. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  59. return 0;
  60. }
  61. //鼠标按下消息
  62. void CSkinButton::OnLButtonDown(UINT nFlags, CPoint point)
  63. {
  64. m_bPress = TRUE;
  65. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  66. __super::OnLButtonDown(nFlags, point);
  67. }
  68. //鼠标抬起消息
  69. void CSkinButton::OnLButtonUp(UINT nFlags, CPoint point)
  70. {
  71. if (m_bPress)
  72. {
  73. static bool bPushed = false;
  74. if( !m_bPushed && !bPushed )
  75. m_bPress = FALSE;
  76. if ( m_bPushed )
  77. {
  78. if( bPushed ) m_bPress = FALSE;
  79. else m_bPress = TRUE;
  80. bPushed = !bPushed;
  81. }
  82. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  83. if (m_nBtnType == en_MenuButton)
  84. {
  85. if (::IsMenu(m_hMenu))
  86. {
  87. CRect rc;
  88. GetClientRect(&rc);
  89. ClientToScreen(&rc);
  90. ::TrackPopupMenuEx(m_hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
  91. rc.left, rc.bottom, ::GetParent(GetSafeHwnd()), NULL);
  92. }
  93. }
  94. if ( m_lpszUrl != NULL )
  95. {
  96. OpenLink(m_lpszUrl);
  97. }
  98. }
  99. __super::OnLButtonUp(nFlags, point);
  100. }
  101. //鼠标双击消息
  102. void CSkinButton::OnLButtonDblClk(UINT nFlags, CPoint point)
  103. {
  104. m_bPress = TRUE;
  105. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  106. __super::OnLButtonDown(nFlags, point);
  107. }
  108. //获取焦点消息
  109. void CSkinButton::OnSetFocus(CWnd* pOldWnd)
  110. {
  111. __super::OnSetFocus(pOldWnd);
  112. m_bFocus = TRUE;
  113. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  114. }
  115. //失去焦点消息
  116. void CSkinButton::OnKillFocus(CWnd* pNewWnd)
  117. {
  118. __super::OnKillFocus(pNewWnd);
  119. m_bFocus = FALSE;
  120. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  121. }
  122. //重画消息
  123. BOOL CSkinButton::OnEraseBkgnd(CDC* pDC)
  124. {
  125. return TRUE;
  126. }
  127. //设置资源
  128. BOOL CSkinButton::SetBackImage( LPCTSTR lpNormal, LPCTSTR lpHoven, LPCTSTR lpDown, LPCTSTR lpFocus,CONST LPRECT lprcNinePart/*=NULL*/ )
  129. {
  130. RenderEngine->RemoveImage(m_pBackImgN);
  131. RenderEngine->RemoveImage(m_pBackImgH);
  132. RenderEngine->RemoveImage(m_pBackImgD);
  133. RenderEngine->RemoveImage(m_pBackImgF);
  134. m_pBackImgN = RenderEngine->GetImage(lpNormal);
  135. m_pBackImgH = RenderEngine->GetImage(lpHoven);
  136. m_pBackImgD = RenderEngine->GetImage(lpDown);
  137. m_pBackImgF = RenderEngine->GetImage(lpFocus);
  138. if( lprcNinePart != NULL )
  139. {
  140. if (m_pBackImgN != NULL)
  141. m_pBackImgN->SetNinePart(lprcNinePart);
  142. if (m_pBackImgH != NULL)
  143. m_pBackImgH->SetNinePart(lprcNinePart);
  144. if (m_pBackImgD != NULL)
  145. m_pBackImgD->SetNinePart(lprcNinePart);
  146. if (m_pBackImgF != NULL)
  147. m_pBackImgF->SetNinePart(lprcNinePart);
  148. }
  149. if ((lpNormal != NULL && NULL == m_pBackImgN) ||
  150. (lpHoven != NULL && NULL == m_pBackImgH) ||
  151. (lpDown != NULL && NULL == m_pBackImgD) ||
  152. (lpFocus != NULL && NULL == m_pBackImgF))
  153. return FALSE;
  154. else
  155. return TRUE;
  156. }
  157. //加载资源
  158. BOOL CSkinButton::SetCheckImage( LPCTSTR lpNormal, LPCTSTR lpHoven, LPCTSTR lpTickNormal, LPCTSTR lpTickHoven )
  159. {
  160. RenderEngine->RemoveImage(m_pCheckImgN);
  161. RenderEngine->RemoveImage(m_pCheckImgH);
  162. RenderEngine->RemoveImage(m_pCheckImgTickN);
  163. RenderEngine->RemoveImage(m_pCheckImgTickH);
  164. m_pCheckImgN = RenderEngine->GetImage(lpNormal);
  165. m_pCheckImgH = RenderEngine->GetImage(lpHoven);
  166. m_pCheckImgTickN = RenderEngine->GetImage(lpTickNormal);
  167. m_pCheckImgTickH = RenderEngine->GetImage(lpTickHoven);
  168. if (NULL == m_pCheckImgN || NULL == m_pCheckImgH
  169. || NULL == m_pCheckImgTickN || NULL == m_pCheckImgTickH)
  170. return FALSE;
  171. else
  172. return TRUE;
  173. }
  174. //加载资源
  175. BOOL CSkinButton::SetIconImage( LPCTSTR lpszFileName )
  176. {
  177. RenderEngine->RemoveImage(m_pIconImg);
  178. m_pIconImg = RenderEngine->GetImage(lpszFileName);
  179. if (NULL == m_pIconImg)
  180. return FALSE;
  181. else
  182. return TRUE;
  183. }
  184. //加载资源
  185. BOOL CSkinButton::SetMenuImage( LPCTSTR lpszFileName )
  186. {
  187. RenderEngine->RemoveImage(m_pArrowImg);
  188. m_pArrowImg = RenderEngine->GetImage(lpszFileName);
  189. if (NULL == m_pArrowImg)
  190. return FALSE;
  191. else
  192. return TRUE;
  193. }
  194. //设置大小
  195. void CSkinButton::SetSize( int nWidth,int nHeight )
  196. {
  197. SetWindowPos(NULL,0,0,nWidth,nHeight,SWP_NOMOVE);
  198. }
  199. //设置菜单
  200. void CSkinButton::SetMenu( HMENU hMenu )
  201. {
  202. m_hMenu = hMenu;
  203. }
  204. //销毁消息
  205. void CSkinButton::OnDestroy()
  206. {
  207. __super::OnDestroy();
  208. RenderEngine->RemoveImage(m_pBackImgN);
  209. RenderEngine->RemoveImage(m_pBackImgH);
  210. RenderEngine->RemoveImage(m_pBackImgD);
  211. RenderEngine->RemoveImage(m_pBackImgF);
  212. RenderEngine->RemoveImage(m_pCheckImgN);
  213. RenderEngine->RemoveImage(m_pCheckImgH);
  214. RenderEngine->RemoveImage(m_pCheckImgTickN);
  215. RenderEngine->RemoveImage(m_pCheckImgTickH);
  216. RenderEngine->RemoveImage(m_pArrowImg);
  217. RenderEngine->RemoveImage(m_pIconImg);
  218. m_bFocus = m_bPress = m_bHover = m_bMouseTracking = FALSE;
  219. m_nBtnType = en_PushButton;
  220. m_hMenu = NULL;
  221. m_dwTextAlign = 0;
  222. m_hBackDC = NULL;
  223. }
  224. //消息循环
  225. LRESULT CSkinButton::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  226. {
  227. //针对RadioButton组,选择其他Radio时,拦截Check消息
  228. if ( message == BM_SETCHECK )
  229. {
  230. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  231. }
  232. //鼠标移开按钮之后,会出发此消息,这里需要重新捕获,重绘按钮
  233. if ( message == BM_SETSTATE )
  234. {
  235. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  236. }
  237. return __super::DefWindowProc(message, wParam, lParam);
  238. }
  239. //绘制消息
  240. void CSkinButton::OnPaint()
  241. {
  242. CPaintDC dc(this);
  243. CRect rcClient;
  244. GetClientRect(&rcClient);
  245. CMemoryDC MemDC(&dc, rcClient);
  246. //绘制背景
  247. DrawParentWndBg(GetSafeHwnd(),MemDC->GetSafeHdc());
  248. switch (m_nBtnType)
  249. {
  250. case en_PushButton:
  251. DrawPushButton(&MemDC,rcClient);
  252. break;
  253. case en_CheckButton:
  254. case en_RadioButton:
  255. DrawCheckButton(&MemDC,rcClient);
  256. break;
  257. case en_IconButton:
  258. DrawIConButton(&MemDC,rcClient);
  259. break;
  260. case en_MenuButton:
  261. DrawMenuButton(MemDC,rcClient);
  262. break;
  263. }
  264. }
  265. //绘制按钮
  266. void CSkinButton::DrawPushButton(CDC* pDC,RECT &rcClient)
  267. {
  268. if (m_bPress) // 鼠标左键按下状态
  269. {
  270. if (m_pBackImgD != NULL && !m_pBackImgD->IsNull())
  271. m_pBackImgD->DrawImage(pDC, rcClient);
  272. }
  273. else if (m_bHover) // 鼠标悬停状态
  274. {
  275. if (m_pBackImgH != NULL && !m_pBackImgH->IsNull())
  276. m_pBackImgH->DrawImage(pDC, rcClient);
  277. }
  278. else if (m_bFocus) // 焦点状态
  279. {
  280. if (m_pBackImgF != NULL && !m_pBackImgF->IsNull())
  281. m_pBackImgF->DrawImage(pDC, rcClient);
  282. }
  283. else // 普通状态
  284. {
  285. if (m_pBackImgN != NULL && !m_pBackImgN->IsNull())
  286. m_pBackImgN->DrawImage(pDC, rcClient);
  287. }
  288. if (m_bPress)
  289. ::OffsetRect(&rcClient,1, 1);
  290. CString strText;
  291. GetWindowText(strText);
  292. BOOL bHasText = FALSE;
  293. if (strText.GetLength() > 0)
  294. bHasText = TRUE;
  295. BOOL bHasIcon = FALSE;
  296. if (m_pIconImg != NULL && !m_pIconImg->IsNull())
  297. bHasIcon = TRUE;
  298. if (bHasIcon && bHasText) // 带图标和文字
  299. {
  300. int cxIcon = m_pIconImg->GetWidth();
  301. int cyIcon = m_pIconImg->GetHeight();
  302. int nMode = pDC->SetBkMode(TRANSPARENT);
  303. pDC->SelectObject(GetCtrlFont());
  304. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  305. CRect rcText(0,0,0,0); // 计算文字宽高
  306. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_CALCRECT);
  307. int cx = cxIcon+3+rcText.Width();
  308. int cy = cyIcon;
  309. CRect rcCenter;
  310. CalcCenterRect(rcClient, cx, cy, rcCenter);
  311. CRect rcIcon(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
  312. m_pIconImg->DrawImage(pDC, rcIcon);
  313. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  314. rcText = CRect(rcIcon.right+3, rcClient.top, rcIcon.right+3+rcText.Width(), rcClient.bottom);
  315. pDC->DrawText(strText, &rcText, nFormat);
  316. pDC->SetBkMode(nMode);
  317. }
  318. else if (bHasIcon) // 仅图标
  319. {
  320. int cxIcon = m_pIconImg->GetWidth();
  321. int cyIcon = m_pIconImg->GetHeight();
  322. CRect rcIcon;
  323. CalcCenterRect(rcClient, cxIcon, cyIcon, rcIcon);
  324. m_pIconImg->DrawImage(pDC, rcIcon);
  325. }
  326. else if (bHasText) // 仅文字
  327. {
  328. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  329. int nMode = pDC->SetBkMode(TRANSPARENT);
  330. pDC->SelectObject(GetCtrlFont());
  331. if ( m_bHover ) pDC->SetTextColor(m_colSelectText);
  332. else pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  333. pDC->DrawText(strText, &rcClient, nFormat);
  334. pDC->SetBkMode(nMode);
  335. }
  336. }
  337. void CSkinButton::DrawCheckButton( CDC* pDC,RECT &rcClient )
  338. {
  339. int nWidth = 15, nHeight = 15;
  340. if (m_pCheckImgN != NULL && !m_pCheckImgN->IsNull())
  341. {
  342. nWidth = m_pCheckImgN->GetWidth();
  343. nHeight = m_pCheckImgN->GetHeight();
  344. }
  345. CRect rcCheck, rcText;
  346. rcCheck.left = rcClient.left;
  347. rcCheck.right = rcCheck.left + nWidth;
  348. rcCheck.top = ((rcClient.bottom-rcClient.top) - nHeight) / 2;
  349. rcCheck.bottom = rcCheck.top + nHeight;
  350. rcText = rcClient;
  351. rcText.left = rcCheck.right + 4;
  352. BOOL bChecked = ((GetCheck() == BST_CHECKED) ? TRUE : FALSE);
  353. if (m_bHover) // 鼠标悬停状态
  354. {
  355. if (bChecked)
  356. {
  357. if (m_pCheckImgTickH != NULL && !m_pCheckImgTickH->IsNull())
  358. m_pCheckImgTickH->DrawImage(pDC, rcCheck);
  359. }
  360. else
  361. {
  362. if (m_pCheckImgH != NULL && !m_pCheckImgH->IsNull())
  363. m_pCheckImgH->DrawImage(pDC, rcCheck);
  364. }
  365. }
  366. else // 普通状态
  367. {
  368. if (bChecked)
  369. {
  370. if (m_pCheckImgTickN != NULL && !m_pCheckImgTickN->IsNull())
  371. m_pCheckImgTickN->DrawImage(pDC, rcCheck);
  372. }
  373. else
  374. {
  375. if (m_pCheckImgN != NULL && !m_pCheckImgN->IsNull())
  376. m_pCheckImgN->DrawImage(pDC, rcCheck);
  377. }
  378. }
  379. CString strText;
  380. GetWindowText(strText);
  381. if (strText.GetLength() > 0)
  382. {
  383. UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  384. int nMode = pDC->SetBkMode(TRANSPARENT);
  385. pDC->SelectObject(GetCtrlFont());
  386. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  387. pDC->DrawText(strText, &rcText, nFormat);
  388. pDC->SetBkMode(nMode);
  389. }
  390. }
  391. void CSkinButton::DrawIConButton( CDC* pDC,RECT &rcClient )
  392. {
  393. if (m_bPress) // 鼠标左键按下状态
  394. {
  395. if (m_pBackImgD != NULL && !m_pBackImgD->IsNull())
  396. m_pBackImgD->Draw(pDC, rcClient);
  397. }
  398. else if (m_bHover) // 鼠标悬停状态
  399. {
  400. if (m_pBackImgH != NULL && !m_pBackImgH->IsNull())
  401. m_pBackImgH->Draw(pDC, rcClient);
  402. }
  403. if (m_bPress)
  404. ::OffsetRect(&rcClient,1, 1);
  405. CString strText;
  406. GetWindowText(strText);
  407. BOOL bHasText = FALSE;
  408. if (strText.GetLength() > 0)
  409. bHasText = TRUE;
  410. BOOL bHasIcon = FALSE;
  411. if (m_pIconImg != NULL && !m_pIconImg->IsNull())
  412. bHasIcon = TRUE;
  413. if (bHasIcon && bHasText) // 带图标和文字
  414. {
  415. int cxIcon = m_pIconImg->GetWidth();
  416. int cyIcon = m_pIconImg->GetHeight();
  417. int nMode = pDC->SetBkMode(TRANSPARENT);
  418. pDC->SelectObject(GetCtrlFont());
  419. CRect rcText(0,0,0,0); // 计算文字宽高
  420. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_CALCRECT);
  421. int cx = cxIcon+3+rcText.Width();
  422. int cy = cyIcon;
  423. CRect rcCenter;
  424. CalcCenterRect(rcClient, cx, cy, rcCenter);
  425. CRect rcIcon(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
  426. m_pIconImg->DrawImage(pDC, rcIcon);
  427. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  428. rcText = CRect(rcIcon.right+3, rcClient.top, rcIcon.right+3+rcText.Width(), rcClient.bottom);
  429. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  430. pDC->DrawText(strText, &rcText, nFormat);
  431. pDC->SetBkMode(nMode);
  432. }
  433. else if (bHasIcon) // 仅图标
  434. {
  435. int cxIcon = m_pIconImg->GetWidth();
  436. int cyIcon = m_pIconImg->GetHeight();
  437. CRect rcIcon;
  438. CalcCenterRect(rcClient, cxIcon, cyIcon, rcIcon);
  439. m_pIconImg->DrawImage(pDC, rcIcon);
  440. }
  441. else if (bHasText) // 仅文字
  442. {
  443. CRect rcText(rcClient);
  444. rcText.left += 2;
  445. rcText.right -= 2;
  446. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  447. int nMode = pDC->SetBkMode(TRANSPARENT);
  448. pDC->SelectObject(GetCtrlFont());
  449. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  450. pDC->DrawText(strText, &rcText, nFormat);
  451. pDC->SetBkMode(nMode);
  452. }
  453. }
  454. void CSkinButton::DrawMenuButton( CDC* pDC,RECT &rcClient )
  455. {
  456. if (m_bPress) // 鼠标左键按下状态
  457. {
  458. if (m_pBackImgD != NULL && !m_pBackImgD->IsNull())
  459. m_pBackImgD->DrawImage(pDC, rcClient);
  460. }
  461. else if (m_bHover) // 鼠标悬停状态
  462. {
  463. if (m_pBackImgH != NULL && !m_pBackImgH->IsNull())
  464. m_pBackImgH->DrawImage(pDC, rcClient);
  465. }
  466. CRect rcArrow(0, 0, 0, 0);
  467. if (m_pArrowImg != NULL && !m_pArrowImg->IsNull())
  468. {
  469. int cx = m_pArrowImg->GetWidth();
  470. int cy = m_pArrowImg->GetHeight();
  471. int x = rcClient.right - 3 - cx;
  472. int y = (rcClient.bottom-rcClient.top - cy + 1) / 2;
  473. rcArrow = CRect(x, y, x+cx, y+cy);
  474. m_pArrowImg->DrawImage(pDC, rcArrow);
  475. }
  476. if (m_pIconImg != NULL && !m_pIconImg->IsNull())
  477. {
  478. int cx = m_pIconImg->GetWidth();
  479. int cy = m_pIconImg->GetHeight();
  480. int nRight;
  481. if (rcArrow.left > 0)
  482. nRight = rcArrow.left;
  483. else
  484. nRight = rcClient.right;
  485. CRect rcIcon(rcClient.left, rcClient.top, nRight, rcClient.bottom);
  486. CalcCenterRect(rcIcon, cx, cy, rcIcon);
  487. if (m_bPress)
  488. rcIcon.OffsetRect(1, 1);
  489. m_pIconImg->DrawImage(pDC, rcIcon);
  490. }
  491. }
  492. void CSkinButton::SetPushed( bool bPush )
  493. {
  494. m_bPushed = bPush;
  495. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  496. }
  497. BOOL CSkinButton::CreateControl(CWnd* pParentWnd)
  498. {
  499. if( !Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),pParentWnd,0) )
  500. return FALSE;
  501. m_pOwnWnd = this;
  502. return TRUE;
  503. }
  504. void CSkinButton::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  505. {
  506. ISkinControl::SetAttribute(pstrName,pstrValue);
  507. if( _tcscmp(pstrName, _T("type")) == 0 )
  508. {
  509. if( _tcscmp(pstrValue, _T("push")) == 0 ) SetButtonType(en_PushButton);
  510. else if( _tcscmp(pstrValue, _T("check")) == 0 ) SetButtonType(en_CheckButton);
  511. else if( _tcscmp(pstrValue, _T("radio")) == 0 ) SetButtonType(en_RadioButton);
  512. else if( _tcscmp(pstrValue, _T("icon")) == 0 ) SetButtonType(en_IconButton);
  513. else if( _tcscmp(pstrValue, _T("menu")) == 0 ) SetButtonType(en_MenuButton);
  514. }
  515. //push
  516. else if( _tcscmp(pstrName, _T("normalimage")) == 0 )
  517. {
  518. RenderEngine->RemoveImage(m_pBackImgN);
  519. m_pBackImgN = RenderEngine->GetImage(pstrValue);
  520. }
  521. else if( _tcscmp(pstrName, _T("hotimage")) == 0 )
  522. {
  523. RenderEngine->RemoveImage(m_pBackImgH);
  524. m_pBackImgH = RenderEngine->GetImage(pstrValue);
  525. }
  526. else if( _tcscmp(pstrName, _T("pushedimage")) == 0 )
  527. {
  528. RenderEngine->RemoveImage(m_pBackImgD);
  529. m_pBackImgD = RenderEngine->GetImage(pstrValue);
  530. }
  531. else if( _tcscmp(pstrName, _T("focusedimage")) == 0 )
  532. {
  533. RenderEngine->RemoveImage(m_pBackImgF);
  534. m_pBackImgF = RenderEngine->GetImage(pstrValue);
  535. }
  536. //check
  537. else if( _tcscmp(pstrName, _T("checkimgnormal")) == 0 )
  538. {
  539. RenderEngine->RemoveImage(m_pCheckImgN);
  540. m_pCheckImgN = RenderEngine->GetImage(pstrValue);
  541. }
  542. else if( _tcscmp(pstrName, _T("checkimghot")) == 0 )
  543. {
  544. RenderEngine->RemoveImage(m_pCheckImgH);
  545. m_pCheckImgH = RenderEngine->GetImage(pstrValue);
  546. }
  547. else if( _tcscmp(pstrName, _T("checkimgtickn")) == 0 )
  548. {
  549. RenderEngine->RemoveImage(m_pCheckImgTickN);
  550. m_pCheckImgTickN = RenderEngine->GetImage(pstrValue);
  551. }
  552. else if( _tcscmp(pstrName, _T("checkimgtickh")) == 0 )
  553. {
  554. RenderEngine->RemoveImage(m_pCheckImgTickH);
  555. m_pCheckImgTickH = RenderEngine->GetImage(pstrValue);
  556. }
  557. else if( _tcscmp(pstrName, _T("iconimage")) == 0 )
  558. {
  559. RenderEngine->RemoveImage(m_pIconImg);
  560. m_pIconImg = RenderEngine->GetImage(pstrValue);
  561. }
  562. else if( _tcscmp(pstrName, _T("menuimage")) == 0 )
  563. {
  564. RenderEngine->RemoveImage(m_pArrowImg);
  565. m_pArrowImg = RenderEngine->GetImage(pstrValue);
  566. }
  567. else if( _tcscmp(pstrName, _T("size")) == 0 )
  568. {
  569. LPTSTR pstr = NULL;
  570. int cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  571. int cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  572. SetSize(cx,cy);
  573. }
  574. else if( _tcscmp(pstrName, _T("checked")) == 0 )
  575. {
  576. SetCheck((_tcscmp(pstrValue, _T("true")) == 0) ? BST_CHECKED : BST_UNCHECKED);
  577. }
  578. else if( _tcscmp(pstrName, _T("url")) == 0 )
  579. {
  580. m_lpszUrl = pstrValue;
  581. }
  582. }