BtnST.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:17k
源码类别:

图片显示

开发平台:

Visual C++

  1. // BtnST.cpp : implementation file
  2. #include "stdafx.h"
  3. #include "BtnST.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. /////////////////////////////////////////////////////////////////////////////
  10. // CButtonST
  11. CButtonST::CButtonST()
  12. {
  13. m_MouseOnButton = FALSE;
  14. m_hIconIn = NULL;
  15. m_hIconOut = NULL;
  16. m_cxIcon = 0;
  17. m_cyIcon = 0;
  18. m_hCursor = NULL;
  19.   
  20. // 缺省风格为平面按钮
  21. m_bIsFlat = TRUE; 
  22.   
  23. m_bDrawBorder = TRUE; 
  24.   
  25. //图标水平排列
  26. m_nAlign = ST_ALIGN_HORIZ; 
  27.   
  28. // 显示文本按钮
  29. m_bShowText = TRUE; 
  30.   
  31. // 平面按钮不绘制焦点矩形
  32. m_bDrawFlatFocus = FALSE;
  33. // 按钮不为标准(缺省)按钮
  34. m_bIsDefault = FALSE;
  35. SetDefaultInactiveBgColor();
  36. SetDefaultInactiveFgColor();
  37. SetDefaultActiveBgColor();
  38. SetDefaultActiveFgColor();
  39. // 不创建工具提示
  40. m_ToolTip.m_hWnd = NULL;
  41. // 不为透明按钮
  42. m_bDrawTransparent = FALSE;
  43. m_pbmpOldBk = NULL;
  44. } // End of CButtonST
  45. CButtonST::~CButtonST()
  46. {
  47. // 恢复原来的位图
  48. if (m_dcBk.m_hDC != NULL && m_pbmpOldBk != NULL)
  49. {
  50. m_dcBk.SelectObject(m_pbmpOldBk);
  51. }
  52. } // End of ~CButtonST
  53. BEGIN_MESSAGE_MAP(CButtonST, CButton)
  54.     //{{AFX_MSG_MAP(CButtonST)
  55. ON_WM_CAPTURECHANGED()
  56. ON_WM_SETCURSOR()
  57. ON_WM_KILLFOCUS()
  58. ON_WM_MOUSEMOVE()
  59. //}}AFX_MSG_MAP
  60. END_MESSAGE_MAP()
  61. void CButtonST::SetIcon(int nIconInId, int nIconOutId)
  62. {
  63. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),
  64. RT_GROUP_ICON);
  65. // 设置光标位于按钮上时的图标
  66. m_hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
  67.   
  68. // 设置光标位于按钮外时的图标
  69. m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
  70.   
  71. ICONINFO ii;
  72. // 获取图标大小
  73. ZeroMemory(&ii, sizeof(ICONINFO));
  74. ::GetIconInfo(m_hIconIn, &ii);
  75. m_cxIcon = (BYTE)(ii.xHotspot * 2);
  76. m_cyIcon = (BYTE)(ii.yHotspot * 2);
  77. RedrawWindow();
  78. } // End of SetIcon
  79. BOOL CButtonST::SetBtnCursor(int nCursorId)
  80. {
  81. HINSTANCE hInstResource;
  82. // Destroy any previous cursor
  83. if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);
  84. m_hCursor = NULL;
  85. // If we want a cursor
  86. if (nCursorId != -1)
  87. {
  88. hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),
  89. RT_GROUP_CURSOR);
  90. // Load icon resource
  91. m_hCursor = (HCURSOR)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nCursorId), IMAGE_CURSOR, 0, 0, 0);
  92. // If something wrong then return FALSE
  93. if (m_hCursor == NULL) return FALSE;
  94. }
  95. return TRUE;
  96. } // End of SetBtnCursor
  97. void CButtonST::SetFlat(BOOL bState)
  98. {
  99.   m_bIsFlat = bState;
  100.   Invalidate();
  101. } // End of SetFlat
  102. BOOL CButtonST::GetFlat()
  103. {
  104.   return m_bIsFlat;
  105. } // End of GetFlat
  106. void CButtonST::SetAlign(int nAlign)
  107. {
  108.   switch (nAlign)
  109.   {    
  110.     case ST_ALIGN_HORIZ:
  111.          m_nAlign = ST_ALIGN_HORIZ;
  112.          break;
  113.     case ST_ALIGN_VERT:
  114.          m_nAlign = ST_ALIGN_VERT;
  115.          break;
  116.   }
  117.   Invalidate();
  118. } // End of SetAlign
  119. int CButtonST::GetAlign()
  120. {
  121.   return m_nAlign;
  122. } // End of GetAlign
  123. void CButtonST::DrawBorder(BOOL bEnable)
  124. {
  125.   m_bDrawBorder = bEnable;
  126. } // End of DrawBorder
  127. const char* CButtonST::GetVersionC()
  128. {
  129.   return "2.5";
  130. } // End of GetVersionC
  131. const short CButtonST::GetVersionI()
  132. {
  133.   return 25; // Divide by 10 to get actual version
  134. } // End of GetVersionI
  135. void CButtonST::SetShowText(BOOL bShow)
  136. {
  137.   m_bShowText = bShow;
  138.   Invalidate();
  139. } // End of SetShowText
  140. BOOL CButtonST::GetShowText()
  141. {
  142.   return m_bShowText;
  143. } // End of GetShowText
  144. void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
  145. {
  146. CWnd* pWnd;  // Finestra attiva
  147. CWnd* pParent; // Finestra che contiene il bottone
  148. CButton::OnMouseMove(nFlags, point);
  149. // If the mouse enter the button with the left button pressed
  150. // then do nothing
  151. if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;
  152. // If our button is not flat then do nothing
  153. if (m_bIsFlat == FALSE) return;
  154. pWnd = GetActiveWindow();
  155. pParent = GetOwner();
  156. if ((GetCapture() != this) && 
  157. (
  158. #ifndef ST_LIKEIE
  159. pWnd != NULL && 
  160. #endif
  161. pParent != NULL)) 
  162. {
  163. m_MouseOnButton = TRUE;
  164. //SetFocus();
  165. SetCapture();
  166. Invalidate();
  167. }
  168. else
  169. {
  170. /*
  171. CRect rc;
  172. GetClientRect(&rc);
  173. if (!rc.PtInRect(point))
  174. {
  175. */
  176. POINT p2 = point;
  177. ClientToScreen(&p2);
  178. CWnd* wndUnderMouse = WindowFromPoint(p2);
  179. if (wndUnderMouse != this)
  180. {
  181. // Redraw only if mouse goes out
  182. if (m_MouseOnButton == TRUE)
  183. {
  184. m_MouseOnButton = FALSE;
  185. Invalidate();
  186. }
  187. // If user is NOT pressing left button then release capture!
  188. if (!(nFlags & MK_LBUTTON)) ReleaseCapture();
  189. }
  190. }
  191. } // End of OnMouseMove
  192. void CButtonST::OnKillFocus(CWnd * pNewWnd)
  193. {
  194.   CButton::OnKillFocus(pNewWnd);
  195.   // 若按钮不为平面按钮,则返回
  196.   if (m_bIsFlat == FALSE) return;
  197.   if (m_MouseOnButton == TRUE)
  198.   {
  199.     m_MouseOnButton = FALSE;
  200.     Invalidate();
  201.   }
  202. } // End of OnKillFocus
  203. void CButtonST::OnCaptureChanged(CWnd *pWnd) 
  204. {
  205. if (m_MouseOnButton == TRUE)
  206. {
  207. ReleaseCapture();
  208. Invalidate();
  209. }
  210. // 调用基类消息处理函数
  211. CButton::OnCaptureChanged(pWnd);
  212. } // End of OnCaptureChanged
  213. void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  214. {
  215. #ifdef ST_USE_MEMDC
  216.   CDC  *pdrawDC = CDC::FromHandle(lpDIS->hDC);
  217.   CMemDC memDC(pdrawDC);
  218.   CDC  *pDC = &memDC;
  219. #else
  220.   CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  221. #endif
  222.   CPen *pOldPen;
  223.   BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
  224.   BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
  225.   BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
  226.   CRect itemRect = lpDIS->rcItem;
  227.   if (m_bIsFlat == FALSE)
  228.   {
  229.     if (bIsFocused || (GetDefault() == TRUE))
  230.     {
  231.       CBrush br(RGB(0,0,0));  
  232.       pDC->FrameRect(&itemRect, &br);
  233.       itemRect.DeflateRect(1, 1);
  234.     }
  235.   }
  236.   // 用背景颜色绘制按钮
  237.   COLORREF bgColor;
  238.   if ((m_MouseOnButton == TRUE) || (bIsPressed))
  239.     bgColor = GetActiveBgColor();
  240.   else
  241.     bgColor = GetInactiveBgColor();
  242. CBrush br(bgColor);
  243. // 是否透明?
  244. if (m_bDrawTransparent == TRUE)
  245. {
  246. PaintBk(pDC);
  247. }
  248. else
  249. {
  250. pDC->FillRect(&itemRect, &br);
  251. }
  252.   //绘制处于“按下”状态的按钮
  253.   if (bIsPressed)
  254.   {
  255.     if (m_bIsFlat == TRUE)
  256.     {
  257.       if (m_bDrawBorder == TRUE)
  258.       {
  259.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco
  260.         CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Grigio scuro
  261.         // 暗灰线
  262.         pOldPen = pDC->SelectObject(&penBtnShadow);
  263.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  264.         pDC->LineTo(itemRect.left, itemRect.top);
  265.         pDC->LineTo(itemRect.right, itemRect.top);
  266.         // 白线
  267.         pDC->SelectObject(penBtnHiLight);
  268.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  269.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  270.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  271.         //
  272.         pDC->SelectObject(pOldPen);
  273.       }
  274.     }
  275.     else    
  276.     {
  277.       CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
  278.       pDC->FrameRect(&itemRect, &brBtnShadow);
  279.     }
  280.   }
  281.   else // 不绘制处于“按下”状态的按钮
  282.   {
  283.     CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
  284.     CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
  285.     CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
  286.     CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
  287.     if (m_bIsFlat == TRUE)
  288.     {
  289.       if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
  290.       {
  291.         // 白线
  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.         // 暗灰线
  297.         pDC->SelectObject(penBtnShadow);
  298.         pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  299.         pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  300.         pDC->LineTo(itemRect.right-1, itemRect.top-1);
  301.         //
  302.         pDC->SelectObject(pOldPen);
  303.       }
  304.     }
  305.     else
  306.     {
  307.       // 白线
  308.       pOldPen = pDC->SelectObject(&penBtnHiLight);
  309.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  310.       pDC->LineTo(itemRect.left, itemRect.top);
  311.       pDC->LineTo(itemRect.right, itemRect.top);
  312.       // 亮灰线
  313.       pDC->SelectObject(pen3DLight);
  314.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
  315.       pDC->LineTo(itemRect.left+1, itemRect.top+1);
  316.       pDC->LineTo(itemRect.right, itemRect.top+1);
  317.       // 黑线
  318.       pDC->SelectObject(pen3DDKShadow);
  319.       pDC->MoveTo(itemRect.left, itemRect.bottom-1);
  320.       pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
  321.       pDC->LineTo(itemRect.right-1, itemRect.top-1);
  322.       // 暗灰线
  323.       pDC->SelectObject(penBtnShadow);
  324.       pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
  325.       pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
  326.       pDC->LineTo(itemRect.right-2, itemRect.top);
  327.       //
  328.       pDC->SelectObject(pOldPen);
  329.     }
  330.   }
  331.   // 按钮标题
  332.   CString sTitle;
  333.   GetWindowText(sTitle);
  334.   // 若不显示按钮标题
  335.   if (m_bShowText == FALSE) sTitle.Empty();
  336.   CRect captionRect = lpDIS->rcItem;
  337.   // 绘制图标
  338.   if (m_hIconIn != NULL)
  339.   {
  340.     DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
  341.   }
  342.   // 写按钮标题
  343.   if (sTitle.IsEmpty() == FALSE)
  344.   {
  345.     if (bIsPressed)
  346.       captionRect.OffsetRect(1, 1);
  347.     
  348.     // ONLY FOR DEBUG 
  349.     //CBrush brBtnShadow(RGB(255, 0, 0));
  350.     //pDC->FrameRect(&captionRect, &brBtnShadow);
  351. #ifdef ST_USE_MEMDC
  352. // 获取对话框字体
  353.     CFont *pCurrentFont = GetFont(); 
  354.     CFont *pOldFont = pDC->SelectObject(pCurrentFont);
  355. #endif
  356.     if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
  357. {
  358.       pDC->SetTextColor(GetActiveFgColor());
  359.       pDC->SetBkColor(GetActiveBgColor());
  360.     } 
  361. else 
  362. {
  363.       pDC->SetTextColor(GetInactiveFgColor());
  364.       pDC->SetBkColor(GetInactiveBgColor());
  365.     }
  366.     // 文本居中显示
  367.     CRect centerRect = captionRect;
  368.     pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
  369.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
  370. /* 
  371.     captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);
  372.     captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);
  373. */
  374. pDC->SetBkMode(TRANSPARENT);
  375.     pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  376.                    TRUE, 0, (CBrush*)NULL);
  377. #ifdef ST_USE_MEMDC
  378.     pDC->SelectObject(pOldFont);
  379. #endif
  380.   }
  381.   if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
  382.   {
  383.     // 绘制焦点矩形
  384.     if (bIsFocused)
  385.     {
  386.       CRect focusRect = itemRect;
  387.       focusRect.DeflateRect(3, 3);
  388.       pDC->DrawFocusRect(&focusRect);
  389.     }
  390.   }
  391. } // End of DrawItem
  392. void CButtonST::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled)
  393. {
  394.   CRect iconRect = rcItem;
  395.   switch (m_nAlign)
  396.   {
  397.     case ST_ALIGN_HORIZ:
  398.          if (title->IsEmpty())
  399.          {
  400.            // 图标水平居中
  401.            iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  402.          }
  403.          else
  404.          {
  405.            iconRect.left += 3;  
  406.            captionRect->left += m_cxIcon + 3;
  407.          }
  408.          // 图标垂直居中
  409.          iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
  410.          break;
  411.     case ST_ALIGN_VERT:
  412.          // 图标水平居中
  413.          iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  414.          if (title->IsEmpty())
  415.          {
  416.            // 图标垂直居中
  417.            iconRect.top += ((iconRect.Height() - m_cyIcon)/2);           
  418.          }
  419.          else
  420.          {
  421.            captionRect->top += m_cyIcon;
  422.          }
  423.          break;
  424.   }
  425.     
  426.   // 按钮按下时按下图标
  427.   if (IsPressed) iconRect.OffsetRect(1, 1);
  428.   pDC->DrawState(iconRect.TopLeft(), 
  429.                iconRect.Size(), 
  430.          (m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut, 
  431.          (IsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  432.                  (CBrush*)NULL);
  433. } // End of DrawTheIcon
  434. void CButtonST::PreSubclassWindow() 
  435. {
  436. UINT nBS;
  437. nBS = GetButtonStyle();
  438. // 检查是否为缺省(标准)按钮
  439. if (nBS & BS_DEFPUSHBUTTON) m_bIsDefault = TRUE;
  440. // 增加 BS_OWNERDRAW 风格
  441. SetButtonStyle(nBS | BS_OWNERDRAW);
  442. CButton::PreSubclassWindow();
  443. } // End of PreSubclassWindow
  444. BOOL CButtonST::PreTranslateMessage(MSG* pMsg) 
  445. {
  446. InitToolTip();
  447. m_ToolTip.RelayEvent(pMsg);
  448. return CButton::PreTranslateMessage(pMsg);
  449. } // End of PreTranslateMessage
  450. LRESULT CButtonST::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  451. {
  452. if (message == WM_LBUTTONDBLCLK)
  453. {
  454. message = WM_LBUTTONDOWN;
  455. }
  456. return CButton::DefWindowProc(message, wParam, lParam);
  457. } // End of DefWindowProc
  458. void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
  459. {
  460. m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); 
  461. if (bRepaint == TRUE) Invalidate();
  462. } // End of SetDefaultInactiveBgColor
  463. void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
  464. {
  465. m_crInactiveBg = crNew; 
  466. if (bRepaint == TRUE) Invalidate();
  467. } // End of SetInactiveBgColor
  468. const COLORREF CButtonST::GetInactiveBgColor()
  469. {
  470. return m_crInactiveBg;
  471. } // End of GetInactiveBgColor
  472. void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
  473. {
  474. m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); 
  475. if (bRepaint == TRUE) Invalidate();
  476. } // End of SetDefaultInactiveFgColor
  477. void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
  478. {
  479. m_crInactiveFg = crNew; 
  480. if (bRepaint == TRUE) Invalidate();
  481. } // End of SetInactiveFgColor
  482. const COLORREF CButtonST::GetInactiveFgColor()
  483. {
  484. return m_crInactiveFg;
  485. } // End of GetInactiveFgColor
  486. void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
  487. {
  488. m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); 
  489. if (bRepaint == TRUE) Invalidate();
  490. } // End of SetDefaultActiveBgColor
  491. void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
  492. {
  493. m_crActiveBg = crNew; 
  494. if (bRepaint == TRUE) Invalidate();
  495. } // End of SetActiveBgColor
  496. const COLORREF CButtonST::GetActiveBgColor()
  497. {
  498. return m_crActiveBg;
  499. } // End of GetActiveBgColor
  500. void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
  501. {
  502. m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); 
  503. if (bRepaint == TRUE) Invalidate();
  504. } // End of SetDefaultActiveFgColor
  505. void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
  506. {
  507. m_crActiveFg = crNew; 
  508. if (bRepaint == TRUE) Invalidate();
  509. } // End of SetActiveFgColor
  510. const COLORREF CButtonST::GetActiveFgColor()
  511. {
  512. return m_crActiveFg;
  513. } // End of GetActiveFgColor
  514. void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
  515. {
  516. m_bDrawFlatFocus = bDrawFlatFocus;
  517. // 重画按钮
  518. if (bRepaint == TRUE) Invalidate();
  519. } // End of SetFlatFocus
  520. BOOL CButtonST::GetFlatFocus()
  521. {
  522. return m_bDrawFlatFocus;
  523. } // End of GetFlatFocus
  524. BOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  525. {
  526. // 使用指定光标
  527. if (m_hCursor != NULL)
  528. {
  529. ::SetCursor(m_hCursor);
  530. return TRUE;
  531. }
  532. return CButton::OnSetCursor(pWnd, nHitTest, message);
  533. } // End of OnSetCursor
  534. void CButtonST::SetTooltipText(CString* spText, BOOL bActivate)
  535. {
  536. // 不接受空指针
  537. if (spText == NULL) return;
  538. // 初始化ToolTip
  539. InitToolTip();
  540. // 若没有定义工具提示,则增加
  541. if (m_ToolTip.GetToolCount() == 0)
  542. {
  543. CRect rectBtn; 
  544. GetClientRect(rectBtn);
  545. m_ToolTip.AddTool(this, (LPCTSTR)*spText, rectBtn, 1);
  546. }
  547. // 设置工具提示的文本
  548. m_ToolTip.UpdateTipText((LPCTSTR)*spText, this, 1);
  549. m_ToolTip.Activate(bActivate);
  550. } // End of SetTooltipText
  551. void CButtonST::SetTooltipText(int nId, BOOL bActivate)
  552. {
  553. CString sText;
  554. // 导入字符串资源
  555. sText.LoadString(nId);
  556. // 若字符串资源不为空
  557. if (sText.IsEmpty() == FALSE) SetTooltipText(&sText, bActivate);
  558. } // End of SetTooltipText
  559. void CButtonST::ActivateTooltip(BOOL bActivate)
  560. {
  561. // 若没有工具提示,则返回
  562. if (m_ToolTip.GetToolCount() == 0) return;
  563. // 激活工具提示
  564. m_ToolTip.Activate(bActivate);
  565. } // End of EnableTooltip
  566. BOOL CButtonST::GetDefault()
  567. {
  568. return m_bIsDefault;
  569. } // End of GetDefault
  570. void CButtonST::DrawTransparent()
  571. {
  572. m_bDrawTransparent = TRUE;
  573. } // End of DrawTransparent
  574. void CButtonST::InitToolTip()
  575. {
  576. if (m_ToolTip.m_hWnd == NULL)
  577. {
  578. // 创建工具提示控件
  579. m_ToolTip.Create(this);
  580. m_ToolTip.Activate(FALSE);
  581. }
  582. } // End of InitToolTip
  583. void CButtonST::PaintBk(CDC * pDC)
  584. {
  585. CClientDC clDC(GetParent());
  586. CRect rect;
  587. CRect rect1;
  588. GetClientRect(rect);
  589. GetWindowRect(rect1);
  590. GetParent()->ScreenToClient(rect1);
  591. if (m_dcBk.m_hDC == NULL)
  592. {
  593. m_dcBk.CreateCompatibleDC(&clDC);
  594. m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
  595. m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
  596. m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);
  597. }
  598. pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
  599. } // End of PaintBk
  600. #undef ST_USE_MEMDC
  601. #undef ST_LIKEIE