SkinButton.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. // ButtonEx.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SkinButton.h"
  5. #include "MemoryDC.h"
  6. // CSkinButton
  7. IMPLEMENT_DYNAMIC(CSkinButton, CButton)
  8. CSkinButton::CSkinButton()
  9. {
  10. m_dwTextAlign = 0;
  11. m_hParentDC = NULL;
  12. m_bTransparent = FALSE;
  13. //m_colDefText = RGB(128,128,128);
  14. m_colNormalText = RGB(0,0,0);
  15. m_colDisableText = RGB(128,128,128);
  16. m_colReadOnlyText = RGB(0,0,0);
  17. m_colSelectText = RGB(255,255,255);
  18. //m_colFrameNormal = RGB(0,0,0);
  19. //m_colBack=RGB(255,255,255);
  20. m_Font = RenderEngine->GetDeaultFont();
  21. m_pBackImgN = m_pBackImgH = m_pBackImgD = m_pBackImgF = NULL;
  22. m_pCheckImgN = m_pCheckImgH = m_pCheckImgTickN = m_pCheckImgTickH = NULL;
  23. m_pArrowImg = m_pIconImg = NULL;
  24. m_bFocus = m_bPress = m_bHover = m_bMouseTracking = FALSE;
  25. m_nBtnType = en_PushButton;
  26. m_hMenu = NULL;
  27. m_hBackDC = NULL;
  28. }
  29. CSkinButton::~CSkinButton()
  30. {
  31. m_bTransparent = FALSE;
  32. }
  33. BEGIN_MESSAGE_MAP(CSkinButton, CButton)
  34. ON_WM_MOUSEMOVE()
  35. ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
  36. ON_WM_ERASEBKGND()
  37. ON_WM_DESTROY()
  38. ON_WM_LBUTTONDOWN()
  39. ON_WM_LBUTTONUP()
  40. ON_WM_SETFOCUS()
  41. ON_WM_KILLFOCUS()
  42. ON_WM_PAINT()
  43. ON_WM_LBUTTONDBLCLK()
  44. END_MESSAGE_MAP()
  45. // CSkinButton 消息处理程序
  46. void CSkinButton::SetButtonType( UI_BUTTON_TYPE type )
  47. {
  48. m_nBtnType = type;
  49. }
  50. //鼠标移动消息
  51. void CSkinButton::OnMouseMove(UINT nFlags, CPoint point)
  52. {
  53. if (!m_bMouseTracking)
  54. {
  55. TRACKMOUSEEVENT tme = { 0 };
  56. tme.cbSize = sizeof(tme);
  57. tme.dwFlags = TME_LEAVE;
  58. tme.hwndTrack = GetSafeHwnd();
  59. _TrackMouseEvent(&tme);
  60. m_bMouseTracking = TRUE;
  61. m_bHover = TRUE;
  62. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  63. }
  64. __super::OnMouseMove(nFlags, point);
  65. }
  66. //鼠标离开消息
  67. LRESULT CSkinButton::OnMouseLeave(WPARAM wparam, LPARAM lparam)
  68. {
  69. m_bMouseTracking = FALSE;
  70. m_bHover = FALSE;
  71. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  72. return 0;
  73. }
  74. //鼠标按下消息
  75. void CSkinButton::OnLButtonDown(UINT nFlags, CPoint point)
  76. {
  77. m_bPress = TRUE;
  78. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  79. __super::OnLButtonDown(nFlags, point);
  80. }
  81. //鼠标抬起消息
  82. void CSkinButton::OnLButtonUp(UINT nFlags, CPoint point)
  83. {
  84. if (m_bPress)
  85. {
  86. m_bPress = FALSE;
  87. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  88. if (m_nBtnType == en_MenuButton)
  89. {
  90. if (::IsMenu(m_hMenu))
  91. {
  92. CRect rc;
  93. GetClientRect(&rc);
  94. ClientToScreen(&rc);
  95. ::TrackPopupMenuEx(m_hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
  96. rc.left, rc.bottom, ::GetParent(GetSafeHwnd()), NULL);
  97. }
  98. }
  99. }
  100. __super::OnLButtonUp(nFlags, point);
  101. }
  102. //鼠标双击消息
  103. void CSkinButton::OnLButtonDblClk(UINT nFlags, CPoint point)
  104. {
  105. m_bPress = TRUE;
  106. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  107. __super::OnLButtonDown(nFlags, point);
  108. }
  109. //获取焦点消息
  110. void CSkinButton::OnSetFocus(CWnd* pOldWnd)
  111. {
  112. __super::OnSetFocus(pOldWnd);
  113. m_bFocus = TRUE;
  114. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  115. }
  116. //失去焦点消息
  117. void CSkinButton::OnKillFocus(CWnd* pNewWnd)
  118. {
  119. __super::OnKillFocus(pNewWnd);
  120. m_bFocus = FALSE;
  121. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  122. }
  123. //重画消息
  124. BOOL CSkinButton::OnEraseBkgnd(CDC* pDC)
  125. {
  126. return TRUE;
  127. }
  128. //设置资源
  129. BOOL CSkinButton::SetBackImage( LPCTSTR lpNormal, LPCTSTR lpHoven, LPCTSTR lpDown, LPCTSTR lpFocus,CONST LPRECT lprcNinePart/*=NULL*/ )
  130. {
  131. RenderEngine->RemoveImage(m_pBackImgN);
  132. RenderEngine->RemoveImage(m_pBackImgH);
  133. RenderEngine->RemoveImage(m_pBackImgD);
  134. RenderEngine->RemoveImage(m_pBackImgF);
  135. m_pBackImgN = RenderEngine->GetImage(lpNormal);
  136. m_pBackImgH = RenderEngine->GetImage(lpHoven);
  137. m_pBackImgD = RenderEngine->GetImage(lpDown);
  138. m_pBackImgF = RenderEngine->GetImage(lpFocus);
  139. if( lprcNinePart != NULL )
  140. {
  141. if (m_pBackImgN != NULL)
  142. m_pBackImgN->SetNinePart(lprcNinePart);
  143. if (m_pBackImgH != NULL)
  144. m_pBackImgH->SetNinePart(lprcNinePart);
  145. if (m_pBackImgD != NULL)
  146. m_pBackImgD->SetNinePart(lprcNinePart);
  147. if (m_pBackImgF != NULL)
  148. m_pBackImgF->SetNinePart(lprcNinePart);
  149. }
  150. if ((lpNormal != NULL && NULL == m_pBackImgN) ||
  151. (lpHoven != NULL && NULL == m_pBackImgH) ||
  152. (lpDown != NULL && NULL == m_pBackImgD) ||
  153. (lpFocus != NULL && NULL == m_pBackImgF))
  154. return FALSE;
  155. else
  156. return TRUE;
  157. }
  158. //加载资源
  159. BOOL CSkinButton::SetCheckImage( LPCTSTR lpNormal, LPCTSTR lpHoven, LPCTSTR lpTickNormal, LPCTSTR lpTickHoven )
  160. {
  161. RenderEngine->RemoveImage(m_pCheckImgN);
  162. RenderEngine->RemoveImage(m_pCheckImgH);
  163. RenderEngine->RemoveImage(m_pCheckImgTickN);
  164. RenderEngine->RemoveImage(m_pCheckImgTickH);
  165. m_pCheckImgN = RenderEngine->GetImage(lpNormal);
  166. m_pCheckImgH = RenderEngine->GetImage(lpHoven);
  167. m_pCheckImgTickN = RenderEngine->GetImage(lpTickNormal);
  168. m_pCheckImgTickH = RenderEngine->GetImage(lpTickHoven);
  169. if (NULL == m_pCheckImgN || NULL == m_pCheckImgH || 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. void CSkinButton::CalcCenterRect( RECT& rcDest, int cx, int cy, RECT& rcCenter )
  205. {
  206. int x = ((rcDest.right-rcDest.left) - cx + 1) / 2;
  207. int y = ((rcDest.bottom-rcDest.top) - cy + 1) / 2;
  208. rcCenter.left = rcDest.left+x;
  209. rcCenter.top = rcDest.top+y;
  210. rcCenter.right = rcCenter.left+cx;
  211. rcCenter.bottom = rcCenter.top+cy;
  212. }
  213. void CSkinButton::DrawParentWndBg(HWND hWnd, HDC hDC )
  214. {
  215. if( hWnd == NULL ) return;
  216. if ( !m_bTransparent ) return;
  217. HWND hParentWnd = ::GetParent(hWnd);
  218. CRect rcWindow;
  219. ::GetWindowRect(hWnd,&rcWindow);
  220. ::ScreenToClient(hParentWnd, (LPPOINT)&rcWindow);
  221. ::ScreenToClient(hParentWnd, ((LPPOINT)&rcWindow)+1);
  222. ::BitBlt(hDC, 0, 0, rcWindow.Width(), rcWindow.Height(), m_hParentDC, rcWindow.left, rcWindow.top, SRCCOPY);
  223. }
  224. //销毁消息
  225. void CSkinButton::OnDestroy()
  226. {
  227. __super::OnDestroy();
  228. RenderEngine->RemoveImage(m_pBackImgN);
  229. RenderEngine->RemoveImage(m_pBackImgH);
  230. RenderEngine->RemoveImage(m_pBackImgD);
  231. RenderEngine->RemoveImage(m_pBackImgF);
  232. RenderEngine->RemoveImage(m_pCheckImgN);
  233. RenderEngine->RemoveImage(m_pCheckImgH);
  234. RenderEngine->RemoveImage(m_pCheckImgTickN);
  235. RenderEngine->RemoveImage(m_pCheckImgTickH);
  236. RenderEngine->RemoveImage(m_pArrowImg);
  237. RenderEngine->RemoveImage(m_pIconImg);
  238. m_bFocus = m_bPress = m_bHover = m_bMouseTracking = FALSE;
  239. m_nBtnType = en_PushButton;
  240. m_hMenu = NULL;
  241. m_dwTextAlign = 0;
  242. m_hBackDC = NULL;
  243. }
  244. //消息循环
  245. LRESULT CSkinButton::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  246. {
  247. //针对RadioButton组,选择其他Radio时,拦截Check消息
  248. if ( message == BM_SETCHECK )
  249. {
  250. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  251. }
  252. //鼠标移开按钮之后,会出发此消息,这里需要重新捕获,重绘按钮
  253. if ( message == BM_SETSTATE )
  254. {
  255. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  256. }
  257. return __super::DefWindowProc(message, wParam, lParam);
  258. }
  259. //绘制消息
  260. void CSkinButton::OnPaint()
  261. {
  262. CPaintDC dc(this);
  263. CRect rcClient;
  264. GetClientRect(&rcClient);
  265. CMemoryDC MemDC(&dc, rcClient);
  266. //绘制背景
  267. DrawParentWndBg(GetSafeHwnd(),MemDC->GetSafeHdc());
  268. switch (m_nBtnType)
  269. {
  270. case en_PushButton:
  271. DrawPushButton(&MemDC,rcClient);
  272. break;
  273. case en_CheckButton:
  274. case en_RadioButton:
  275. DrawCheckButton(&MemDC,rcClient);
  276. break;
  277. case en_IconButton:
  278. DrawIConButton(&MemDC,rcClient);
  279. break;
  280. case en_MenuButton:
  281. DrawMenuButton(MemDC,rcClient);
  282. break;
  283. }
  284. }
  285. //绘制按钮
  286. void CSkinButton::DrawPushButton(CDC* pDC,RECT &rcClient)
  287. {
  288. if (m_bPress) // 鼠标左键按下状态
  289. {
  290. if (m_pBackImgD != NULL && !m_pBackImgD->IsNull())
  291. m_pBackImgD->DrawImage(pDC, rcClient);
  292. }
  293. else if (m_bHover) // 鼠标悬停状态
  294. {
  295. if (m_pBackImgH != NULL && !m_pBackImgH->IsNull())
  296. m_pBackImgH->DrawImage(pDC, rcClient);
  297. }
  298. else if (m_bFocus) // 焦点状态
  299. {
  300. if (m_pBackImgF != NULL && !m_pBackImgF->IsNull())
  301. m_pBackImgF->DrawImage(pDC, rcClient);
  302. }
  303. else // 普通状态
  304. {
  305. if (m_pBackImgN != NULL && !m_pBackImgN->IsNull())
  306. m_pBackImgN->DrawImage(pDC, rcClient);
  307. }
  308. if (m_bPress)
  309. ::OffsetRect(&rcClient,1, 1);
  310. CString strText;
  311. GetWindowText(strText);
  312. BOOL bHasText = FALSE;
  313. if (strText.GetLength() > 0)
  314. bHasText = TRUE;
  315. BOOL bHasIcon = FALSE;
  316. if (m_pIconImg != NULL && !m_pIconImg->IsNull())
  317. bHasIcon = TRUE;
  318. if (bHasIcon && bHasText) // 带图标和文字
  319. {
  320. int cxIcon = m_pIconImg->GetWidth();
  321. int cyIcon = m_pIconImg->GetHeight();
  322. int nMode = pDC->SetBkMode(TRANSPARENT);
  323. pDC->SelectObject(GetCtrlFont());
  324. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  325. CRect rcText(0,0,0,0); // 计算文字宽高
  326. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_CALCRECT);
  327. int cx = cxIcon+3+rcText.Width();
  328. int cy = cyIcon;
  329. CRect rcCenter;
  330. CalcCenterRect(rcClient, cx, cy, rcCenter);
  331. CRect rcIcon(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
  332. m_pIconImg->DrawImage(pDC, rcIcon);
  333. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  334. rcText = CRect(rcIcon.right+3, rcClient.top, rcIcon.right+3+rcText.Width(), rcClient.bottom);
  335. pDC->DrawText(strText, &rcText, nFormat);
  336. pDC->SetBkMode(nMode);
  337. }
  338. else if (bHasIcon) // 仅图标
  339. {
  340. int cxIcon = m_pIconImg->GetWidth();
  341. int cyIcon = m_pIconImg->GetHeight();
  342. CRect rcIcon;
  343. CalcCenterRect(rcClient, cxIcon, cyIcon, rcIcon);
  344. m_pIconImg->DrawImage(pDC, rcIcon);
  345. }
  346. else if (bHasText) // 仅文字
  347. {
  348. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  349. int nMode = pDC->SetBkMode(TRANSPARENT);
  350. pDC->SelectObject(GetCtrlFont());
  351. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  352. pDC->DrawText(strText, &rcClient, nFormat);
  353. pDC->SetBkMode(nMode);
  354. }
  355. }
  356. void CSkinButton::DrawCheckButton( CDC* pDC,RECT &rcClient )
  357. {
  358. int nWidth = 15, nHeight = 15;
  359. if (m_pCheckImgN != NULL && !m_pCheckImgN->IsNull())
  360. {
  361. nWidth = m_pCheckImgN->GetWidth();
  362. nHeight = m_pCheckImgN->GetHeight();
  363. }
  364. CRect rcCheck, rcText;
  365. rcCheck.left = rcClient.left;
  366. rcCheck.right = rcCheck.left + nWidth;
  367. rcCheck.top = ((rcClient.bottom-rcClient.top) - nHeight) / 2;
  368. rcCheck.bottom = rcCheck.top + nHeight;
  369. rcText = rcClient;
  370. rcText.left = rcCheck.right + 4;
  371. BOOL bChecked = ((GetCheck() == BST_CHECKED) ? TRUE : FALSE);
  372. if (m_bHover) // 鼠标悬停状态
  373. {
  374. if (bChecked)
  375. {
  376. if (m_pCheckImgTickH != NULL && !m_pCheckImgTickH->IsNull())
  377. m_pCheckImgTickH->DrawImage(pDC, rcCheck);
  378. }
  379. else
  380. {
  381. if (m_pCheckImgH != NULL && !m_pCheckImgH->IsNull())
  382. m_pCheckImgH->DrawImage(pDC, rcCheck);
  383. }
  384. }
  385. else // 普通状态
  386. {
  387. if (bChecked)
  388. {
  389. if (m_pCheckImgTickN != NULL && !m_pCheckImgTickN->IsNull())
  390. m_pCheckImgTickN->DrawImage(pDC, rcCheck);
  391. }
  392. else
  393. {
  394. if (m_pCheckImgN != NULL && !m_pCheckImgN->IsNull())
  395. m_pCheckImgN->DrawImage(pDC, rcCheck);
  396. }
  397. }
  398. CString strText;
  399. GetWindowText(strText);
  400. if (strText.GetLength() > 0)
  401. {
  402. UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  403. int nMode = pDC->SetBkMode(TRANSPARENT);
  404. pDC->SelectObject(GetCtrlFont());
  405. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  406. pDC->DrawText(strText, &rcText, nFormat);
  407. pDC->SetBkMode(nMode);
  408. }
  409. }
  410. void CSkinButton::DrawIConButton( CDC* pDC,RECT &rcClient )
  411. {
  412. if (m_bPress) // 鼠标左键按下状态
  413. {
  414. if (m_pBackImgD != NULL && !m_pBackImgD->IsNull())
  415. m_pBackImgD->Draw(pDC, rcClient);
  416. }
  417. else if (m_bHover) // 鼠标悬停状态
  418. {
  419. if (m_pBackImgH != NULL && !m_pBackImgH->IsNull())
  420. m_pBackImgH->Draw(pDC, rcClient);
  421. }
  422. if (m_bPress)
  423. ::OffsetRect(&rcClient,1, 1);
  424. CString strText;
  425. GetWindowText(strText);
  426. BOOL bHasText = FALSE;
  427. if (strText.GetLength() > 0)
  428. bHasText = TRUE;
  429. BOOL bHasIcon = FALSE;
  430. if (m_pIconImg != NULL && !m_pIconImg->IsNull())
  431. bHasIcon = TRUE;
  432. if (bHasIcon && bHasText) // 带图标和文字
  433. {
  434. int cxIcon = m_pIconImg->GetWidth();
  435. int cyIcon = m_pIconImg->GetHeight();
  436. int nMode = pDC->SetBkMode(TRANSPARENT);
  437. pDC->SelectObject(GetCtrlFont());
  438. CRect rcText(0,0,0,0); // 计算文字宽高
  439. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_CALCRECT);
  440. int cx = cxIcon+3+rcText.Width();
  441. int cy = cyIcon;
  442. CRect rcCenter;
  443. CalcCenterRect(rcClient, cx, cy, rcCenter);
  444. CRect rcIcon(rcCenter.left, rcCenter.top, rcCenter.left+cxIcon, rcCenter.bottom);
  445. m_pIconImg->DrawImage(pDC, rcIcon);
  446. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  447. rcText = CRect(rcIcon.right+3, rcClient.top, rcIcon.right+3+rcText.Width(), rcClient.bottom);
  448. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  449. pDC->DrawText(strText, &rcText, nFormat);
  450. pDC->SetBkMode(nMode);
  451. }
  452. else if (bHasIcon) // 仅图标
  453. {
  454. int cxIcon = m_pIconImg->GetWidth();
  455. int cyIcon = m_pIconImg->GetHeight();
  456. CRect rcIcon;
  457. CalcCenterRect(rcClient, cxIcon, cyIcon, rcIcon);
  458. m_pIconImg->DrawImage(pDC, rcIcon);
  459. }
  460. else if (bHasText) // 仅文字
  461. {
  462. CRect rcText(rcClient);
  463. rcText.left += 2;
  464. rcText.right -= 2;
  465. UINT nFormat = m_dwTextAlign ? m_dwTextAlign : DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  466. int nMode = pDC->SetBkMode(TRANSPARENT);
  467. pDC->SelectObject(GetCtrlFont());
  468. pDC->SetTextColor(IsWindowEnabled()?m_colNormalText:m_colDisableText);
  469. pDC->DrawText(strText, &rcText, nFormat);
  470. pDC->SetBkMode(nMode);
  471. }
  472. }
  473. void CSkinButton::DrawMenuButton( CDC* pDC,RECT &rcClient )
  474. {
  475. if (m_bPress) // 鼠标左键按下状态
  476. {
  477. if (m_pBackImgD != NULL && !m_pBackImgD->IsNull())
  478. m_pBackImgD->DrawImage(pDC, rcClient);
  479. }
  480. else if (m_bHover) // 鼠标悬停状态
  481. {
  482. if (m_pBackImgH != NULL && !m_pBackImgH->IsNull())
  483. m_pBackImgH->DrawImage(pDC, rcClient);
  484. }
  485. CRect rcArrow(0, 0, 0, 0);
  486. if (m_pArrowImg != NULL && !m_pArrowImg->IsNull())
  487. {
  488. int cx = m_pArrowImg->GetWidth();
  489. int cy = m_pArrowImg->GetHeight();
  490. int x = rcClient.right - 3 - cx;
  491. int y = (rcClient.bottom-rcClient.top - cy + 1) / 2;
  492. rcArrow = CRect(x, y, x+cx, y+cy);
  493. m_pArrowImg->DrawImage(pDC, rcArrow);
  494. }
  495. if (m_pIconImg != NULL && !m_pIconImg->IsNull())
  496. {
  497. int cx = m_pIconImg->GetWidth();
  498. int cy = m_pIconImg->GetHeight();
  499. int nRight;
  500. if (rcArrow.left > 0)
  501. nRight = rcArrow.left;
  502. else
  503. nRight = rcClient.right;
  504. CRect rcIcon(rcClient.left, rcClient.top, nRight, rcClient.bottom);
  505. CalcCenterRect(rcIcon, cx, cy, rcIcon);
  506. if (m_bPress)
  507. rcIcon.OffsetRect(1, 1);
  508. m_pIconImg->DrawImage(pDC, rcIcon);
  509. }
  510. }