SkinButton.cpp
上传用户:xuzhiwei76
上传日期:2022-07-10
资源大小:2k
文件大小:4k
源码类别:

按钮控件

开发平台:

Visual C++

  1. // SkinButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyPlayer.h"
  5. #include "SkinButton.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define TIP_ID  1
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CSkinButton
  14. CSkinButton::CSkinButton()
  15. {
  16. }
  17. CSkinButton::~CSkinButton()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CSkinButton, CButton)
  21. //{{AFX_MSG_MAP(CSkinButton)
  22. ON_WM_SETCURSOR()
  23. ON_WM_MOUSEMOVE()
  24. ON_WM_TIMER()
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CSkinButton message handlers
  29. void CSkinButton::Init(UINT nNormalID, UINT nMouseOverID,CString strTipText)
  30. {
  31.   m_nNormalID=nNormalID;
  32.   m_nMouseOverID=nMouseOverID;
  33.   m_ToolTip.UpdateTipText(strTipText,this,TIP_ID);
  34.   pWndParent=this->GetParent();
  35.   AdjustPosition();
  36.   m_bMouseOver=FALSE;
  37.   
  38.   Invalidate();
  39. }
  40. void CSkinButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  41. {
  42. // TODO: Add your code to draw the specified item
  43. UINT nID;
  44. CDC*pDC;
  45. pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
  46. UINT nState=lpDrawItemStruct->itemState;
  47.     if(m_bMouseOver&&(!(nState & ODS_SELECTED)))
  48. nID=m_nMouseOverID;
  49. else
  50. nID=m_nNormalID;
  51.     
  52. CBitmap bitmap;
  53. BITMAP m_Bitmap;
  54. CDC MemDC;
  55. bitmap.LoadBitmap(nID);
  56. MemDC.CreateCompatibleDC(pDC);
  57. MemDC.SelectObject(&bitmap);
  58. bitmap.GetBitmap(&m_Bitmap);
  59. pDC->BitBlt(0,0,m_Bitmap.bmWidth,m_Bitmap.bmHeight,&MemDC,0,0,SRCCOPY);
  60. bitmap.DeleteObject();
  61. MemDC.DeleteDC();
  62. }
  63. BOOL CSkinButton::SetButtonCursor(HCURSOR hCursor)
  64. {
  65. m_hCursor=hCursor;
  66. if(m_hCursor==NULL){
  67. SetDefaultCursor();
  68. return FALSE;
  69. }
  70. return TRUE;
  71. }
  72. void CSkinButton::SetDefaultCursor()
  73. {
  74. m_hCursor=LoadCursor(NULL,MAKEINTRESOURCE(32649));
  75. }
  76. void CSkinButton::SetToolTipText(CString strText)
  77. {
  78. m_ToolTip.UpdateTipText(strText,this,TIP_ID);
  79. }
  80. BOOL CSkinButton::SetBitmap(UINT nNormalID, UINT nMouseOverID)
  81. {
  82. m_nNormalID=nNormalID;
  83. m_nMouseOverID=nMouseOverID;
  84. AdjustPosition();
  85. Invalidate();
  86. return TRUE;
  87. }
  88. void CSkinButton::PreSubclassWindow() 
  89. {
  90. // TODO: Add your specialized code here and/or call the base class
  91. SetDefaultCursor();
  92. CRect rect;
  93. GetClientRect(&rect);
  94. m_ToolTip.Create(this);
  95. m_ToolTip.SetDelayTime(100);
  96. m_ToolTip.SetMaxTipWidth(200);
  97. m_ToolTip.AddTool(this,"",rect,TIP_ID);
  98. CButton::PreSubclassWindow();
  99. }
  100. BOOL CSkinButton::PreTranslateMessage(MSG* pMsg) 
  101. {
  102. // TODO: Add your specialized code here and/or call the base class
  103. m_ToolTip.RelayEvent(pMsg);
  104. return CButton::PreTranslateMessage(pMsg);
  105. }
  106. BOOL CSkinButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  107. {
  108. // TODO: Add your message handler code here and/or call default
  109. if (m_hCursor)  //如果设置了光标,就使用新设置的 光标
  110.     {
  111. ::SetCursor(m_hCursor);
  112.         return TRUE;
  113.     }
  114. return FALSE;
  115. }
  116. void CSkinButton::OnMouseMove(UINT nFlags, CPoint point) 
  117. {
  118. // TODO: Add your message handler code here and/or call default
  119. m_bMouseOver=TRUE;
  120. SetTimer(1,100,NULL);
  121. Invalidate();
  122. OnTimer(1);
  123. CButton::OnMouseMove(nFlags, point);
  124. }
  125. void CSkinButton::OnTimer(UINT nIDEvent) 
  126. {
  127. // TODO: Add your message handler code here and/or call default
  128. POINT point;
  129. GetCursorPos(&point);
  130. ScreenToClient(&point);
  131. CRect rect;
  132. GetClientRect(&rect);
  133. if(!rect.PtInRect(point)){
  134. KillTimer(1);
  135. m_bMouseOver=FALSE;
  136. Invalidate();
  137. }
  138. CButton::OnTimer(nIDEvent);
  139. }
  140. void CSkinButton::AdjustPosition()
  141. {
  142. CBitmap bitmap;
  143. BITMAP m_Bitmap;
  144. CRect rect;
  145. bitmap.LoadBitmap(m_nNormalID);
  146. bitmap.GetBitmap(&m_Bitmap);
  147.    GetWindowRect(&rect);//根据图象的大小调整按钮大小
  148. pWndParent->ScreenToClient(&rect);
  149. rect.right=rect.left+m_Bitmap.bmWidth;
  150. rect.bottom=rect.top+m_Bitmap.bmHeight;
  151. MoveWindow(&rect,TRUE);
  152. }