SkinSliderCtrl.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. // SkinSliderCtrl.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SkinUI.h"
  5. #include "SkinSliderCtrl.h"
  6. // CSkinSliderCtrl
  7. IMPLEMENT_DYNAMIC(CSkinSliderCtrl, CSliderCtrl)
  8. CSkinSliderCtrl::CSkinSliderCtrl()
  9. {
  10. m_pBackImg = m_pThumImg = m_pDisImg = m_pBtImg = m_pTraceImg = NULL;
  11. m_bPress = m_bHover = m_bMouseTracking = FALSE;
  12. m_bDragging = false;
  13. m_rcThumRect.SetRect(0,0,0,0);
  14. m_szThum.SetSize(0,0);
  15. }
  16. CSkinSliderCtrl::~CSkinSliderCtrl()
  17. {
  18. }
  19. BEGIN_MESSAGE_MAP(CSkinSliderCtrl, CSliderCtrl)
  20. ON_WM_PAINT()
  21. ON_WM_DESTROY()
  22. ON_WM_MOUSEMOVE()
  23. ON_WM_LBUTTONDOWN()
  24. ON_WM_LBUTTONUP()
  25. ON_WM_ERASEBKGND()
  26. ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
  27. END_MESSAGE_MAP()
  28. BOOL CSkinSliderCtrl::SetBackImage( LPCTSTR lpszFileName,bool bFixed/* = true*/ )
  29. {
  30. RenderEngine->RemoveImage(m_pBackImg);
  31. m_pBackImg = RenderEngine->GetImage(lpszFileName);
  32. if (NULL == m_pBackImg)
  33. return FALSE;
  34. else
  35. {
  36. if(bFixed) SetWindowPos(NULL,0,0,m_pBackImg->GetWidth(),m_pBackImg->GetHeight(),SWP_NOMOVE);
  37. return TRUE;
  38. }
  39. }
  40. BOOL CSkinSliderCtrl::SetThumImage( LPCTSTR lpszFileName )
  41. {
  42. RenderEngine->RemoveImage(m_pThumImg);
  43. m_pThumImg = RenderEngine->GetImage(lpszFileName);
  44. if (NULL == m_pThumImg)
  45. return FALSE;
  46. else
  47. {
  48. m_szThum.SetSize(m_pThumImg->GetWidth(),m_pThumImg->GetHeight());
  49. m_rcThumRect.SetRect(0,0,m_szThum.cx,m_szThum.cy);
  50. SetThumbRect();
  51. SetChannelRect();
  52. return TRUE;
  53. }
  54. }
  55. BOOL CSkinSliderCtrl::SetDisImage( LPCTSTR lpszFileName )
  56. {
  57. RenderEngine->RemoveImage(m_pDisImg);
  58. m_pDisImg = RenderEngine->GetImage(lpszFileName);
  59. if (NULL == m_pDisImg)
  60. return FALSE;
  61. else
  62. return TRUE;
  63. }
  64. BOOL CSkinSliderCtrl::SetTraceImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
  65. {
  66. RenderEngine->RemoveImage(m_pTraceImg);
  67. m_pTraceImg = RenderEngine->GetImage(lpszFileName);
  68. if (NULL == m_pTraceImg)
  69. return FALSE;
  70. else
  71. {
  72. m_pTraceImg->SetNinePart(lprcNinePart);
  73. return TRUE;
  74. }
  75. }
  76. BOOL CSkinSliderCtrl::SetButtonImage( LPCTSTR lpszFileName )
  77. {
  78. RenderEngine->RemoveImage(m_pBtImg);
  79. m_pBtImg = RenderEngine->GetImage(lpszFileName);
  80. if (NULL == m_pBtImg)
  81. return FALSE;
  82. else
  83. {
  84. m_szThum.SetSize(m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
  85. m_rcThumRect.SetRect(0,0,m_szThum.cx,m_szThum.cy);
  86. SetThumbRect();
  87. SetChannelRect();
  88. return TRUE;
  89. }
  90. }
  91. // CSkinSliderCtrl 消息处理程序
  92. void CSkinSliderCtrl::OnDestroy()
  93. {
  94. CSliderCtrl::OnDestroy();
  95. RenderEngine->RemoveImage(m_pBackImg);
  96. RenderEngine->RemoveImage(m_pThumImg);
  97. RenderEngine->RemoveImage(m_pDisImg);
  98. RenderEngine->RemoveImage(m_pBtImg);
  99. RenderEngine->RemoveImage(m_pTraceImg);
  100. }
  101. void CSkinSliderCtrl::OnPaint()
  102. {
  103. CPaintDC dc(this); // device context for painting
  104. CRect rcClient;
  105. GetClientRect(&rcClient);
  106. CMemoryDC MemDC(&dc, rcClient);
  107. //绘制背景
  108. DrawParentWndBg(GetSafeHwnd(),MemDC->GetSafeHdc());
  109. //绘制轨迹
  110. if ( !IsWindowEnabled() )
  111. {
  112. if (m_pDisImg != NULL && !m_pDisImg->IsNull())
  113. {
  114. m_pDisImg->DrawImage(&MemDC,0,0);
  115. }
  116. }
  117. else
  118. {
  119. if (m_pBackImg != NULL && !m_pBackImg->IsNull())
  120. {
  121. m_pBackImg->DrawImage(&MemDC,0,0);
  122. }
  123. }
  124. //绘制痕迹
  125. if (m_pTraceImg != NULL && !m_pTraceImg->IsNull())
  126. {
  127. m_pTraceImg->Draw(&MemDC,CRect(0, 0,m_rcThumRect.left,m_pTraceImg->GetHeight()));
  128. }
  129. //绘制滑块
  130. if (m_pThumImg != NULL && !m_pThumImg->IsNull())
  131. {
  132. m_pThumImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top);
  133. }
  134. //绘制按钮
  135. if (m_pBtImg != NULL && !m_pBtImg->IsNull())
  136. {
  137. if( m_bPress )
  138. m_pBtImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top,m_szThum.cx,m_szThum.cy,m_szThum.cx*2,0,m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
  139. else if ( m_bHover )
  140. m_pBtImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top,m_szThum.cx,m_szThum.cy,m_szThum.cx,0,m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
  141. else
  142. m_pBtImg->DrawImage(&MemDC,m_rcThumRect.left, m_rcThumRect.top,m_szThum.cx,m_szThum.cy,0,0,m_pBtImg->GetWidth()/3,m_pBtImg->GetHeight());
  143. }
  144. }
  145. void CSkinSliderCtrl::OnMouseMove(UINT nFlags, CPoint point)
  146. {
  147. if( m_bDragging )
  148. {
  149. int nMax = 0;
  150. int nMin = 0;
  151. GetRange(nMin,nMax);
  152. int nPos = 0;
  153. if ( GetStyle() & TBS_VERT )
  154. nPos = (nMax - nMin)*(point.y)/m_rcChannelRect.Height();
  155. else
  156. nPos = (nMax - nMin)*(point.x)/m_rcChannelRect.Width();
  157. SetPos(nPos);
  158. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  159. }
  160. //按钮事件
  161. if ( PtInRect(m_rcThumRect,point) && !m_bMouseTracking )
  162. {
  163. TrackMouseLeave(GetSafeHwnd());
  164. m_bMouseTracking = TRUE;
  165. m_bHover = TRUE;
  166. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  167. }
  168. __super::OnMouseMove(nFlags, point);
  169. }
  170. //鼠标离开消息
  171. LRESULT CSkinSliderCtrl::OnMouseLeave(WPARAM wparam, LPARAM lparam)
  172. {
  173. m_bMouseTracking = FALSE;
  174. m_bHover = FALSE;
  175. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  176. return 0;
  177. }
  178. void CSkinSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  179. {
  180. if ( PtInRect(&m_rcThumRect,point) )
  181. {
  182. m_bDragging = true;
  183. m_bPress = TRUE;
  184. SetCapture();
  185. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  186. }
  187. else
  188. {
  189. if ( PtInRect(&m_rcChannelRect,point) )
  190. {
  191. int nMax = 0;
  192. int nMin = 0;
  193. GetRange(nMin,nMax);
  194. int nPos = 0;
  195. if ( GetStyle() & TBS_VERT )
  196. nPos = (nMax - nMin)*(point.y - m_rcChannelRect.top)/m_rcChannelRect.Height();
  197. else
  198. nPos = (nMax - nMin)*(point.x - m_rcChannelRect.left)/m_rcChannelRect.Width();
  199. OutputString(TEXT("Down:%d\n"),nPos);
  200. nPos += nMin;
  201. SetPos(nPos);
  202. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  203. return;
  204. }
  205. }
  206. __super::OnLButtonDown(nFlags, point);
  207. }
  208. void CSkinSliderCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  209. {
  210. if ( PtInRect(&m_rcThumRect,point) && m_bPress) m_bPress = FALSE;
  211. m_bDragging = false;
  212. ReleaseCapture();
  213. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  214. __super::OnLButtonUp(nFlags, point);
  215. }
  216. BOOL CSkinSliderCtrl::OnEraseBkgnd(CDC* pDC)
  217. {
  218. return TRUE;
  219. }
  220. void CSkinSliderCtrl::SetThumbRect(int nPos)
  221. {
  222. CRect rcClient;
  223. GetClientRect(&rcClient);
  224. //判断是否横竖控件
  225. if ( GetStyle() & TBS_VERT )
  226. {
  227. m_rcThumRect.left = (rcClient.Width()-m_szThum.cx)/2;
  228. m_rcThumRect.top = nPos;
  229. }
  230. else
  231. {
  232. m_rcThumRect.left = nPos;
  233. m_rcThumRect.top = (rcClient.Height()-m_szThum.cy)/2;
  234. }
  235. m_rcThumRect.right = m_rcThumRect.left+m_szThum.cx;
  236. m_rcThumRect.bottom = m_rcThumRect.top+m_szThum.cy;
  237. }
  238. void CSkinSliderCtrl::SetPos( int nPos )
  239. {
  240. int nMin,nMax;
  241. GetRange(nMin,nMax);
  242. //重新定位,防止超出客户区
  243. if( nPos <= nMin ) nPos = nMin;
  244. if ( nPos >= nMax ) nPos = nMax;
  245. __super::SetPos(nPos);
  246. int nPosNew = 0;
  247. if ( GetStyle() & TBS_VERT )
  248. nPosNew = m_rcChannelRect.Height()*nPos/(nMax-nMin);
  249. else
  250. nPosNew = m_rcChannelRect.Width()*nPos/(nMax-nMin);
  251. if( nPosNew<0 ) nPosNew = 0;
  252. SetThumbRect(nPosNew);
  253. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  254. }
  255. void CSkinSliderCtrl::SetChannelRect()
  256. {
  257. CRect rcClient;
  258. GetClientRect(&rcClient);
  259. //设置轨迹区域
  260. if ( GetStyle() & TBS_VERT )
  261. m_rcChannelRect.SetRect(0,m_szThum.cy/2,rcClient.Width(),rcClient.Height()-m_szThum.cy/2);
  262. else
  263. m_rcChannelRect.SetRect(m_szThum.cx/2,0,rcClient.Width()-m_szThum.cx/2,rcClient.Height());
  264. }
  265. void CSkinSliderCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  266. {
  267. ISkinControl::SetAttribute(pstrName,pstrValue);
  268. if( _tcscmp(pstrName, _T("bkimage")) == 0 )
  269. {
  270. SetBackImage(pstrValue);
  271. }
  272. else if( _tcscmp(pstrName, _T("thumimage")) == 0 )
  273. {
  274. SetThumImage(pstrValue);
  275. }
  276. else if( _tcscmp(pstrName, _T("buttonimage")) == 0 )
  277. {
  278. SetButtonImage(pstrValue);
  279. }
  280. else if( _tcscmp(pstrName, _T("traceimage")) == 0 )
  281. {
  282. SetTraceImage(pstrValue);
  283. }
  284. else if( _tcscmp(pstrName, _T("disimage")) == 0 )
  285. {
  286. SetDisImage(pstrValue);
  287. }
  288. else if( _tcscmp(pstrName, _T("range")) == 0 )
  289. {
  290. LPTSTR pstr = NULL;
  291. int cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  292. int cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  293. SetRange(cx,cy);
  294. }
  295. else if( _tcscmp(pstrName, _T("vertical")) == 0 )
  296. {
  297. if( _tcscmp(pstrValue, _T("true")) == 0 ) ModifyStyle(0,TBS_VERT);
  298. }
  299. else if( _tcscmp(pstrName, _T("value")) == 0 )
  300. {
  301. SetPos(_ttoi(pstrValue));
  302. }
  303. else if( _tcscmp(pstrName, _T("tic")) == 0 )
  304. {
  305. SetTic(_ttoi(pstrValue));
  306. }
  307. else if( _tcscmp(pstrName, _T("ticfreq")) == 0 )
  308. {
  309. SetTicFreq(_ttoi(pstrValue));
  310. }
  311. }
  312. BOOL CSkinSliderCtrl::CreateControl( CWnd* pParentWnd )
  313. {
  314. if( !Create(WS_CHILD|WS_VISIBLE|TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,CRect(0,0,0,0),pParentWnd,0) )
  315. return FALSE;
  316. m_pOwnWnd = this;
  317. return TRUE;
  318. }