GuiButton.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:25k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  * (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software; so you are free to use it any of your *
  9.  * applications(Freeware, Shareware, Commercial), but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements :(Add your name) *
  19.  * -Francisco Campos *
  20.  * *
  21.  ****************************************************************************/
  22. #include "stdafx.h"
  23. #include "GuiButton.h"
  24. #include "GuiDrawLayer.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. #define   OVER     0
  31. #define   FOCUS    1
  32. #define   NORMAL   2
  33. #define   DISABLED 3
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CGuiButton
  36. CGuiButton::CGuiButton()
  37. {
  38. m_iAling       = ALING_LEFT; 
  39. m_iStyle       = STYLE_SEMIFLAT;
  40. m_lpMsg        = _T("");
  41. m_iSelected    = 0;
  42. m_viewImage    = FALSE;
  43. m_ViewText     = FALSE;
  44. m_iTypeButton  = TYPE_NORMAL; // Normal by default
  45. m_iMenuActivo  = FALSE;
  46. m_clrface      = GuiDrawLayer::GetRGBColorFace();
  47. m_ReposWindow  = FALSE;
  48. m_bIsDark      = FALSE;
  49. }
  50. CGuiButton::~CGuiButton()
  51. {
  52. for (int i = 0; i < 3; i++)
  53. {
  54. if (m_hicon[i] != NULL)
  55. DestroyIcon(m_hicon[i]);
  56. }
  57. }
  58. BEGIN_MESSAGE_MAP(CGuiButton, CButton)
  59. //{{AFX_MSG_MAP(CGuiButton)
  60. ON_WM_CREATE()
  61. ON_WM_ERASEBKGND()
  62. ON_WM_MOUSEMOVE()
  63. ON_WM_LBUTTONUP()
  64. ON_WM_LBUTTONDOWN()
  65. ON_WM_TIMER()
  66. ON_WM_SYSCOLORCHANGE()
  67. //}}AFX_MSG_MAP
  68. END_MESSAGE_MAP()
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CGuiButton message handlers
  71. //*****************************************************************************
  72. void CGuiButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  73. {
  74. // TODO: Add your code to draw the specified item
  75. ICONINFO bm;
  76. CSize sizeImag;
  77. CBrush cb;
  78. CSize SizeCad(0, 0);
  79. CSize pt;
  80. CPoint m_point;
  81. int m_Index = 0;
  82. ZeroMemory(&bm, sizeof(ICONINFO));
  83. CDC* pDC= CDC::FromHandle(lpDrawItemStruct->hDC);
  84. CRect m_rect = &lpDrawItemStruct->rcItem;
  85. UINT m_State = lpDrawItemStruct->itemState;
  86. //---------------------------------------------------------------------
  87. // Se obtiene la cadena del boton si tiene
  88. //---------------------------------------------------------------------
  89. CString m_caption;
  90. GetWindowText(m_caption);
  91. //---------------------------------------------------------------------
  92. // Se dibuja el fondo segun sea el estilo
  93. // si es TooBarXP
  94. // si no si es un boton Normal
  95. //---------------------------------------------------------------------
  96. if (m_State & ODS_SELECTED) // el boton esta presionado
  97. {
  98. if (STYLEXP == m_iStyle) 
  99. cb.CreateSolidBrush(m_clrface);
  100. }
  101. else if (m_iSelected == 1) // el mouse esta sobre el boton
  102. {
  103. if (STYLEXP == m_iStyle) 
  104. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorBTNHigh());
  105. }
  106. else // el boton esta normal
  107. {
  108. if (STYLEXP == m_iStyle) 
  109. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorBTNHigh());
  110. }
  111. if (STYLEXP == m_iStyle) 
  112. {
  113. CRect rcTemp = m_rect;
  114. rcTemp.DeflateRect(2, 2);
  115. rcTemp.right -= 2;
  116. pDC->FillRect(&rcTemp, &cb);
  117. }
  118. else
  119. {
  120. cb.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());
  121. pDC->FillRect(&m_rect, &cb);
  122. }
  123. //********************************************************************
  124. int nMode = pDC->SetBkMode(TRANSPARENT);
  125. if (m_caption.GetLength() > 0)
  126. SizeCad = pDC->GetTextExtent(m_caption);
  127. //-------------------------------------------------------------------
  128. // si el boton esta seleccionado, se mueve el rectangulo para dar la 
  129. // impresion de presion
  130. //-------------------------------------------------------------------
  131. if (m_State & ODS_SELECTED)
  132. m_rect.bottom += 2;
  133. //-------------------------------------------------------------------
  134. // El boton tiene una imagen
  135. //-------------------------------------------------------------------
  136. if (m_viewImage == TRUE)
  137. {
  138. if (m_State & ODS_SELECTED)
  139. m_Index = 2;
  140. else if (m_iSelected== 1)
  141. m_Index = 1;
  142. else
  143. m_Index = 0;
  144. if (m_hicon[m_Index]!= NULL) 
  145. {
  146. ::GetIconInfo(m_hicon[m_Index], &bm);
  147. sizeImag = CSize((BYTE)(bm.xHotspot * 2), (BYTE)(bm.yHotspot * 2));
  148. ::DeleteObject(bm.hbmMask);
  149. ::DeleteObject(bm.hbmColor);
  150. }
  151. else 
  152. {
  153. m_Index = -1;
  154. }
  155. }
  156. //---------------------------------------------------------------------
  157. // el boton tiene una imagen pero no texto
  158. //---------------------------------------------------------------------
  159. if (m_viewImage == TRUE && m_ViewText== FALSE)
  160. {
  161. if (m_Index != -1)
  162. {
  163. int calculodify;
  164. m_rect.right = m_rect.left + sizeImag.cx + 5;
  165. calculodify = m_rect.Height()- (sizeImag.cy);
  166. calculodify /= 2;
  167. m_point = CPoint(2, calculodify);
  168. if (m_bIsDark && m_iSelected == 1 && !(m_State & ODS_DISABLED))
  169. {
  170. CPoint p(m_point.x + 1, m_point.y + 1);
  171. pDC->DrawState(p, sizeImag, m_hicon[m_Index], DSS_MONO, CBrush(GuiDrawLayer::GetRGBColorShadow()));
  172. m_point.x -= 1;
  173. m_point.y -= 1;
  174. }
  175. pDC->DrawState(m_point, sizeImag, m_hicon[m_Index], (m_State == ODS_DISABLED ? DSS_DISABLED:DSS_NORMAL), CBrush(GuiDrawLayer::GetRGBColorFace()));
  176. }
  177. }
  178. //-----------------------------------------------------------------------
  179. // El boton tiene una imagen y ademas texto
  180. //-----------------------------------------------------------------------
  181. else if (m_viewImage == TRUE && m_ViewText == TRUE)
  182. {
  183. int calculodifx = 0;
  184. int calculodify = 0;
  185. if (m_Index != -1)
  186. {
  187. CRect rectletra;
  188. calculodifx = m_rect.Width()- (sizeImag.cx);
  189. calculodifx /= 2;
  190. calculodify = m_rect.Height()- (sizeImag.cy);
  191. calculodify /= 2;
  192. if (m_iAling ==ALING_RIGTH)
  193. {
  194. m_point = CPoint(4, calculodify);
  195. if (m_bIsDark && m_iSelected == 1 && !(m_State & ODS_DISABLED))
  196. {
  197. CPoint p(m_point.x + 1, m_point.y + 1);
  198. pDC->DrawState(p, sizeImag, m_hicon[m_Index], DSS_MONO, CBrush(GuiDrawLayer::GetRGBColorShadow()));
  199. m_point.x -= 1;
  200. m_point.y -= 1;
  201. }
  202. pDC->DrawState(m_point, sizeImag, m_hicon[m_Index],
  203. (m_State == ODS_DISABLED ? DSS_DISABLED:DSS_NORMAL), (CBrush*)NULL);
  204. rectletra = m_rect;
  205. rectletra.left += sizeImag.cx + 8;
  206. pt = CSize(rectletra.top, rectletra.left);
  207. if (m_State & ODS_DISABLED)
  208. pDC->DrawState(pt, SizeCad, m_caption, DSS_DISABLED, TRUE, 0, (CBrush*)NULL);
  209. else
  210. pDC->DrawText(m_caption, rectletra, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
  211. }
  212. else
  213. {
  214. rectletra = m_rect;
  215. rectletra.left += 4;
  216. if (m_bIsDark && m_iSelected == 1 && !(m_State & ODS_DISABLED))
  217. {
  218. CPoint p = CPoint(m_point.x + 1, m_point.y + 1);
  219. pDC->DrawState(p, sizeImag, m_hicon[m_Index], DSS_MONO, CBrush(GuiDrawLayer::GetRGBColorShadow()));
  220. m_point.x -= 1;
  221. m_point.y -= 1;
  222. }
  223. pt = CSize(rectletra.top, rectletra.left);
  224. if (m_State & ODS_DISABLED)
  225. pDC->DrawState(pt, SizeCad, m_caption, DSS_DISABLED, TRUE, 0, (CBrush*)NULL);
  226. else
  227. pDC->DrawText(m_caption, rectletra, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
  228. m_point = CPoint((rectletra.right - sizeImag.cx) - 4, calculodify);
  229. pDC->DrawState(m_point, sizeImag, m_hicon[m_Index], (m_State == ODS_DISABLED ? DSS_DISABLED:DSS_NORMAL), (CBrush*)NULL);
  230. }
  231. }
  232. }
  233. //-----------------------------------------------------------------------
  234. // Si el texto es visible
  235. //-----------------------------------------------------------------------
  236. else if (m_ViewText == TRUE)
  237. {
  238. CSize sz = pDC->GetTextExtent(m_caption);
  239. int ntempcx = m_rect.Width() - sz.cx;
  240. int ntempcy = m_rect.Height() - sz.cy;
  241. pt = CSize(m_rect.left+ (ntempcx/2), m_rect.top+ (ntempcy/2));
  242. if (m_State & ODS_DISABLED)
  243. pDC->DrawState(pt, SizeCad, m_caption, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
  244. else
  245. pDC->DrawText(m_caption, m_rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  246. }
  247. m_rect = &lpDrawItemStruct->rcItem;
  248. //-----------------------------------------------------------------
  249. // se inicia el dibujo de bordes 
  250. // 1) si es semiflat
  251. // 2) si es Flat
  252. // 3) si es estilo ToolBarXp  
  253. // 4) si es estilo 3d
  254. //-----------------------------------------------------------------
  255. if (m_State & ODS_SELECTED)
  256. {
  257. if (STYLE_SEMIFLAT== m_iStyle)
  258. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorShadow(), GuiDrawLayer::GetRGBColorBTNHigh());
  259. else if (STYLE_FLAT == m_iStyle)
  260. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorShadow(), GuiDrawLayer::GetRGBColorBTNHigh());
  261. else if (STYLEXP == m_iStyle)
  262. DrawBottonXP(pDC, m_rect, NORMAL);
  263. else // si es 3d
  264. {
  265. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorShadow(), GuiDrawLayer::GetRGBColorBTNHigh());
  266. CPen cp(PS_SOLID, 1, GuiDrawLayer::GetRGBColorShadow());
  267. CPen* cpa = pDC->SelectObject(&cp);
  268. pDC->MoveTo(m_rect.left + 1, m_rect.top + 1);
  269. pDC->LineTo(m_rect.right - 1, m_rect.top + 1);
  270. pDC->SelectObject(cpa);
  271. }
  272. }
  273. //-----------------------------------------------------------------------
  274. // el boton esta presionado
  275. //-----------------------------------------------------------------------
  276. else if (m_iSelected == 1)  // el mouse esta sobre el boton
  277. {
  278. if (STYLE_SEMIFLAT== m_iStyle)
  279. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow());
  280. else if (STYLE_FLAT == m_iStyle)
  281. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow());
  282. else if (STYLEXP == m_iStyle)
  283. DrawBottonXP(pDC, m_rect, OVER);
  284. else // si es 3d
  285. {
  286. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow());
  287. CPen cp(PS_SOLID, 1, GuiDrawLayer::GetRGBColorShadow());
  288. CPen* cpa = pDC->SelectObject(&cp);
  289. pDC->MoveTo(m_rect.left + 1, m_rect.bottom - 2);
  290. pDC->LineTo(m_rect.right - 2, m_rect.bottom - 2);
  291. pDC->MoveTo(m_rect.right - 2, m_rect.top + 1);
  292. pDC->LineTo(m_rect.right - 2, m_rect.bottom - 2);
  293. pDC->SelectObject(cpa);
  294. }
  295. }
  296. else
  297. {
  298. //-----------------------------------------------------------------
  299. // el boton esta en estado normal, es decir el mouse ni lo presiona
  300. // ni esta sobre el.
  301. //-----------------------------------------------------------------
  302. if (STYLE_3D == m_iStyle)
  303. {
  304. pDC->Draw3dRect(m_rect, GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorShadow());
  305. CPen cp(PS_SOLID, 1, GuiDrawLayer::GetRGBColorShadow());
  306. CPen* cpa = pDC->SelectObject(&cp);
  307. pDC->MoveTo(m_rect.left + 1, m_rect.bottom - 2);
  308. pDC->LineTo(m_rect.right - 2, m_rect.bottom - 2);
  309. pDC->MoveTo(m_rect.right - 2, m_rect.top + 1);
  310. pDC->LineTo(m_rect.right - 2, m_rect.bottom - 2);
  311. pDC->SelectObject(cpa);
  312. }
  313. else if (STYLEXP == m_iStyle)
  314. {
  315. if (m_State & ODS_DISABLED)
  316. {
  317. DrawBottonXP(pDC, m_rect, DISABLED);
  318. }
  319. else
  320. {
  321. if (m_State & ODS_FOCUS)
  322. DrawBottonXP(pDC, m_rect, FOCUS);
  323. else
  324. DrawBottonXP(pDC, m_rect, NORMAL);
  325. }
  326. }
  327. else
  328. {
  329. pDC->Draw3dRect(m_rect, m_clrface, m_clrface);
  330. }
  331. }
  332. if ((m_State & ODS_FOCUS) && (STYLEXP != m_iStyle))
  333. {
  334. m_rect.DeflateRect(2, 2);
  335. pDC->DrawFocusRect(m_rect);
  336. }
  337. pDC->SetBkMode(nMode);
  338. }
  339. void CGuiButton::AutoSizeButton(BOOL m_bAutoAjust)
  340. {
  341. m_ReposWindow = m_bAutoAjust;
  342. Invalidate();
  343. UpdateWindow();
  344. }
  345. void CGuiButton::OnSysColorChange()
  346. {
  347. CButton::OnSysColorChange();
  348. m_clrface = GuiDrawLayer::GetRGBColorXP();
  349. }
  350. //*************************************************************************
  351. void CGuiButton::DrawBottonXP(CDC* pDC, CRect rc, int Estado)
  352. {
  353. COLORREF clrPress  = ::GetSysColor(COLOR_HIGHLIGHT);
  354. COLORREF clrShadow = ::GetSysColor(COLOR_BTNSHADOW);
  355. //*****************************************************
  356. // dibujamos los bordes del boton
  357. CPen cp(PS_SOLID,       1, clrPress);
  358. CPen cpface(PS_SOLID,   1, m_clrface);
  359. CPen cpsxp(PS_SOLID,    1, GuiDrawLayer::GetRGBColorXP());
  360. CPen cpOver(PS_SOLID,   1, RGB(255, 193, 111));
  361. CPen cpShadow(PS_SOLID, 1, clrShadow); 
  362. CPen* pOld = NULL;
  363. if (Estado != DISABLED)
  364. pOld = pDC->SelectObject(&cp);
  365. else
  366. pOld = pDC->SelectObject(&cpShadow);
  367. rc.right  -= 4;
  368. rc.bottom -= 2;
  369. // la linea superior
  370. pDC->MoveTo(rc.left + 2, rc.top);
  371. pDC->LineTo(rc.right - 1, rc.top);
  372. // linea izquierda
  373. pDC->MoveTo(rc.left, rc.top + 2);
  374. pDC->LineTo(rc.left, rc.bottom - 1);
  375. // linea derecha
  376. pDC->MoveTo(rc.right, rc.top + 2);
  377. pDC->LineTo(rc.right, rc.bottom - 1);
  378. // linea inferior
  379. pDC->MoveTo(rc.left + 2, rc.bottom);
  380. pDC->LineTo(rc.right - 1, rc.bottom);
  381. if (Estado != DISABLED)
  382. {
  383. // se dibuja algunas lineas para dar forma 3d
  384. // linea inferior
  385. pDC->SelectObject(&cpface);
  386. pDC->MoveTo(rc.left + 2, rc.bottom - 1);
  387. pDC->LineTo(rc.right - 1, rc.bottom - 1);
  388. pDC->MoveTo(rc.right - 1, rc.top + 2);
  389. pDC->LineTo(rc.right - 1, rc.bottom - 1);
  390. pDC->SelectObject(&cpsxp);
  391. pDC->MoveTo(rc.left + 2, rc.bottom - 2);
  392. pDC->LineTo(rc.right - 1, rc.bottom - 2);
  393. pDC->MoveTo(rc.right - 2, rc.top + 2);
  394. pDC->LineTo(rc.right - 2, rc.bottom - 1);
  395. // fin bordes del boton
  396. //***************************************************************
  397. CRect rcBordes = rc;
  398. rcBordes.left += 1;
  399. rcBordes.top += 1;
  400. switch (Estado)
  401. {
  402. case OVER:
  403. pDC->Draw3dRect(rcBordes, RGB(255, 202, 130), RGB(255, 193, 111));
  404. rcBordes.DeflateRect(1, 1);
  405. pDC->Draw3dRect(rcBordes, RGB(255, 202, 130), RGB(255, 193, 111));
  406. break;
  407. case FOCUS:
  408. pDC->Draw3dRect(rcBordes, GuiDrawLayer::GetRGBFondoXP(), GuiDrawLayer::GetRGBFondoXP());
  409. rcBordes.DeflateRect(1, 1);
  410. pDC->Draw3dRect(rcBordes, GuiDrawLayer::GetRGBFondoXP(), GuiDrawLayer::GetRGBFondoXP());
  411. break;
  412. }
  413. //****************************************************************
  414. // pintar los vertices
  415. // left,top
  416. pDC->SetPixel(rc.left + 1, rc.top, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  417. pDC->SetPixel(rc.left, rc.top + 1, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  418. pDC->SetPixel(rc.left + 1, rc.top + 1, Estado != DISABLED ? clrPress:clrShadow);
  419. // pintar los vertices
  420. // left,bottom
  421. pDC->SetPixel(rc.left + 1, rc.bottom, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  422. pDC->SetPixel(rc.left, rc.bottom - 1, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  423. pDC->SetPixel(rc.left + 1, rc.bottom - 1, Estado != DISABLED ? clrPress:clrShadow);
  424. // right,top
  425. pDC->SetPixel(rc.right - 1, rc.top, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  426. pDC->SetPixel(rc.right, rc.top + 1, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  427. pDC->SetPixel(rc.right - 1, rc.top + 1, Estado != DISABLED ? clrPress:clrShadow);
  428. // right,bottom
  429. pDC->SetPixel(rc.right - 1, rc.bottom, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  430. pDC->SetPixel(rc.right, rc.bottom - 1, Estado != DISABLED ? GuiDrawLayer::GetRGBFondoXP():clrShadow);
  431. pDC->SetPixel(rc.right - 1, rc.bottom - 1, Estado != DISABLED ? clrPress:clrShadow);
  432. }
  433. pDC->SelectObject(pOld);
  434. }
  435. //*****************************************************************************
  436. void CGuiButton::SetColor(COLORREF m_clrFaces)
  437. {
  438. m_clrface = m_clrFaces;
  439. }
  440. //*****************************************************************************
  441. void CGuiButton::ShowImage(BOOL m_viewimage)
  442. {
  443. m_viewImage = m_viewimage;
  444. CalLayout();
  445. }
  446. //*****************************************************************************
  447. void CGuiButton::ShowText(BOOL m_viewText)
  448. {
  449. m_ViewText = m_viewText;
  450. CalLayout();
  451. }
  452. //*****************************************************************************
  453. void CGuiButton::CalLayout()
  454. {
  455. CString m_str;
  456. CRect m_rect;
  457. CSize sizeImag = CSize(0, 0);
  458. int m_High = 0;
  459. if (GetSafeHwnd() == NULL)
  460. return;
  461. GetWindowText(m_str);
  462. CClientDC dc(this);
  463. ICONINFO bm;
  464. ZeroMemory(&bm, sizeof(ICONINFO));
  465. GetClientRect(&m_rect);
  466. CSize SizeCad = CSize(0, 0);
  467. if (m_viewImage == TRUE)
  468. {
  469. if (m_hicon[0]!= NULL)
  470. {
  471. ::GetIconInfo(m_hicon[0], &bm);
  472. sizeImag = CSize((BYTE)(bm.xHotspot * 2), (BYTE)(bm.yHotspot * 2));
  473. ::DeleteObject(bm.hbmMask);
  474. ::DeleteObject(bm.hbmColor);
  475. }
  476. }
  477. if (m_ViewText == TRUE)
  478. {
  479. if (m_str.GetLength() > 0)
  480. {
  481. SizeCad = dc.GetTextExtent(m_str);
  482. SizeCad.cx -= 7;
  483. }
  484. }
  485. m_High = max(sizeImag.cy, SizeCad.cy);
  486. m_High = max(m_High, m_rect.Height());
  487. m_szButton= CSize(SizeCad.cx + sizeImag.cx + 7, m_High);
  488. if (m_ReposWindow == TRUE)
  489. {
  490. SetWindowPos(NULL, 0, 0, SizeCad.cx + sizeImag.cx + 10, m_High,
  491. SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
  492. }
  493. }
  494. //*****************************************************************************
  495. CSize CGuiButton::GetSizeButton()
  496. {
  497. m_ReposWindow = FALSE;
  498. CalLayout();
  499. m_ReposWindow = TRUE;
  500. return m_szButton;
  501. }
  502. //*****************************************************************************
  503. void CGuiButton::SetImage(HICON hIcon)
  504. {
  505. m_hicon[0] = hIcon;
  506. m_hicon[1] = hIcon;
  507. m_hicon[2] = hIcon;
  508. ShowImage(TRUE);
  509. }
  510. BOOL CGuiButton::SetImage(UINT uBitmapNormal, UINT uBitmapFocus, UINT uBitmapPush)
  511. {
  512. BOOL result = FALSE;
  513. HINSTANCE hirc = AfxFindResourceHandle(MAKEINTRESOURCE(uBitmapNormal), RT_BITMAP);
  514. if (uBitmapNormal != -1) 
  515. {
  516. m_hicon[0] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), 
  517. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
  518. result = TRUE;
  519. }
  520. else
  521. {
  522. result = FALSE;
  523. }
  524. if (uBitmapFocus != -1)
  525. {
  526. m_hicon[1] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapFocus), 
  527. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
  528. if (m_hicon[1] == NULL && m_hicon[0] != NULL)
  529. m_hicon[1] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), 
  530. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
  531. }
  532. else
  533. {
  534. if (m_hicon[0] != NULL)
  535. m_hicon[1] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), 
  536. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
  537. }
  538. if (uBitmapPush != -1)
  539. {
  540. m_hicon[2] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapFocus), 
  541. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
  542. if (m_hicon[2] == NULL && m_hicon[0]!= NULL)
  543. m_hicon[2] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), 
  544. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);
  545. }
  546. else
  547. {
  548. if (m_hicon[0] != NULL)
  549. m_hicon[2] = (HICON)::LoadImage(hirc, MAKEINTRESOURCE(uBitmapNormal), 
  550. IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
  551. }
  552. CalLayout();
  553. return result;
  554. }
  555. //*****************************************************************************
  556. void CGuiButton::SetToolTip(LPCTSTR lpMsg)
  557. {
  558. CRect rc;
  559. m_lpMsg = lpMsg;
  560. if (GetSafeHwnd()== NULL)
  561. return;
  562. if (m_lpMsg != NULL)
  563. {
  564. if (m_ToolTipCtrl.GetSafeHwnd() == NULL) 
  565. {
  566. m_ToolTipCtrl.Create(this, TTS_ALWAYSTIP);
  567. m_ToolTipCtrl.Activate(TRUE);
  568. m_ToolTipCtrl.AddTool(this, lpMsg);
  569. }
  570. else
  571. {
  572. m_ToolTipCtrl.UpdateTipText(lpMsg, this);
  573. }
  574. }
  575. else
  576. {
  577. if (m_ToolTipCtrl.GetSafeHwnd() == NULL) 
  578. {
  579. m_ToolTipCtrl.Create(this, TTS_ALWAYSTIP);
  580. m_ToolTipCtrl.AddTool(this, lpMsg);
  581. }
  582. else
  583. {
  584. m_ToolTipCtrl.UpdateTipText(lpMsg, this);
  585. }
  586. m_ToolTipCtrl.Activate(FALSE);
  587. }
  588. }
  589. //*****************************************************************************
  590. void CGuiButton::SetCaption(LPCTSTR lpMsg)
  591. {
  592. SetWindowText(lpMsg);
  593. m_ViewText = TRUE;
  594. CalLayout();
  595. Invalidate();
  596. }
  597. //*****************************************************************************
  598. void CGuiButton::SetTypeButton(TypeButton m_TypeButton)
  599. {
  600. m_iTypeButton = m_TypeButton;
  601. if (m_iTypeButton == TYPE_ARROW)
  602. {
  603. m_iStyleArrow = ARROW_RIGHT;
  604. m_iAling      = ALING_LEFT;
  605. m_iTypeButton = TYPE_ARROW;
  606. m_iStyle      = STYLE_3D;
  607. m_lpMsg       = _T("");
  608. m_iSelected   = 0;
  609. m_viewImage   = TRUE;
  610. m_ViewText    = TRUE;
  611. SetAlingArrow(ARROW_RIGHT);
  612. }
  613. }
  614. //*****************************************************************************
  615. void CGuiButton::SetAlingArrow(StyleArrow m_AlingArron)
  616. {
  617. if (m_iTypeButton == TYPE_ARROW)
  618. {
  619. m_iStyleArrow = m_AlingArron;
  620. if (m_iStyleArrow == ARROW_RIGHT)
  621. {
  622. if (m_hicon[0]== NULL)
  623. {
  624. m_hicon[0] = GuiDrawLayer::LoadIconLib(IDI_GUI_ARROWRIGHT);
  625. }
  626. else
  627. {
  628. m_hicon[0] = GuiDrawLayer::LoadIconLib(IDI_GUI_ARROWRIGHT);
  629. m_hicon[1] = GuiDrawLayer::LoadIconLib(IDI_GUI_ARROWRIGHT);
  630. m_hicon[2] = NULL;
  631. }
  632. }
  633. else
  634. {
  635. if (m_hicon[0] == NULL)
  636. {
  637. m_hicon[0] = GuiDrawLayer::LoadIconLib(IDI_GUI_ARROWDOWN);
  638. }
  639. else
  640. {
  641. m_hicon[0] = GuiDrawLayer::LoadIconLib(IDI_GUI_ARROWDOWN);
  642. m_hicon[1] = GuiDrawLayer::LoadIconLib(IDI_GUI_ARROWDOWN);
  643. m_hicon[2] = NULL;
  644. }
  645. }
  646. }
  647. }
  648. //*****************************************************************************
  649. void CGuiButton::SetStyleBorder(Style m_Style)
  650. {
  651. m_iStyle = m_Style;
  652. }
  653. //*****************************************************************************
  654. void CGuiButton::SetAlingMsg(AlingMsg m_AlingMsg)
  655. {
  656. if (m_iTypeButton == TYPE_NORMAL)
  657. m_iAling = m_AlingMsg;
  658. }
  659. //*****************************************************************************
  660. int CGuiButton::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  661. {
  662. if (CButton::OnCreate(lpCreateStruct) == -1)
  663. return -1;
  664. return 0;
  665. }
  666. //*****************************************************************************
  667. BOOL CGuiButton::OnEraseBkgnd(CDC* pDC) 
  668. {
  669. return TRUE;
  670. }
  671. //*****************************************************************************
  672. void CGuiButton::OnMouseMove(UINT nFlags, CPoint point) 
  673. {
  674. // TODO: Add your message handler code here and/or call default
  675. CRect m_rect;
  676. GetClientRect(&m_rect);
  677. if (m_rect.PtInRect(point))
  678. {
  679. if (m_iSelected == 1)
  680. return;
  681. m_iSelected =1;
  682. Invalidate();
  683. UpdateWindow();
  684. SetTimer(1, 10, NULL);
  685. }
  686. CButton::OnMouseMove(nFlags, point);
  687. }
  688. //*****************************************************************************
  689. void CGuiButton::PreSubclassWindow() 
  690. {
  691. ModifyStyle(0, BS_OWNERDRAW);
  692. CButton::PreSubclassWindow();
  693. }
  694. //*****************************************************************************
  695. void CGuiButton::OnLButtonUp(UINT nFlags, CPoint point) 
  696. {
  697. CButton::OnLButtonUp(nFlags, point);
  698. if (m_iSelected == 1)
  699. m_iSelected = 0;
  700. Invalidate();
  701. UpdateWindow();
  702. }
  703. //*****************************************************************************
  704. void CGuiButton::OnLButtonDown(UINT nFlags, CPoint point) 
  705. {
  706. CButton::OnLButtonDown(nFlags, point);
  707. Invalidate();
  708. UpdateWindow();
  709. if (m_iTypeButton == TYPE_ARROW)
  710. {
  711. SetFocus();
  712. ShowMenu();
  713. }
  714. }
  715. void CGuiButton::SetPopupMenu(CMenu* pMenu)
  716. {
  717. m_pMenu = pMenu;
  718. }
  719. //*****************************************************************************
  720. void CGuiButton::ShowMenu()
  721. {
  722. CRect rcW;
  723. int x, y;
  724. GetWindowRect(&rcW);
  725. if (m_iStyleArrow == ARROW_RIGHT)
  726. {
  727. x = rcW.right + 1;
  728. y = rcW.top;
  729. }
  730. else
  731. {
  732. x = rcW.left;
  733. y = rcW.bottom;
  734. }
  735. if (m_pMenu->GetSafeHmenu() != NULL && m_iMenuActivo == FALSE)
  736. {
  737. m_iMenuActivo  = TRUE;
  738. int m_iResMenu = m_pMenu->GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, 
  739. x, y,  GetParent(), NULL);
  740. if (m_iResMenu != 0)
  741. {
  742. CWnd* pParent= GetParent();
  743. pParent->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM) m_hWnd);
  744. }
  745. m_iMenuActivo = FALSE;
  746. }
  747. else
  748. {
  749. return;
  750. }
  751. ReleaseCapture();
  752. }
  753. //*****************************************************************************
  754. BOOL CGuiButton::PreTranslateMessage(MSG* pMsg) 
  755. {
  756. if (pMsg->message == WM_MOUSEMOVE)
  757. {
  758. if (m_ToolTipCtrl.GetSafeHwnd())
  759. m_ToolTipCtrl.RelayEvent(pMsg);
  760. }
  761. return CButton::PreTranslateMessage(pMsg);
  762. }
  763. //*****************************************************************************
  764. void CGuiButton::OnTimer(UINT nIDEvent) 
  765. {
  766. // TODO: Add your message handler code here and/or call default
  767. if (nIDEvent == 1)
  768. {
  769. CRect m_rect;
  770. CPoint pt(GetMessagePos());
  771. ScreenToClient(&pt);
  772. GetClientRect(m_rect);
  773. if (!m_rect.PtInRect(pt))
  774. {
  775. m_iSelected = 0;
  776. Invalidate();
  777. UpdateWindow();
  778. KillTimer(1);
  779. }
  780. }
  781. CButton::OnTimer(nIDEvent);
  782. }