BtnST.cpp
上传用户:mcdz888
上传日期:2022-08-05
资源大小:118k
文件大小:22k
源码类别:

绘图程序

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "BtnST.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CButtonST
  10. CButtonST::CButtonST()
  11. {
  12. m_MouseOnButton = FALSE;
  13. m_hIconIn = NULL;
  14. m_hIconOut = NULL;
  15. m_cxIcon = 0;
  16. m_cyIcon = 0;
  17. m_hCursor = NULL;
  18.   
  19. // Default type is "flat" button
  20. m_bIsFlat = TRUE; 
  21.   
  22. // By default draw border in "flat" button 
  23. m_bDrawBorder = TRUE; 
  24.   
  25. // By default icon is aligned horizontally
  26. m_nAlign = ST_ALIGN_HORIZ; 
  27.   
  28. // By default show the text button
  29. m_bShowText = TRUE; 
  30.   
  31. // By default, for "flat" button, don't draw the focus rect
  32. m_bDrawFlatFocus = FALSE;
  33. // By default the button is not the default button
  34. m_bIsDefault = FALSE;
  35. SetDefaultInactiveBgColor();
  36. SetDefaultInactiveFgColor();
  37. SetDefaultActiveBgColor();
  38. SetDefaultActiveFgColor();
  39. // No tooltip created
  40. m_ToolTip.m_hWnd = NULL;
  41. // Do not draw as a transparent button
  42. m_bDrawTransparent = FALSE;
  43. m_pbmpOldBk = NULL;
  44. } // End of CButtonST
  45. CButtonST::~CButtonST()
  46. {
  47. // Restore old bitmap (if any)
  48. if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
  49. {
  50. m_dcBk.SelectObject(m_pbmpOldBk);
  51. }
  52. // Destroy the icons (if any)
  53. // Note: the following two lines MUST be here! even if
  54. // BoundChecker says they are unnecessary!
  55. if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn);
  56. if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);
  57. // Destroy the cursor (if any)
  58. if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);
  59. } // End of ~CButtonST
  60. BEGIN_MESSAGE_MAP(CButtonST, CButton)
  61.     //{{AFX_MSG_MAP(CButtonST)
  62. ON_WM_CAPTURECHANGED()
  63. ON_WM_SETCURSOR()
  64. ON_WM_KILLFOCUS()
  65. ON_WM_MOUSEMOVE()
  66. ON_WM_CTLCOLOR_REFLECT()
  67. ON_WM_SYSCOLORCHANGE()
  68. //}}AFX_MSG_MAP
  69. END_MESSAGE_MAP()
  70. void CButtonST::SetIcon(int nIconInId, int nIconOutId)
  71. {
  72. HICON hIconIn;
  73. HICON hIconOut;
  74. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId), RT_GROUP_ICON);
  75. // Set icon when the mouse is IN the button
  76. hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
  77.    // Set icon when the mouse is OUT the button
  78. hIconOut = (nIconOutId == NULL) ? NULL : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
  79. SetIcon(hIconIn, hIconOut);
  80. /*
  81. // Note: the following two lines MUST be here! even if
  82. // BoundChecker says they are unnecessary!
  83. if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn);
  84. if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);
  85. // Set icon when the mouse is IN the button
  86. m_hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
  87.    // Set icon when the mouse is OUT the button
  88. m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
  89.   
  90. ICONINFO ii;
  91. // Get icon dimension
  92. ZeroMemory(&ii, sizeof(ICONINFO));
  93. ::GetIconInfo(m_hIconIn, &ii);
  94. m_cxIcon = (BYTE)(ii.xHotspot * 2);
  95. m_cyIcon = (BYTE)(ii.yHotspot * 2);
  96.     ::DeleteObject(ii.hbmMask);
  97. ::DeleteObject(ii.hbmColor);
  98. RedrawWindow();
  99. */
  100. } // End of SetIcon
  101. void CButtonST::SetIcon(HICON hIconIn, HICON hIconOut)
  102. {
  103. // Note: the following two lines MUST be here! even if
  104. // BoundChecker says they are unnecessary!
  105. if (m_hIconIn != NULL) ::DestroyIcon(m_hIconIn);
  106. if (m_hIconOut != NULL) ::DestroyIcon(m_hIconOut);
  107. // Set icon when the mouse is IN the button
  108. m_hIconIn = hIconIn;
  109. // Set icon when the mouse is OUT the button
  110. m_hIconOut = (hIconOut == NULL) ? m_hIconIn : hIconOut;
  111.   
  112. ICONINFO ii;
  113. // Get icon dimension
  114. ZeroMemory(&ii, sizeof(ICONINFO));
  115. ::GetIconInfo(m_hIconIn, &ii);
  116. m_cxIcon = (BYTE)(ii.xHotspot * 2);
  117. m_cyIcon = (BYTE)(ii.yHotspot * 2);
  118.     ::DeleteObject(ii.hbmMask);
  119. ::DeleteObject(ii.hbmColor);
  120. RedrawWindow();
  121. } // End of SetIcon
  122. BOOL CButtonST::SetBtnCursor(int nCursorId)
  123. {
  124. HINSTANCE hInstResource;
  125. // Destroy any previous cursor
  126. if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);
  127. m_hCursor = NULL;
  128. // If we want a cursor
  129. if (nCursorId != -1)
  130. {
  131. hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),
  132. RT_GROUP_CURSOR);
  133. // Load icon resource
  134. m_hCursor = (HCURSOR)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0);
  135. // If something wrong then return FALSE
  136. if (m_hCursor == NULL) return FALSE;
  137. }
  138. return TRUE;
  139. } // End of SetBtnCursor
  140. void CButtonST::SetFlat(BOOL bState)
  141. {
  142.   m_bIsFlat = bState;
  143.   Invalidate();
  144. } // End of SetFlat
  145. BOOL CButtonST::GetFlat()
  146. {
  147.   return m_bIsFlat;
  148. } // End of GetFlat
  149. void CButtonST::SetAlign(int nAlign)
  150. {
  151.   switch (nAlign)
  152.   {    
  153.     case ST_ALIGN_HORIZ:
  154.          m_nAlign = ST_ALIGN_HORIZ;
  155.          break;
  156.     case ST_ALIGN_HORIZ_RIGHT:
  157.          m_nAlign = ST_ALIGN_HORIZ_RIGHT;
  158.          break;
  159.     case ST_ALIGN_VERT:
  160.          m_nAlign = ST_ALIGN_VERT;
  161.          break;
  162.   }
  163.   Invalidate();
  164. } // End of SetAlign
  165. int CButtonST::GetAlign()
  166. {
  167.   return m_nAlign;
  168. } // End of GetAlign
  169. void CButtonST::DrawBorder(BOOL bEnable)
  170. {
  171.   m_bDrawBorder = bEnable;
  172. } // End of DrawBorder
  173. const char* CButtonST::GetVersionC()
  174. {
  175.   return "2.6";
  176. } // End of GetVersionC
  177. const short CButtonST::GetVersionI()
  178. {
  179.   return 26; // Divide by 10 to get actual version
  180. } // End of GetVersionI
  181. void CButtonST::SetShowText(BOOL bShow)
  182. {
  183.   m_bShowText = bShow;
  184.   Invalidate();
  185. } // End of SetShowText
  186. BOOL CButtonST::GetShowText()
  187. {
  188.   return m_bShowText;
  189. } // End of GetShowText
  190. void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
  191. {
  192. CWnd* pWnd;  // Finestra attiva
  193. CWnd* pParent; // Finestra che contiene il bottone
  194. CButton::OnMouseMove(nFlags, point);
  195. // If the mouse enter the button with the left button pressed
  196. // then do nothing
  197. if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;
  198. // If our button is not flat then do nothing
  199. if (m_bIsFlat == FALSE) return;
  200. pWnd = GetActiveWindow();
  201. pParent = GetOwner();
  202. if ((GetCapture() != this) && 
  203. (
  204. #ifndef ST_LIKEIE
  205. pWnd != NULL && 
  206. #endif
  207. pParent != NULL)) 
  208. {
  209. m_MouseOnButton = TRUE;
  210. //SetFocus(); // Thanks Ralph!
  211. SetCapture();
  212. Invalidate();
  213. }
  214. else
  215. {
  216. /*
  217. CRect rc;
  218. GetClientRect(&rc);
  219. if (!rc.PtInRect(point))
  220. {
  221. */
  222. POINT p2 = point;
  223. ClientToScreen(&p2);
  224. CWnd* wndUnderMouse = WindowFromPoint(p2);
  225. // if (wndUnderMouse != this)
  226. if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd)
  227. {
  228. // Redraw only if mouse goes out
  229. if (m_MouseOnButton == TRUE)
  230. {
  231. m_MouseOnButton = FALSE;
  232. Invalidate();
  233. }
  234. // If user is NOT pressing left button then release capture!
  235. if (!(nFlags & MK_LBUTTON)) ReleaseCapture();
  236. }
  237. }
  238. } // End of OnMouseMove
  239. void CButtonST::OnKillFocus(CWnd * pNewWnd)
  240. {
  241.   CButton::OnKillFocus(pNewWnd);
  242.   // If our button is not flat then do nothing
  243.   if (m_bIsFlat == FALSE) return;
  244.   if (m_MouseOnButton == TRUE)
  245.   {
  246.     m_MouseOnButton = FALSE;
  247.     Invalidate();
  248.   }
  249. } // End of OnKillFocus
  250. void CButtonST::OnCaptureChanged(CWnd *pWnd) 
  251. {
  252. if (m_MouseOnButton == TRUE)
  253. {
  254. ReleaseCapture();
  255. Invalidate();
  256. }
  257. // Call base message handler
  258. CButton::OnCaptureChanged(pWnd);
  259. } // End of OnCaptureChanged
  260. void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  261. {
  262. #ifdef ST_USE_MEMDC
  263.   CDC  *pdrawDC = CDC::FromHandle(lpDIS->hDC);
  264.   CMemDC memDC(pdrawDC);
  265.   CDC  *pDC = &memDC;
  266. #else
  267.   CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  268. #endif
  269.   CPen *pOldPen;
  270.   BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
  271.   BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
  272.   BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
  273.   CRect itemRect = lpDIS->rcItem;
  274.   pDC->SetBkMode(TRANSPARENT);
  275.   if (m_bIsFlat == FALSE)
  276.   {
  277.     if (bIsFocused || (GetDefault() == TRUE))
  278.     {
  279.       CBrush br(RGB(0,0,0));  
  280.       pDC->FrameRect(&itemRect, &br);
  281.       itemRect.DeflateRect(1, 1);
  282.     }
  283.   }
  284.   // Prepare draw... paint button's area with background color
  285.   COLORREF bgColor;
  286.   if ((m_MouseOnButton == TRUE) || (bIsPressed))
  287.     bgColor = GetActiveBgColor();
  288.   else
  289.     bgColor = GetInactiveBgColor();
  290. CBrush br(bgColor);
  291. // Draw transparent?
  292. if (m_bDrawTransparent == TRUE)
  293. {
  294. PaintBk(pDC);
  295. }
  296. else
  297. {
  298. pDC->FillRect(&itemRect, &br);
  299. }
  300. // Disegno lo sfondo del bottone
  301. //CBrush br(GetSysColor(COLOR_BTNFACE));  
  302. //pDC->FillRect(&itemRect, &br);
  303.   // Draw pressed button
  304.   if (bIsPressed)
  305.   {
  306.     if (m_bIsFlat == TRUE)
  307.     {
  308.       if (m_bDrawBorder == TRUE)
  309.       {
  310.   pDC->Draw3dRect(itemRect, ::GetSysColor(COLOR_BTNSHADOW), ::GetSysColor(COLOR_BTNHILIGHT));
  311. /*
  312.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco
  313.         CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro
  314.         // Disegno i bordi a sinistra e in alto
  315.         // Dark gray line
  316.         pOldPen = pDC->SelectObject(&penBtnShadow);
  317.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  318.         pDC->LineTo(itemRect.left, itemRect.top);
  319.         pDC->LineTo(itemRect.right, itemRect.top);
  320.         // Disegno i bordi a destra e in basso
  321.         // White line
  322.         pDC->SelectObject(penBtnHiLight);
  323.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  324.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  325.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  326.         //
  327.         pDC->SelectObject(pOldPen);
  328. */
  329.       }
  330.     }
  331.     else    
  332.     {
  333.       CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
  334.       pDC->FrameRect(&itemRect, &brBtnShadow);
  335.     }
  336.   }
  337.   else // ...else draw non pressed button
  338.   {
  339.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
  340.     CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
  341.     CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
  342.     CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
  343.     if (m_bIsFlat == TRUE)
  344.     {
  345.       if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
  346.       {
  347.   pDC->Draw3dRect(itemRect, ::GetSysColor(COLOR_BTNHILIGHT), ::GetSysColor(COLOR_BTNSHADOW));
  348. /*
  349.        // Disegno i bordi a sinistra e in alto
  350.         // White line
  351.         pOldPen = pDC->SelectObject(&penBtnHiLight);
  352.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  353.         pDC->LineTo(itemRect.left, itemRect.top);
  354.         pDC->LineTo(itemRect.right, itemRect.top);
  355.         // Disegno i bordi a destra e in basso
  356.         // Dark gray line
  357.         pDC->SelectObject(penBtnShadow);
  358.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  359.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  360.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  361.         //
  362.         pDC->SelectObject(pOldPen);
  363. */
  364.       }
  365.     }
  366.     else
  367.     {
  368.       // Disegno i bordi a sinistra e in alto
  369.       // White line
  370.       pOldPen = pDC->SelectObject(&penBtnHiLight);
  371.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  372.       pDC->LineTo(itemRect.left, itemRect.top);
  373.       pDC->LineTo(itemRect.right, itemRect.top);
  374.       // Light gray line
  375.       pDC->SelectObject(pen3DLight);
  376.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
  377.       pDC->LineTo(itemRect.left+1, itemRect.top+1);
  378.       pDC->LineTo(itemRect.right, itemRect.top+1);
  379.       // Disegno i bordi a destra e in basso
  380.       // Black line
  381.       pDC->SelectObject(pen3DDKShadow);
  382.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  383.       pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  384.       pDC->LineTo(itemRect.right-1, itemRect.top-1);
  385.       // Dark gray line
  386.       pDC->SelectObject(penBtnShadow);
  387.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
  388.       pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
  389.       pDC->LineTo(itemRect.right-2, itemRect.top);
  390.       //
  391.       pDC->SelectObject(pOldPen);
  392.     }
  393.   }
  394.   // Read the button's title
  395.   CString sTitle;
  396.   GetWindowText(sTitle);
  397.   // If we don't want the title displayed
  398.   if (m_bShowText == FALSE) sTitle.Empty();
  399.   CRect captionRect = lpDIS->rcItem;
  400.   // Draw the icon
  401.   if (m_hIconIn != NULL)
  402.   {
  403.     DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
  404.   }
  405.   // Write the button title (if any)
  406.   if (sTitle.IsEmpty() == FALSE)
  407.   {
  408.     // Disegno la caption del bottone
  409.     // Se il bottone e' premuto muovo la captionRect di conseguenza
  410.     if (bIsPressed)
  411.       captionRect.OffsetRect(1, 1);
  412.     
  413.     // ONLY FOR DEBUG 
  414.     // Evidenzia il rettangolo in cui verra' centrata la caption 
  415.     //CBrush brBtnShadow(RGB(255, 0, 0));
  416.     //pDC->FrameRect(&captionRect, &brBtnShadow);
  417. #ifdef ST_USE_MEMDC
  418. // Get dialog's font
  419.     CFont *pCurrentFont = GetFont(); 
  420.     CFont *pOldFont = pDC->SelectObject(pCurrentFont);
  421. #endif
  422.     if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
  423. {
  424.       pDC->SetTextColor(GetActiveFgColor());
  425.       pDC->SetBkColor(GetActiveBgColor());
  426.     } 
  427. else 
  428. {
  429.       pDC->SetTextColor(GetInactiveFgColor());
  430.       pDC->SetBkColor(GetInactiveBgColor());
  431.     }
  432.     // Center text
  433.     CRect centerRect = captionRect;
  434.     pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
  435.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
  436. /* RFU
  437.     captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);
  438.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);
  439. */
  440. pDC->SetBkMode(TRANSPARENT);
  441.     pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  442.                    TRUE, 0, (CBrush*)NULL);
  443. #ifdef ST_USE_MEMDC
  444.     pDC->SelectObject(pOldFont);
  445. #endif
  446.   }
  447.   if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
  448.   {
  449.     // Draw the focus rect
  450.     if (bIsFocused)
  451.     {
  452.       CRect focusRect = itemRect;
  453.       focusRect.DeflateRect(3, 3);
  454.       pDC->DrawFocusRect(&focusRect);
  455.     }
  456.   }
  457. } // End of DrawItem
  458. void CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled)
  459. {
  460. CRect iconRect = rcItem;
  461. CRect btnRect;
  462.   switch (m_nAlign)
  463.   {
  464.     case ST_ALIGN_HORIZ:
  465.          if (title->IsEmpty())
  466.          {
  467.            // Center the icon horizontally
  468.            iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  469.          }
  470.          else
  471.          {
  472.            // L'icona deve vedersi subito dentro il focus rect
  473.            iconRect.left += 3;  
  474.            captionRect->left += m_cxIcon + 3;
  475.          }
  476.          // Center the icon vertically
  477.          iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
  478.          break;
  479. case ST_ALIGN_HORIZ_RIGHT:
  480. GetClientRect(&btnRect);
  481. if (title->IsEmpty())
  482. {
  483. // Center the icon horizontally
  484. iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  485. }
  486. else
  487. {
  488. // L'icona deve vedersi subito dentro il focus rect
  489. captionRect->right = captionRect->Width() - m_cxIcon - 3;
  490. captionRect->left = 3;
  491. iconRect.left = btnRect.right - m_cxIcon - 3;
  492. // Center the icon vertically
  493. iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
  494. }
  495. break;
  496.     case ST_ALIGN_VERT:
  497.          // Center the icon horizontally
  498.          iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  499.          if (title->IsEmpty())
  500.          {
  501.            // Center the icon vertically
  502.            iconRect.top += ((iconRect.Height() - m_cyIcon)/2);           
  503.          }
  504.          else
  505.          {
  506.            captionRect->top += m_cyIcon;
  507.          }
  508.          break;
  509.   }
  510.     
  511.   // If button is pressed then press the icon also
  512.   if (IsPressed) iconRect.OffsetRect(1, 1);
  513.   // Ole'!
  514.   pDC->DrawState( iconRect.TopLeft(),
  515. iconRect.Size(), 
  516. (m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut, 
  517. (IsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  518. (CBrush*)NULL);
  519. } // End of DrawTheIcon
  520. void CButtonST::PreSubclassWindow() 
  521. {
  522. UINT nBS;
  523. nBS = GetButtonStyle();
  524. // Check if this is the default button
  525. if (nBS & BS_DEFPUSHBUTTON) m_bIsDefault = TRUE;
  526. // Add BS_OWNERDRAW style
  527. SetButtonStyle(nBS | BS_OWNERDRAW);
  528. CButton::PreSubclassWindow();
  529. } // End of PreSubclassWindow
  530. BOOL CButtonST::PreTranslateMessage(MSG* pMsg) 
  531. {
  532. InitToolTip();
  533. m_ToolTip.RelayEvent(pMsg);
  534. return CButton::PreTranslateMessage(pMsg);
  535. } // End of PreTranslateMessage
  536. LRESULT CButtonST::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  537. {
  538. if (message == WM_LBUTTONDBLCLK)
  539. {
  540. message = WM_LBUTTONDOWN;
  541. }
  542. return CButton::DefWindowProc(message, wParam, lParam);
  543. } // End of DefWindowProc
  544. void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
  545. {
  546. m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); 
  547. if (bRepaint == TRUE) Invalidate();
  548. } // End of SetDefaultInactiveBgColor
  549. void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
  550. {
  551. m_crInactiveBg = crNew; 
  552. if (bRepaint == TRUE) Invalidate();
  553. } // End of SetInactiveBgColor
  554. const COLORREF CButtonST::GetInactiveBgColor()
  555. {
  556. return m_crInactiveBg;
  557. } // End of GetInactiveBgColor
  558. void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
  559. {
  560. m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); 
  561. if (bRepaint == TRUE) Invalidate();
  562. } // End of SetDefaultInactiveFgColor
  563. void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
  564. {
  565. m_crInactiveFg = crNew; 
  566. if (bRepaint == TRUE) Invalidate();
  567. } // End of SetInactiveFgColor
  568. const COLORREF CButtonST::GetInactiveFgColor()
  569. {
  570. return m_crInactiveFg;
  571. } // End of GetInactiveFgColor
  572. void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
  573. {
  574. m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); 
  575. if (bRepaint == TRUE) Invalidate();
  576. } // End of SetDefaultActiveBgColor
  577. void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
  578. {
  579. m_crActiveBg = crNew; 
  580. if (bRepaint == TRUE) Invalidate();
  581. } // End of SetActiveBgColor
  582. const COLORREF CButtonST::GetActiveBgColor()
  583. {
  584. return m_crActiveBg;
  585. } // End of GetActiveBgColor
  586. void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
  587. {
  588. m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); 
  589. if (bRepaint == TRUE) Invalidate();
  590. } // End of SetDefaultActiveFgColor
  591. void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
  592. {
  593. m_crActiveFg = crNew; 
  594. if (bRepaint == TRUE) Invalidate();
  595. } // End of SetActiveFgColor
  596. const COLORREF CButtonST::GetActiveFgColor()
  597. {
  598. return m_crActiveFg;
  599. } // End of GetActiveFgColor
  600. void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
  601. {
  602. m_bDrawFlatFocus = bDrawFlatFocus;
  603. // Repaint the button
  604. if (bRepaint == TRUE) Invalidate();
  605. } // End of SetFlatFocus
  606. BOOL CButtonST::GetFlatFocus()
  607. {
  608. return m_bDrawFlatFocus;
  609. } // End of GetFlatFocus
  610. BOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  611. {
  612. // If a cursor was specified then use it!
  613. if (m_hCursor != NULL)
  614. {
  615. ::SetCursor(m_hCursor);
  616. return TRUE;
  617. }
  618. return CButton::OnSetCursor(pWnd, nHitTest, message);
  619. } // End of OnSetCursor
  620. void CButtonST::SetTooltipText(CString* spText, BOOL bActivate)
  621. {
  622. // We cannot accept NULL pointer
  623. if (spText == NULL) return;
  624. // Initialize ToolTip
  625. InitToolTip();
  626. // If there is no tooltip defined then add it
  627. if (m_ToolTip.GetToolCount() == 0)
  628. {
  629. CRect rectBtn; 
  630. GetClientRect(rectBtn);
  631. m_ToolTip.AddTool(this, (LPCTSTR)*spText, rectBtn, 1);
  632. }
  633. // Set text for tooltip
  634. m_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1);
  635. m_ToolTip.Activate(bActivate);
  636. } // End of SetTooltipText
  637. void CButtonST::SetTooltipText(int nId, BOOL bActivate)
  638. {
  639. CString sText;
  640. // load string resource
  641. sText.LoadString(nId);
  642. // If string resource is not empty
  643. if (sText.IsEmpty() == FALSE) SetTooltipText(&sText, bActivate);
  644. } // End of SetTooltipText
  645. void CButtonST::ActivateTooltip(BOOL bActivate)
  646. {
  647. // If there is no tooltip then do nothing
  648. if (m_ToolTip.GetToolCount() == 0) return;
  649. // Activate tooltip
  650. m_ToolTip.Activate(bActivate);
  651. } // End of EnableTooltip
  652. BOOL CButtonST::GetDefault()
  653. {
  654. return m_bIsDefault;
  655. } // End of GetDefault
  656. void CButtonST::DrawTransparent(BOOL bRepaint)
  657. {
  658. m_bDrawTransparent = TRUE;
  659. // Restore old bitmap (if any)
  660. if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
  661. {
  662. m_dcBk.SelectObject(m_pbmpOldBk);
  663. }
  664. m_bmpBk.Detach();
  665. m_dcBk.Detach();
  666. // Repaint the button
  667. if (bRepaint == TRUE) Invalidate();
  668. } // End of DrawTransparent
  669. void CButtonST::InitToolTip()
  670. {
  671. if (m_ToolTip.m_hWnd == NULL)
  672. {
  673. // Create ToolTip control
  674. m_ToolTip.Create(this);
  675. // Create inactive
  676. m_ToolTip.Activate(FALSE);
  677. }
  678. } // End of InitToolTip
  679. void CButtonST::PaintBk(CDC * pDC)
  680. {
  681. CClientDC clDC(GetParent());
  682. CRect rect;
  683. CRect rect1;
  684. GetClientRect(rect);
  685. GetWindowRect(rect1);
  686. GetParent()->ScreenToClient(rect1);
  687. if (m_dcBk.m_hDC == NULL)
  688. {
  689. m_dcBk.CreateCompatibleDC(&clDC);
  690. m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
  691. m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
  692. m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
  693. }
  694. pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
  695. } // End of PaintBk
  696. HBRUSH CButtonST::CtlColor(CDC* pDC, UINT nCtlColor) 
  697. {
  698. return (HBRUSH)::GetStockObject(NULL_BRUSH); 
  699. } // End of CtlColor
  700. void CButtonST::OnSysColorChange() 
  701. {
  702. CButton::OnSysColorChange();
  703. m_dcBk.DeleteDC();
  704. m_bmpBk.DeleteObject();
  705. } // End of OnSysColorChange
  706. #undef ST_USE_MEMDC
  707. #undef ST_LIKEIE