XPSliderCtrl.cpp
上传用户:chly668
上传日期:2010-03-08
资源大小:3k
文件大小:7k
源码类别:

状态条

开发平台:

C/C++

  1. // XPSliderCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Recorder.h"
  5. #include "XPSliderCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CXPSliderCtrl
  13. CXPSliderCtrl::CXPSliderCtrl()
  14. {
  15. bFocus = FALSE;
  16. m_bFlagChanelHeit = FALSE;
  17. m_bFlagChanelLen = FALSE;
  18. m_bFlagThumbWid = FALSE;
  19. m_bFlagThumbHeit = FALSE;
  20. m_iChanelLeft = 0;
  21. m_iChanelRight = 0;
  22. m_iChanelBottom = 0;
  23. m_iChanelTop = 0;
  24. m_iThumWid = 0;
  25. m_iThumHeit = 0;
  26. pBackBrush.CreateSolidBrush(RGB(192, 192, 192));
  27. pSelBackBrush.CreateSolidBrush(RGB(160, 160, 192));
  28. nSelThumbPen.CreatePen(PS_SOLID, 1, RGB(166, 202, 240));
  29. nUnselThumbPen.CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
  30. nDarkPen.CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
  31. nGreyBrush.CreateSolidBrush(RGB(204, 204, 204));
  32. m_WhitBrush.CreateSolidBrush(RGB(255, 255, 255));
  33. nLastRect.top = nLastRect.left = nLastRect.right = nLastRect.bottom = 0;
  34. }
  35. CXPSliderCtrl::~CXPSliderCtrl()
  36. {
  37. m_BMPChanel.DeleteObject();
  38. m_BMPThumb.DeleteObject();
  39. pBackBrush.DeleteObject();
  40. pSelBackBrush.DeleteObject();
  41. nSelThumbPen.DeleteObject();
  42. nUnselThumbPen.DeleteObject();
  43. nDarkPen.DeleteObject();
  44. nGreyBrush.DeleteObject();
  45. m_WhitBrush.DeleteObject();
  46. }
  47. BEGIN_MESSAGE_MAP(CXPSliderCtrl, CSliderCtrl)
  48. //{{AFX_MSG_MAP(CXPSliderCtrl)
  49. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
  50. ON_WM_KILLFOCUS()
  51. ON_WM_SETFOCUS()
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CXPSliderCtrl message handlers
  56. void CXPSliderCtrl::DrawChannel(CDC *pDC, CRect pRect)
  57. {
  58. HDC tempDC = ::CreateCompatibleDC(pDC->m_hDC);
  59. ::SelectObject(tempDC, m_BMPChanel.m_hObject);
  60. ::BitBlt(pDC->m_hDC, pRect.left, pRect.top, pRect.right, pRect.bottom, tempDC, 0, 0, SRCCOPY);
  61. ::DeleteDC(tempDC);
  62. Invalidate();
  63. }
  64. void CXPSliderCtrl::DrawInactiveDC()
  65. {
  66. }
  67. void CXPSliderCtrl::DrawActiveDC()
  68. {
  69. }
  70. void CXPSliderCtrl::DrawHorizontalThumb(CDC *pDC, CRect rect, BOOL hasFocus)
  71. {
  72. }
  73. void CXPSliderCtrl::DrawVerticalThumb(CDC *pDC, CRect pRect, BOOL hasFocus)
  74. {
  75. HDC tempDC = ::CreateCompatibleDC(pDC->m_hDC);
  76. ::SelectObject(tempDC, m_BMPThumb.m_hObject);
  77. ::TransparentBlt(pDC->m_hDC, 
  78. pRect.left, 
  79. pRect.top,
  80. pRect.right - pRect.left, 
  81. pRect.bottom - pRect.top,
  82. tempDC,
  83. 0, 
  84. 0, 
  85. pRect.right - pRect.left, 
  86. pRect.bottom - pRect.top, 
  87. RGB(255, 0, 255));
  88. // ::BitBlt(pDC->m_hDC, pRect.left, pRect.top, pRect.right, pRect.bottom, tempDC, 0, 0, SRCCOPY);
  89. ::DeleteDC(tempDC);
  90. Invalidate();
  91. }
  92. void CXPSliderCtrl::OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) 
  93. {
  94. // TODO: Add your control notification handler code here
  95. LPNMCUSTOMDRAW lpcd = (LPNMCUSTOMDRAW)pNMHDR;
  96. if (lpcd->dwDrawStage == CDDS_PREPAINT)
  97. {
  98. // Request prepaint notifications for each item.
  99. *pResult = CDRF_NOTIFYITEMDRAW;      
  100. return;
  101. }
  102. if (lpcd->dwDrawStage == CDDS_ITEMPREPAINT)
  103. {
  104. CDC *pDC = CDC::FromHandle(lpcd->hdc);
  105. CRect rect(lpcd->rc);
  106. int nSavedDC = pDC->SaveDC();
  107. if (lpcd->dwItemSpec == TBCD_TICS)
  108. {
  109. *pResult = CDRF_DODEFAULT;
  110. return;
  111. } // if drawing tics
  112. else if (lpcd->dwItemSpec == TBCD_THUMB)
  113. {
  114. RECT CtrlRect;
  115. CRect RectTemp(0, 0, m_RectCtrl.Width(), m_RectCtrl.Height());
  116. *pResult = CDRF_SKIPDEFAULT;
  117. pDC->FillRect(RectTemp,&m_WhitBrush);
  118. CRect TempChanel(m_iChanelLeft, m_iChanelTop, m_iChanelRight, m_iChanelBottom);
  119. ::GetClientRect(this->m_hWnd, &CtrlRect);
  120. if (rect.Height() > rect.Width())
  121. {
  122. if (m_bFlagThumbHeit) 
  123. {
  124. rect.top = (CtrlRect.bottom - CtrlRect.top - m_iThumHeit) / 2;
  125. }
  126. if (!m_bFlagThumbWid) 
  127. {
  128. DrawChannel(pDC, TempChanel);
  129. DrawVerticalThumb(pDC, rect, bFocus);
  130. return;
  131. }
  132. if (rect.left < (m_iThumWid - m_RectThumb.Width()) / 2)     //超出左边界
  133. {
  134. rect.left = 0;
  135. rect.right = m_iThumWid;
  136. }
  137. else if (rect.right + (m_iThumWid - m_RectThumb.Width()) / 2 > CtrlRect.right - CtrlRect.left)   //超出右边界
  138. {
  139. rect.left = CtrlRect.right - m_iThumWid;
  140. rect.right = CtrlRect.right;
  141. }
  142. else
  143. {
  144. rect.left -= (m_iThumWid - m_RectThumb.Width()) / 2;
  145. rect.right = rect.left + m_iThumWid;
  146. }
  147. DrawChannel(pDC, TempChanel);
  148. DrawVerticalThumb(pDC, rect, bFocus);
  149. }
  150. else
  151. {
  152. DrawHorizontalThumb(pDC, rect, bFocus);
  153. }
  154. return;
  155. }
  156. else if (lpcd->dwItemSpec == TBCD_CHANNEL)
  157. {
  158. *pResult = CDRF_SKIPDEFAULT;
  159. CRect RectTemp(0, 0, m_RectCtrl.Width(), m_RectCtrl.Height());
  160. pDC->FillRect(RectTemp, &m_WhitBrush);
  161. if (m_bFlagChanelLen) 
  162. {
  163. rect.left = m_iChanelLeft;
  164. rect.right = m_iChanelRight;
  165. }
  166. if (m_bFlagChanelHeit) 
  167. {
  168. rect.top = m_iChanelTop;
  169. rect.bottom = m_iChanelBottom;
  170. }
  171. DrawChannel(pDC, rect);
  172. return;
  173. }
  174. }
  175. *pResult = 0;
  176. }
  177. void CXPSliderCtrl::OnKillFocus(CWnd* pNewWnd) 
  178. {
  179. CSliderCtrl::OnKillFocus(pNewWnd);
  180. // TODO: Add your message handler code here
  181. bFocus = TRUE;
  182. Invalidate();
  183. }
  184. void CXPSliderCtrl::OnSetFocus(CWnd* pOldWnd) 
  185. {
  186. CSliderCtrl::OnSetFocus(pOldWnd);
  187. // TODO: Add your message handler code here
  188. bFocus = FALSE;
  189. Invalidate();
  190. }
  191. //DEL void CXPSliderCtrl::SetChanelSiz(int iLen, int iHeit)
  192. //DEL {
  193. //DEL  RECT CtrlRect;
  194. //DEL  ::GetClientRect(this->m_hWnd, &CtrlRect);
  195. //DEL  if (iLen < CtrlRect.right - CtrlRect.left) 
  196. //DEL  {
  197. //DEL  m_iChanelLeft = (CtrlRect.right - CtrlRect.left) / 2;
  198. //DEL  m_iChanelRight = m_iChanelLeft + iLen;
  199. //DEL  m_bFlagChanelLen = TRUE;
  200. //DEL  }
  201. //DEL  if (iHeit < CtrlRect.bottom - CtrlRect.top) 
  202. //DEL  {
  203. //DEL  m_iChanelTop = (CtrlRect.top - CtrlRect.bottom) / 2;
  204. //DEL  m_iChanelBottom = m_iChanelTop + iHeit;
  205. //DEL  m_bFlagChanelHeit = TRUE;
  206. //DEL  }
  207. //DEL  return;
  208. //DEL }
  209. void CXPSliderCtrl::InitialSiz(UINT nIDBMPChannel, UINT nIDBMPThumb, int iChanelHeit, int iChanelWid, int iThumbHeit, int iThumbWid)
  210. {
  211. RECT CtrlRect;
  212. CRect TempRect;
  213. m_BMPChanel.LoadBitmap(nIDBMPChannel);
  214. m_BMPThumb.LoadBitmap(nIDBMPThumb);
  215. GetThumbRect(&m_RectThumb);
  216. GetChannelRect(&m_RectChanel);
  217. GetWindowRect(&m_RectCtrl);
  218. ::GetClientRect(this->m_hWnd, &CtrlRect);
  219. if (iChanelWid < CtrlRect.right - CtrlRect.left) 
  220. {
  221. m_iChanelLeft = (CtrlRect.right - CtrlRect.left - iChanelWid) / 2;
  222. m_iChanelRight = m_iChanelLeft + iChanelWid;
  223. m_bFlagChanelLen = TRUE;
  224. }
  225. if (iChanelHeit < CtrlRect.bottom - CtrlRect.top) 
  226. {
  227. m_iChanelTop = (CtrlRect.bottom - CtrlRect.top - iChanelHeit) / 2;
  228. m_iChanelBottom = m_iChanelTop + iChanelHeit;
  229. m_bFlagChanelHeit = TRUE;
  230. }
  231. if (iThumbWid < (CtrlRect.right - CtrlRect.left) / 2)
  232. {
  233. m_bFlagThumbWid = TRUE;
  234. m_iThumWid = iThumbWid;
  235. }
  236. if (iThumbHeit < (CtrlRect.bottom - CtrlRect.top)) 
  237. {
  238. m_bFlagThumbHeit = TRUE;
  239. m_iThumHeit = iThumbHeit;
  240. }
  241. }