ExtSliderWnd.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:11k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #if (!defined __EXT_MFC_NO_SLIDER)
  23. #if (!defined __EXT_SLIDER_H)
  24. #include <ExtSliderWnd.h>
  25. #endif
  26. #if (!defined __EXT_MEMORY_DC_H)
  27. #include <../Src/ExtMemoryDC.h>
  28. #endif
  29. #if (!defined __EXT_PAINT_MANAGER_H)
  30. #include <ExtPaintManager.h>
  31. #endif
  32. #if (!defined __ExtCmdManager_H)
  33. #include <ExtCmdManager.h>
  34. #endif
  35. #ifdef _DEBUG
  36. #define new DEBUG_NEW
  37. #undef THIS_FILE
  38. static char THIS_FILE[] = __FILE__;
  39. #endif
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CExtSliderWnd
  42. IMPLEMENT_DYNCREATE( CExtSliderWnd, CSliderCtrl );
  43. IMPLEMENT_CExtPmBridge_MEMBERS( CExtSliderWnd );
  44. CExtSliderWnd::CExtSliderWnd()
  45. : m_eStyle( ES_SYSTEM )
  46. , m_clrBackground( COLORREF(-1L) )
  47. , m_clrBackgroundPrev( COLORREF(-1L) )
  48. {
  49. PmBridge_Install();
  50. }
  51. CExtSliderWnd::~CExtSliderWnd()
  52. {
  53. PmBridge_Uninstall();
  54. if( m_brBack.GetSafeHandle() != NULL )
  55. m_brBack.DeleteObject();
  56. }
  57. BEGIN_MESSAGE_MAP(CExtSliderWnd, CSliderCtrl)
  58. //{{AFX_MSG_MAP(CExtSliderWnd)
  59. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)
  60. ON_WM_ERASEBKGND()
  61. ON_WM_CTLCOLOR_REFLECT()
  62. //}}AFX_MSG_MAP
  63. ON_WM_SYSCOLORCHANGE()
  64. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  65. ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
  66. ON_MESSAGE(__ExtMfc_WM_THEMECHANGED, OnThemeChanged)
  67. END_MESSAGE_MAP()
  68. COLORREF CExtSliderWnd::SetBkColor( COLORREF clrBk )
  69. ASSERT_VALID( this );
  70. COLORREF clrBkOld = m_clrBackground;
  71. m_clrBackground = clrBk; 
  72. if( GetSafeHwnd() != NULL )
  73. UpdateSliderWnd();
  74. return clrBkOld;
  75. }
  76. COLORREF CExtSliderWnd::GetBkColor() const
  77. ASSERT_VALID( this );
  78. return m_clrBackground; 
  79. }
  80. void CExtSliderWnd::SetStyle( e_style_t eStyle )
  81. {
  82. ASSERT_VALID( this );
  83. m_eStyle = eStyle;
  84. if( GetSafeHwnd() != NULL )
  85. UpdateSliderWnd();
  86. }
  87. CExtSliderWnd::e_style_t CExtSliderWnd::GetStyle() const
  88. {
  89. ASSERT_VALID( this );
  90. return m_eStyle;
  91. }
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CExtSliderWnd message handlers
  94. BOOL CExtSliderWnd::OnEraseBkgnd(CDC* pDC) 
  95. {
  96. ASSERT_VALID( this );
  97. pDC;
  98. return FALSE;
  99. }
  100. HBRUSH CExtSliderWnd::CtlColor(CDC* pDC, UINT nCtlColor) 
  101. {
  102. ASSERT_VALID( this );
  103. if( nCtlColor == CTLCOLOR_STATIC )
  104. {
  105. COLORREF clrBk = GetBkColor();
  106. CRect rcClient;
  107. GetClientRect( &rcClient );
  108. CBitmap bmpGradient;
  109. if( bmpGradient.CreateCompatibleBitmap( 
  110. pDC, 
  111. rcClient.Width(), 
  112. rcClient.Height() 
  113. )
  114. {
  115. CBitmap * pBmpOld = pDC->SelectObject( &bmpGradient );
  116. bool bTransparent = false;
  117. if( PmBridge_GetPM()->GetCb2DbTransparentMode( this )
  118. && ( clrBk == COLORREF(-1L) )
  119. )
  120. {
  121. CExtPaintManager::stat_ExcludeChildAreas(
  122. *pDC,
  123. GetSafeHwnd(),
  124. CExtPaintManager::stat_DefExcludeChildAreaCallback
  125. );
  126. if( PmBridge_GetPM()->PaintDockerBkgnd( true, *pDC, this ) )
  127. bTransparent = true;
  128. }
  129. pDC->SelectObject( pBmpOld );
  130. if( bTransparent )
  131. {
  132. if( m_brBack.GetSafeHandle() != NULL )
  133. m_brBack.DeleteObject();
  134. if( m_brBack.CreatePatternBrush( &bmpGradient ) )
  135. {
  136. m_clrBackgroundPrev = NULL;
  137. return m_brBack;
  138. }
  139. }
  140. }
  141. if( clrBk == COLORREF(-1L) )
  142. clrBk = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_3DFACE_OUT, this );
  143. if( m_clrBackgroundPrev != clrBk )
  144. {
  145. if( m_brBack.GetSafeHandle() != NULL )
  146. m_brBack.DeleteObject();
  147. m_brBack.CreateSolidBrush( clrBk );
  148. m_clrBackgroundPrev = clrBk;
  149. }
  150. return m_brBack;
  151. }
  152. else
  153. return (HBRUSH)Default();
  154. }
  155. LRESULT CExtSliderWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  156. {
  157. #if (defined WM_UPDATEUISTATE)
  158. ASSERT( WM_UPDATEUISTATE == 0x0128 );
  159. #endif
  160. // WM_UPDATEUISTATE causes repaint without WM_PAINT, so we eat it
  161. if( message == 0x0128 )
  162. return 0;
  163. if( message == WM_SETTEXT 
  164. || message == WM_ENABLE
  165. )
  166. {
  167. LRESULT lResult = CSliderCtrl::WindowProc(message, wParam, lParam);
  168. Invalidate();
  169. UpdateWindow();
  170. return lResult;
  171. }
  172. return CSliderCtrl::WindowProc(message, wParam, lParam);
  173. }
  174. bool CExtSliderWnd::OnSliderDrawChannel(
  175. CDC & dc,
  176. const CRect & rcChannel,
  177. UINT uItemState
  178. )
  179. {
  180. ASSERT_VALID( this );
  181. ASSERT( dc.GetSafeHdc() != NULL );
  182. uItemState;
  183. if( ! dc.RectVisible( &rcChannel ) )
  184. return false;
  185. if( m_eStyle != ES_PROFUIS )
  186. return false;
  187. DWORD dwStyle = CWnd::GetStyle();
  188. bool bEnabled = 
  189. IsWindowEnabled() 
  190. ? true
  191. : false;
  192. bool bHorz = 
  193. (dwStyle&TBS_VERT) != 0 
  194. ? false
  195. : true;
  196. return 
  197. PmBridge_GetPM()->PaintSliderChannel( 
  198. dc, 
  199. rcChannel,
  200. bHorz,
  201. bEnabled,
  202. this
  203. );
  204. }
  205. bool CExtSliderWnd::OnSliderDrawThumb(
  206. CDC & dc,
  207. const CRect & rcThumb,
  208. UINT uItemState
  209. )
  210. {
  211. ASSERT_VALID( this );
  212. ASSERT( dc.GetSafeHdc() != NULL );
  213. if( ! dc.RectVisible( &rcThumb ) )
  214. return false;
  215. if( m_eStyle != ES_PROFUIS )
  216. return false;
  217. DWORD dwStyle = CWnd::GetStyle();
  218. if( (dwStyle&TBS_NOTHUMB) != NULL )
  219. return false;
  220. bool bHorz = 
  221. (dwStyle&TBS_VERT) != 0 
  222. ? false
  223. : true;
  224. bool bLeft = 
  225. (dwStyle&TBS_LEFT) != 0 
  226. ? true
  227. : false;
  228. bool bRight = 
  229. (dwStyle&TBS_LEFT) == 0 
  230. ? true
  231. : false;
  232. if( (dwStyle&TBS_BOTH) != 0 )
  233. {
  234. bLeft = true;
  235. bRight = true;
  236. }
  237. bool bPushed = 
  238. (uItemState&CDIS_SELECTED) != 0 
  239. ? true
  240. : false;
  241. //  bool bFocused = 
  242. //  (uItemState&CDIS_FOCUS) != 0 
  243. //  ? true
  244. //  : false;
  245. bool bFocused = 
  246. ( GetFocus() == this )
  247. ? true
  248. : false;
  249. bool bEnabled = 
  250. IsWindowEnabled() 
  251. ? true
  252. : false;
  253. CPoint ptCursor( 0, 0 );
  254. ::GetCursorPos( &ptCursor );
  255. ScreenToClient( &ptCursor );
  256. bool bHover = 
  257. rcThumb.PtInRect( ptCursor )
  258. ? true
  259. : false;
  260. return 
  261. PmBridge_GetPM()->PaintSliderThumb( 
  262. dc, 
  263. rcThumb,
  264. bHorz,
  265. bLeft,
  266. bRight,
  267. bEnabled,
  268. bPushed,
  269. bFocused,
  270. bHover,
  271. this
  272. );
  273. }
  274. bool CExtSliderWnd::OnSliderDrawTics(
  275. CDC & dc,
  276. const CRect & rcClient,
  277. UINT uItemState
  278. )
  279. {
  280. ASSERT_VALID( this );
  281. ASSERT( dc.GetSafeHdc() != NULL );
  282. uItemState;
  283. if( ! dc.RectVisible( &rcClient ) )
  284. return false;
  285. DWORD dwStyle = CWnd::GetStyle();
  286. if( (dwStyle&TBS_NOTICKS) != 0 )
  287. return false;
  288. bool bEnabled = 
  289. IsWindowEnabled() 
  290. ? true
  291. : false;
  292. bool bHorz = 
  293. (dwStyle&TBS_VERT) != 0 
  294. ? false
  295. : true;
  296. return 
  297. PmBridge_GetPM()->PaintSliderTics( 
  298. dc, 
  299. rcClient,
  300. bHorz,
  301. bEnabled,
  302. this
  303. );
  304. }
  305. void CExtSliderWnd::OnCustomdraw( NMHDR * pNMHDR, LRESULT * pResult ) 
  306. {
  307. LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW)pNMHDR;
  308. CDC * pDC = CDC::FromHandle( lpNMCustomDraw->hdc );
  309. CRect rcPaint( lpNMCustomDraw->rc );
  310. *pResult = CDRF_DODEFAULT;
  311. switch( lpNMCustomDraw->dwDrawStage ) 
  312. {
  313. case CDDS_PREPAINT:
  314. *pResult = CDRF_NOTIFYITEMDRAW;
  315. break;
  316. case CDDS_ITEMPREPAINT:  // Before an item is drawn. This is where we perform our item-specific custom drawing
  317.         if( lpNMCustomDraw->dwItemSpec == TBCD_THUMB )
  318.         {
  319. if( OnSliderDrawThumb(
  320. *pDC,
  321. rcPaint,
  322. lpNMCustomDraw->uItemState
  323. )
  324. *pResult = CDRF_SKIPDEFAULT;
  325.         } 
  326. else if( lpNMCustomDraw->dwItemSpec == TBCD_CHANNEL )
  327.         {
  328. if( OnSliderDrawChannel(
  329. *pDC,
  330. rcPaint,
  331. lpNMCustomDraw->uItemState
  332. )
  333. *pResult = CDRF_SKIPDEFAULT;
  334.         }
  335.   else if( lpNMCustomDraw->dwItemSpec == TBCD_TICS )
  336.         {
  337. CRect rcClient;
  338. GetClientRect( &rcClient );
  339. if( OnSliderDrawTics(
  340. *pDC,
  341. rcClient,
  342. lpNMCustomDraw->uItemState
  343. )
  344. *pResult = CDRF_SKIPDEFAULT;
  345.         }
  346. else
  347. {
  348. ASSERT( FALSE );
  349. }
  350. break;
  351. } // switch
  352. }
  353. void CExtSliderWnd::OnSysColorChange() 
  354. {
  355. ASSERT_VALID( this );
  356. CSliderCtrl::OnSysColorChange();
  357. //CExtPaintManager * pPM = PmBridge_GetPM();
  358. // g_PaintManager.OnSysColorChange( this );
  359. // g_CmdManager.OnSysColorChange( pPM, this );
  360. UpdateSliderWnd();
  361. }
  362. LRESULT CExtSliderWnd::OnDisplayChange( WPARAM wParam, LPARAM lParam )
  363. {
  364. ASSERT_VALID( this );
  365. LRESULT lResult = CSliderCtrl::OnDisplayChange( wParam, lParam );
  366. //CExtPaintManager * pPM = PmBridge_GetPM();
  367. // g_PaintManager.OnDisplayChange( this, (INT)wParam, CPoint(lParam) );
  368. // g_CmdManager.OnDisplayChange( pPM, this, (INT)wParam, CPoint(lParam) );
  369. UpdateSliderWnd();
  370. return lResult;
  371. }
  372. LRESULT CExtSliderWnd::OnThemeChanged( WPARAM wParam, LPARAM lParam )
  373. {
  374. ASSERT_VALID( this );
  375. wParam;
  376. lParam;
  377. LRESULT lResult = Default();
  378. //CExtPaintManager * pPM = PmBridge_GetPM();
  379. // g_PaintManager.OnThemeChanged( this, wParam, lParam );
  380. // g_CmdManager.OnThemeChanged( pPM, this, wParam, lParam );
  381. return lResult;
  382. }
  383. void CExtSliderWnd::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  384. {
  385. ASSERT_VALID( this );
  386. CSliderCtrl::OnSettingChange(uFlags, lpszSection);
  387. //CExtPaintManager * pPM = PmBridge_GetPM();
  388. // g_PaintManager.OnSettingChange( this, uFlags, lpszSection );
  389. // g_CmdManager.OnSettingChange( pPM, this, uFlags, lpszSection );
  390. UpdateSliderWnd();
  391. }
  392. void CExtSliderWnd::PmBridge_OnPaintManagerChanged(
  393. CExtPaintManager * pGlobalPM
  394. )
  395. {
  396. CExtPmBridge::PmBridge_OnPaintManagerChanged( pGlobalPM );
  397. UpdateSliderWnd();
  398. }
  399. void CExtSliderWnd::UpdateSliderWnd()
  400. {
  401. ASSERT_VALID( this );
  402. HWND hWndOwn = GetSafeHwnd();
  403. if( hWndOwn == NULL )
  404. return;
  405. HWND hWndParent = ::GetParent( hWndOwn );
  406. if( hWndParent != NULL )
  407. {
  408. bool bDisabled = false;
  409. if( ! ::IsWindowEnabled( hWndOwn ) )
  410. {
  411. bDisabled = true;
  412. EnableWindow( TRUE );
  413. }
  414. HWND hWndFocus = ::GetFocus();
  415. if( hWndFocus == hWndOwn )
  416. {
  417. ::SetFocus( hWndParent );
  418. ::SetFocus( hWndFocus );
  419. }
  420. else
  421. {
  422. ::SetFocus( hWndOwn );
  423. ::SetFocus( hWndFocus );
  424. }
  425. if( bDisabled )
  426. EnableWindow( FALSE );
  427. }
  428. Invalidate();
  429. UpdateWindow();
  430. }
  431. #endif // (!defined __EXT_MFC_NO_SLIDER)