BtnST.cpp
上传用户:wangfu1106
上传日期:2014-08-20
资源大小:193k
文件大小:16k
源码类别:

数据库编程

开发平台:

Visual C++

  1. // BtnST.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "BtnST.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CButtonST
  12. CButtonST::CButtonST()
  13. {
  14.   m_MouseOnButton = FALSE;
  15.   m_hIconIn = NULL;
  16.   m_hIconOut = NULL;
  17.   m_cxIcon = 0;
  18.   m_cyIcon = 0;
  19.   m_hCursor = NULL;
  20.   
  21.   // Default type is "flat" button
  22.   m_bIsFlat = TRUE; 
  23.   
  24.   // By default draw border in "flat" button 
  25.   m_bDrawBorder = TRUE; 
  26.   
  27.   // By default icon is aligned horizontally
  28.   m_nAlign = ST_ALIGN_HORIZ; 
  29.   
  30.   // By default show the text button
  31.   m_bShowText = TRUE; 
  32.   
  33.   // By default, for "flat" button, don't draw the focus rect
  34.   m_bDrawFlatFocus = FALSE;
  35.   SetDefaultInactiveBgColor();
  36.   SetDefaultInactiveFgColor();
  37.   SetDefaultActiveBgColor();
  38.   SetDefaultActiveFgColor();
  39. } // End of CButtonST
  40. CButtonST::~CButtonST()
  41. {
  42. // Destroy the icons (if any)
  43. if (m_hIconIn != NULL) ::DeleteObject(m_hIconIn);
  44. if (m_hIconOut != NULL) ::DeleteObject(m_hIconOut);
  45. // Destroy the cursor (if any)
  46. if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);
  47. } // End of ~CButtonST
  48. BEGIN_MESSAGE_MAP(CButtonST, CButton)
  49.     //{{AFX_MSG_MAP(CButtonST)
  50. ON_WM_CAPTURECHANGED()
  51. ON_WM_SETCURSOR()
  52. ON_WM_KILLFOCUS()
  53. ON_WM_MOUSEMOVE()
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. void CButtonST::SetIcon(int nIconInId, int nIconOutId, BYTE cx, BYTE cy)
  57. {
  58. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),
  59. RT_GROUP_ICON);
  60. // Set icon when the mouse is IN the button
  61. m_hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
  62.   
  63. // Set icon when the mouse is OUT the button
  64. m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
  65.   
  66. m_cxIcon = cx;
  67. m_cyIcon = cy;
  68. // RedrawWindow(); --->不需要重新绘制窗口
  69. } // End of SetIcon
  70. BOOL CButtonST::SetBtnCursor(int nCursorId)
  71. {
  72. HINSTANCE hInstResource;
  73. // Destroy any previous cursor
  74. if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);
  75. m_hCursor = NULL;
  76. // If we want a cursor
  77. if (nCursorId != -1)
  78. {
  79. hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),
  80. RT_GROUP_CURSOR);
  81. // Load icon resource
  82. m_hCursor = (HCURSOR)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0);
  83. // If something wrong then return FALSE
  84. if (m_hCursor == NULL) return FALSE;
  85. }
  86. return TRUE;
  87. } // End of SetBtnCursor
  88. void CButtonST::SetFlat(BOOL bState)
  89. {
  90.   m_bIsFlat = bState;
  91.   Invalidate();
  92. } // End of SetFlat
  93. BOOL CButtonST::GetFlat()
  94. {
  95.   return m_bIsFlat;
  96. } // End of GetFlat
  97. void CButtonST::SetAlign(int nAlign)
  98. {
  99.   switch (nAlign)
  100.   {    
  101.     case ST_ALIGN_HORIZ:
  102.          m_nAlign = ST_ALIGN_HORIZ;
  103.          break;
  104.     case ST_ALIGN_VERT:
  105.          m_nAlign = ST_ALIGN_VERT;
  106.          break;
  107.   }
  108.   Invalidate();
  109. } // End of SetAlign
  110. int CButtonST::GetAlign()
  111. {
  112.   return m_nAlign;
  113. } // End of GetAlign
  114. void CButtonST::DrawBorder(BOOL bEnable)
  115. {
  116.   m_bDrawBorder = bEnable;
  117. } // End of DrawBorder
  118. const char* CButtonST::GetVersionC()
  119. {
  120.   return "2.3";
  121. } // End of GetVersionC
  122. const short CButtonST::GetVersionI()
  123. {
  124.   return 23; // Divide by 10 to get actual version
  125. } // End of GetVersionI
  126. void CButtonST::SetShowText(BOOL bShow)
  127. {
  128.   m_bShowText = bShow;
  129.   Invalidate();
  130. } // End of SetShowText
  131. BOOL CButtonST::GetShowText()
  132. {
  133.   return m_bShowText;
  134. } // End of GetShowText
  135. void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
  136. {
  137.   CWnd* pWnd;  // Finestra attiva
  138.   CWnd* pParent; // Finestra che contiene il bottone
  139.   CButton::OnMouseMove(nFlags, point);
  140.   // If the mouse enter the button with the left button pressed
  141.   // then do nothing
  142.   if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;
  143.   // If our button is not flat then do nothing
  144.   if (m_bIsFlat == FALSE) return;
  145.   pWnd = GetActiveWindow();
  146.   pParent = GetOwner();
  147. if ((GetCapture() != this) && 
  148. (
  149. #ifndef ST_LIKEIE
  150. pWnd != NULL && 
  151. #endif
  152. pParent != NULL)) 
  153. {
  154. m_MouseOnButton = TRUE;
  155. //SetFocus(); // Thanks Ralph!
  156. SetCapture();
  157. Invalidate();
  158. }
  159. else
  160.   {
  161.     CRect rc;
  162.     GetClientRect(&rc);
  163.     if (!rc.PtInRect(point))
  164.     {
  165.       // Redraw only if mouse goes out
  166.       if (m_MouseOnButton == TRUE)
  167.       {
  168.         m_MouseOnButton = FALSE;
  169.         Invalidate();
  170.       }
  171.       // If user is NOT pressing left button then release capture!
  172.       if (!(nFlags & MK_LBUTTON)) ReleaseCapture();
  173.     }
  174.   }
  175. } // End of OnMouseMove
  176. void CButtonST::OnKillFocus(CWnd * pNewWnd)
  177. {
  178.   CButton::OnKillFocus(pNewWnd);
  179.   // If our button is not flat then do nothing
  180.   if (m_bIsFlat == FALSE) return;
  181.   if (m_MouseOnButton == TRUE)
  182.   {
  183.     m_MouseOnButton = FALSE;
  184.     Invalidate();
  185.   }
  186. } // End of OnKillFocus
  187. void CButtonST::OnCaptureChanged(CWnd *pWnd) 
  188. {
  189. if (m_MouseOnButton == TRUE)
  190. {
  191. ReleaseCapture();
  192. Invalidate();
  193. }
  194. // Call base message handler
  195. CButton::OnCaptureChanged(pWnd);
  196. } // End of OnCaptureChanged
  197. void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  198. {
  199. #ifdef ST_USE_MEMDC
  200.   CDC  *pdrawDC = CDC::FromHandle(lpDIS->hDC);
  201.   CMemDC memDC(pdrawDC);
  202.   CDC  *pDC = &memDC;
  203. #else
  204.   CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  205. #endif
  206.   CPen *pOldPen;
  207.   BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
  208.   BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
  209.   BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
  210.   CRect itemRect = lpDIS->rcItem;
  211.   if (m_bIsFlat == FALSE)
  212.   {
  213.     if (bIsFocused)
  214.     {
  215.       CBrush br(RGB(0,0,0));  
  216.       pDC->FrameRect(&itemRect, &br);
  217.       itemRect.DeflateRect(1, 1);
  218.     }
  219.   }
  220.   // Prepare draw... paint button's area with background color
  221.   COLORREF bgColor;
  222.   if ((m_MouseOnButton == TRUE) || (bIsPressed))
  223.     bgColor = GetActiveBgColor();
  224.   else
  225.     bgColor = GetInactiveBgColor();
  226.   CBrush br(bgColor);
  227.   pDC->FillRect(&itemRect, &br);
  228. // Disegno lo sfondo del bottone
  229. //CBrush br(GetSysColor(COLOR_BTNFACE));  
  230. //pDC->FillRect(&itemRect, &br);
  231.   // Draw pressed button
  232.   if (bIsPressed)
  233.   {
  234.     if (m_bIsFlat == TRUE)
  235.     {
  236.       if (m_bDrawBorder == TRUE)
  237.       {
  238.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco
  239.         CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro
  240.         // Disegno i bordi a sinistra e in alto
  241.         // Dark gray line
  242.         pOldPen = pDC->SelectObject(&penBtnShadow);
  243.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  244.         pDC->LineTo(itemRect.left, itemRect.top);
  245.         pDC->LineTo(itemRect.right, itemRect.top);
  246.         // Disegno i bordi a destra e in basso
  247.         // White line
  248.         pDC->SelectObject(penBtnHiLight);
  249.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  250.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  251.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  252.         //
  253.         pDC->SelectObject(pOldPen);
  254.       }
  255.     }
  256.     else    
  257.     {
  258.       CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
  259.       pDC->FrameRect(&itemRect, &brBtnShadow);
  260.     }
  261.   }
  262.   else // ...else draw non pressed button
  263.   {
  264.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
  265.     CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
  266.     CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
  267.     CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
  268.     if (m_bIsFlat == TRUE)
  269.     {
  270.       if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
  271.       {
  272.        // Disegno i bordi a sinistra e in alto
  273.         // White line
  274.         pOldPen = pDC->SelectObject(&penBtnHiLight);
  275.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  276.         pDC->LineTo(itemRect.left, itemRect.top);
  277.         pDC->LineTo(itemRect.right, itemRect.top);
  278.         // Disegno i bordi a destra e in basso
  279.         // Dark gray line
  280.         pDC->SelectObject(penBtnShadow);
  281.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  282.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  283.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  284.         //
  285.         pDC->SelectObject(pOldPen);
  286.       }
  287.     }
  288.     else
  289.     {
  290.       // Disegno i bordi a sinistra e in alto
  291.       // White line
  292.       pOldPen = pDC->SelectObject(&penBtnHiLight);
  293.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  294.       pDC->LineTo(itemRect.left, itemRect.top);
  295.       pDC->LineTo(itemRect.right, itemRect.top);
  296.       // Light gray line
  297.       pDC->SelectObject(pen3DLight);
  298.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
  299.       pDC->LineTo(itemRect.left+1, itemRect.top+1);
  300.       pDC->LineTo(itemRect.right, itemRect.top+1);
  301.       // Disegno i bordi a destra e in basso
  302.       // Black line
  303.       pDC->SelectObject(pen3DDKShadow);
  304.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  305.       pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  306.       pDC->LineTo(itemRect.right-1, itemRect.top-1);
  307.       // Dark gray line
  308.       pDC->SelectObject(penBtnShadow);
  309.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
  310.       pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
  311.       pDC->LineTo(itemRect.right-2, itemRect.top);
  312.       //
  313.       pDC->SelectObject(pOldPen);
  314.     }
  315.   }
  316.   // Read the button title
  317.   CString sTitle;
  318.   GetWindowText(sTitle);
  319.   // If we don't want the title displayed
  320.   if (m_bShowText == FALSE) sTitle.Empty();
  321.   CRect captionRect = lpDIS->rcItem;
  322.   // Draw the icon
  323.   if (m_hIconIn != NULL)
  324.   {
  325.     DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
  326.   }
  327.   // Write the button title (if any)
  328.   if (sTitle.IsEmpty() == FALSE)
  329.   {
  330.     // Disegno la caption del bottone
  331.     // Se il bottone e' premuto muovo la captionRect di conseguenza
  332.     if (bIsPressed)
  333.       captionRect.OffsetRect(1, 1);
  334.     
  335.     // ONLY FOR DEBUG 
  336.     // Evidenzia il rettangolo in cui verra' centrata la caption 
  337.     //CBrush brBtnShadow(RGB(255, 0, 0));
  338.     //pDC->FrameRect(&captionRect, &brBtnShadow);
  339. #ifdef ST_USE_MEMDC
  340. // Get dialog's font
  341.     CFont *pCurrentFont = GetFont(); 
  342.     CFont *pOldFont = pDC->SelectObject(pCurrentFont);
  343. #endif
  344.     if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
  345. {
  346.       pDC->SetTextColor(GetActiveFgColor());
  347.       pDC->SetBkColor(GetActiveBgColor());
  348.     } 
  349. else 
  350. {
  351.       pDC->SetTextColor(GetInactiveFgColor());
  352.       pDC->SetBkColor(GetInactiveBgColor());
  353.     }
  354.     // Center text
  355.     CRect centerRect = captionRect;
  356.     pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
  357.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
  358. /* RFU
  359.     captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);
  360.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);
  361. */
  362.     pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  363.                    TRUE, 0, (CBrush*)NULL);
  364. #ifdef ST_USE_MEMDC
  365.     pDC->SelectObject(pOldFont);
  366. #endif
  367.   }
  368.   if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
  369.   {
  370.     // Draw the focus rect
  371.     if (bIsFocused)
  372.     {
  373.       CRect focusRect = itemRect;
  374.       focusRect.DeflateRect(3, 3);
  375.       pDC->DrawFocusRect(&focusRect);
  376.     }
  377.   }
  378. } // End of DrawItem
  379. void CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled)
  380. {
  381.   CRect iconRect = rcItem;
  382.   switch (m_nAlign)
  383.   {
  384.     case ST_ALIGN_HORIZ:
  385.          if (title->IsEmpty())
  386.          {
  387.            // Center the icon horizontally
  388.            iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  389.          }
  390.          else
  391.          {
  392.            // L'icona deve vedersi subito dentro il focus rect
  393. //        iconRect.left += 3;  
  394.            captionRect->left += m_cxIcon + 3;
  395.          }
  396.          // Center the icon vertically
  397.          iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
  398.          break;
  399.     case ST_ALIGN_VERT:
  400.          // Center the icon horizontally
  401.          iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  402.          if (title->IsEmpty())
  403.          {
  404.            // Center the icon vertically
  405.            iconRect.top += ((iconRect.Height() - m_cyIcon)/2);           
  406.          }
  407.          else
  408.          {
  409.            captionRect->top += m_cyIcon;
  410.          }
  411.          break;
  412.   }
  413.     
  414.   // If button is pressed then press the icon also
  415.   if (IsPressed) iconRect.OffsetRect(1, 1);
  416.   // Ole'!
  417.   pDC->DrawState(iconRect.TopLeft(), 
  418.                iconRect.Size(), 
  419.          (m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut, 
  420.          (IsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  421.                  (CBrush*)NULL);
  422. } // End of DrawTheIcon
  423. void CButtonST::PreSubclassWindow() 
  424. {
  425.   // Add BS_OWNERDRAW style
  426.   SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
  427.   CButton::PreSubclassWindow();
  428. } // End of PreSubclassWindow
  429. void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
  430. {
  431. m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); 
  432. if (bRepaint == TRUE) Invalidate();
  433. } // End of SetDefaultInactiveBgColor
  434. void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
  435. {
  436. m_crInactiveBg = crNew; 
  437. if (bRepaint == TRUE) Invalidate();
  438. } // End of SetInactiveBgColor
  439. const COLORREF CButtonST::GetInactiveBgColor()
  440. {
  441. return m_crInactiveBg;
  442. } // End of GetInactiveBgColor
  443. void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
  444. {
  445. m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); 
  446. if (bRepaint == TRUE) Invalidate();
  447. } // End of SetDefaultInactiveFgColor
  448. void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
  449. {
  450. m_crInactiveFg = crNew; 
  451. if (bRepaint == TRUE) Invalidate();
  452. } // End of SetInactiveFgColor
  453. const COLORREF CButtonST::GetInactiveFgColor()
  454. {
  455. return m_crInactiveFg;
  456. } // End of GetInactiveFgColor
  457. void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
  458. {
  459. m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); 
  460. if (bRepaint == TRUE) Invalidate();
  461. } // End of SetDefaultActiveBgColor
  462. void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
  463. {
  464. m_crActiveBg = crNew; 
  465. if (bRepaint == TRUE) Invalidate();
  466. } // End of SetActiveBgColor
  467. const COLORREF CButtonST::GetActiveBgColor()
  468. {
  469. return m_crActiveBg;
  470. } // End of GetActiveBgColor
  471. void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
  472. {
  473. m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); 
  474. if (bRepaint == TRUE) Invalidate();
  475. } // End of SetDefaultActiveFgColor
  476. void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
  477. {
  478. m_crActiveFg = crNew; 
  479. if (bRepaint == TRUE) Invalidate();
  480. } // End of SetActiveFgColor
  481. const COLORREF CButtonST::GetActiveFgColor()
  482. {
  483. return m_crActiveFg;
  484. } // End of GetActiveFgColor
  485. void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
  486. {
  487. m_bDrawFlatFocus = bDrawFlatFocus;
  488. // Repaint the button
  489. if (bRepaint == TRUE) Invalidate();
  490. } // End of SetFlatFocus
  491. BOOL CButtonST::GetFlatFocus()
  492. {
  493. return m_bDrawFlatFocus;
  494. } // End of GetFlatFocus
  495. BOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  496. {
  497. // If a cursor was specified then use it!
  498. if (m_hCursor != NULL)
  499. {
  500. ::SetCursor(m_hCursor);
  501. return TRUE;
  502. }
  503. return CButton::OnSetCursor(pWnd, nHitTest, message);
  504. } // End of OnSetCursor
  505. #undef ST_USE_MEMDC
  506. #undef ST_LIKE