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

界面编程

开发平台:

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_GROUPBOX_H)
  23. #include <ExtGroupBox.h>
  24. #endif
  25. #if (!defined __EXT_MEMORY_DC_H)
  26. #include <../Src/ExtMemoryDC.h>
  27. #endif
  28. #if (!defined __EXT_PAINT_MANAGER_H)
  29. #include <ExtPaintManager.h>
  30. #endif
  31. #if (!defined __EXT_TEMPL_H)
  32. #include <ExtTempl.h>
  33. #endif
  34. #ifdef _DEBUG
  35. #define new DEBUG_NEW
  36. #undef THIS_FILE
  37. static char THIS_FILE[] = __FILE__;
  38. #endif
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CExtGroupBox
  41. IMPLEMENT_DYNAMIC( CExtGroupBox, CButton );
  42. IMPLEMENT_CExtPmBridge_MEMBERS( CExtGroupBox );
  43. CExtGroupBox::CExtGroupBox()
  44. : m_eStyle( STYLE_SYSTEM )
  45. , m_eTextAlign( ALIGN_DEFAULT )
  46. , m_nCaptionHeaderHeight( 18 )
  47. , m_clrTextNormal( COLORREF(-1L) )
  48. , m_clrTextDisabled( COLORREF(-1L) )
  49. , m_clrFrameNormal( COLORREF(-1L) )
  50. , m_clrFrameDisabled( COLORREF(-1L) )
  51. , m_clrBackground( COLORREF(-1L) )
  52. {
  53. PmBridge_Install();
  54. }
  55. CExtGroupBox::~CExtGroupBox()
  56. {
  57. PmBridge_Uninstall();
  58. }
  59. BEGIN_MESSAGE_MAP(CExtGroupBox, CButton)
  60. //{{AFX_MSG_MAP(CExtGroupBox)
  61. ON_WM_ERASEBKGND()
  62. ON_WM_PAINT()
  63. //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CExtGroupBox message handlers
  67. void CExtGroupBox::PreSubclassWindow() 
  68. {
  69. ModifyStyle( 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS );
  70. CButton::PreSubclassWindow();
  71. }
  72. BOOL CExtGroupBox::OnEraseBkgnd(CDC* pDC)
  73. {
  74. pDC;
  75. return FALSE;
  76. }
  77. void CExtGroupBox::DoPaint( 
  78. CDC * pDC,
  79. CRect & rcClient
  80. )
  81. {
  82. ASSERT_VALID( this );
  83. ASSERT_VALID( pDC );
  84. // exclude siblings items area
  85. CWnd * pParent = GetParent();
  86. for( CWnd * pWnd = pParent->GetWindow(GW_CHILD);
  87. pWnd != NULL && pWnd != this;
  88. pWnd = pWnd->GetWindow(GW_HWNDNEXT)
  89. )
  90. {
  91. if( (pWnd->GetStyle() & WS_VISIBLE) == 0 )
  92. continue;
  93. CExtSafeString sClassName;
  94. ::GetClassName(
  95. pWnd->GetSafeHwnd(),
  96. sClassName.GetBuffer( MAX_PATH + 1 ),
  97. MAX_PATH
  98. );
  99. sClassName.ReleaseBuffer();
  100. if( sClassName == LPCTSTR( __EXT_SIZE_GRIPPER_CLASS_NAME ) )
  101. continue;
  102. CRect rcChildRect, rcIntersection;
  103. pWnd->GetWindowRect( &rcChildRect );
  104. ScreenToClient( &rcChildRect );
  105. rcIntersection.IntersectRect(
  106. &rcClient,
  107. &rcChildRect
  108. );
  109. if( !rcIntersection.IsRectEmpty() )
  110. pDC->ExcludeClipRect( &rcIntersection );
  111. }
  112. CExtMemoryDC dc(
  113. pDC,
  114. &rcClient
  115. );
  116. bool bEnabled = IsWindowEnabled() ? true : false;
  117. // paint background
  118. COLORREF clrBackground = GetBkColor();
  119. bool bTransparent = false;
  120. if( PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  121. && ( clrBackground == COLORREF(-1L) )
  122. )
  123. {
  124. CExtPaintManager::stat_ExcludeChildAreas(
  125. dc,
  126. GetSafeHwnd(),
  127. CExtPaintManager::stat_DefExcludeChildAreaCallback
  128. );
  129. if( PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  130. bTransparent = true;
  131. }
  132. if( ! bTransparent )
  133. dc.FillSolidRect(
  134. &rcClient,
  135. (clrBackground != COLORREF(-1L)) 
  136. ? clrBackground 
  137. : PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_3DFACE_OUT, this ) 
  138. );
  139. int nOldBkMode = dc.SetBkMode(TRANSPARENT);
  140. // caption 
  141. CExtSafeString strText;
  142. int nTextLen = GetWindowTextLength();
  143. if( nTextLen > 0 )
  144. {
  145. GetWindowText( strText.GetBuffer( nTextLen + 2 ), nTextLen + 1 );
  146. strText.ReleaseBuffer();
  147. } // if( nTextLen > 0 )
  148. CRect rcBorder( rcClient );
  149. CRect rcText( 0, 0, 0, 0 );
  150. DWORD dwDrawTextFlags = DT_LEFT;
  151. if( strText.Find( _T('t') ) != -1 ) // do tabs expanding
  152. dwDrawTextFlags |= DT_EXPANDTABS;
  153. dwDrawTextFlags |= (DT_VCENTER|DT_END_ELLIPSIS); 
  154. bool bDrawText = 
  155. ( strText.GetLength() > 0 && m_eStyle != STYLE_CAPTION ) 
  156. ? true 
  157. : false;
  158. if( bDrawText )
  159. {
  160. rcText.SetRect( 9, 0, rcClient.right - 9, rcClient.bottom );
  161. HFONT hFont = OnQueryFont();
  162. CRect rcTextDimension =
  163. CExtPaintManager::stat_CalcTextDimension(
  164. dc,
  165. *(CFont::FromHandle(hFont)),
  166. strText
  167. );
  168. e_text_align_t eTextAlign = m_eTextAlign;
  169. if( eTextAlign == ALIGN_DEFAULT )
  170. {
  171. DWORD dwStyle = CWnd::GetStyle();
  172. const UINT nMask = (BS_LEFT|BS_CENTER|BS_RIGHT);
  173. if( (dwStyle & nMask) == BS_RIGHT )
  174. eTextAlign = ALIGN_RIGHT;
  175. else if( (dwStyle & nMask) == BS_CENTER )
  176. eTextAlign = ALIGN_CENTER;
  177. else
  178. eTextAlign = ALIGN_LEFT;
  179. }
  180. if( eTextAlign == ALIGN_LEFT )
  181. rcText.right = rcText.left + rcTextDimension.Width();
  182. else if( eTextAlign == ALIGN_RIGHT )
  183. rcText.left = rcText.right - rcTextDimension.Width();
  184. else if( eTextAlign == ALIGN_CENTER )
  185. {
  186. rcText.left = (rcText.Width() - rcTextDimension.Width())/2;
  187. rcText.right = rcText.left + rcTextDimension.Width();
  188. }
  189. rcText.bottom = rcText.top + rcTextDimension.Height();
  190. rcBorder.top += rcText.Height()/2;
  191. }
  192. else
  193. {
  194. rcBorder.top += 6;
  195. }
  196. if( bDrawText )
  197. {
  198. CRect rcTextClip( rcText );
  199. rcTextClip.InflateRect(2,0,2,0);
  200. dc.ExcludeClipRect( &rcTextClip );
  201. }
  202. // frame rect
  203. OnDrawFrameRect(
  204. dc,
  205. rcBorder,
  206. bEnabled
  207. );
  208. if( bDrawText )
  209. dc.SelectClipRgn( NULL );
  210. // caption text
  211. if( bDrawText )
  212. OnDrawLabelText(
  213. dc,
  214. rcText,
  215. strText,
  216. dwDrawTextFlags,
  217. bEnabled
  218. );
  219. dc.SetBkMode(nOldBkMode);
  220. //DefWindowProc( WM_PAINT, WPARAM(dc.GetSafeHdc()), 0L );
  221. PmBridge_GetPM()->OnPaintSessionComplete( this );
  222. }
  223. void CExtGroupBox::OnPaint() 
  224. {
  225. ASSERT_VALID( this );
  226. CPaintDC dcPaint( this );
  227. CRect rcClient;
  228. GetClientRect( &rcClient );
  229. if( rcClient.IsRectEmpty() )
  230. return;
  231. DoPaint( &dcPaint, rcClient );
  232. }
  233. LRESULT CExtGroupBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  234. {
  235. #if (defined WM_UPDATEUISTATE)
  236. ASSERT( WM_UPDATEUISTATE == 0x0128 );
  237. #endif
  238. // WM_UPDATEUISTATE causes repaint without WM_PAINT, so we eat it
  239. if( message == 0x0128 )
  240. return 0;
  241. if( message == WM_SETTEXT 
  242. || message == WM_ENABLE
  243. )
  244. {
  245. LRESULT lResult = CButton::WindowProc(message, wParam, lParam);
  246. Invalidate();
  247. UpdateWindow();
  248. return lResult;
  249. }
  250. if( message == WM_PRINT || message == WM_PRINTCLIENT )
  251. {
  252. CDC * pDC = CDC::FromHandle( (HDC)wParam );
  253. CRect rcClient;
  254. GetClientRect( &rcClient );
  255. DoPaint( pDC, rcClient );
  256. return (!0);
  257. }
  258. return CButton::WindowProc(message, wParam, lParam);
  259. }
  260. HFONT CExtGroupBox::OnQueryFont() const
  261. {
  262. ASSERT_VALID( this );
  263. HFONT hFont = NULL;
  264. if( GetSafeHwnd() != NULL )
  265. hFont = (HFONT) ::SendMessage( m_hWnd, WM_GETFONT, 0L, 0L );
  266. if( hFont == NULL )
  267. {
  268. HWND hWndParent = ::GetParent( m_hWnd );
  269. if( hWndParent != NULL )
  270. hFont = (HFONT)
  271. ::SendMessage( hWndParent, WM_GETFONT, 0L, 0L );
  272. } // if( hFont == NULL )
  273. if( hFont == NULL )
  274. {
  275. hFont = (HFONT)::GetStockObject( DEFAULT_GUI_FONT );
  276. if( hFont == NULL )
  277. hFont = (HFONT)::GetStockObject( SYSTEM_FONT );
  278. } // if( hFont == NULL )
  279. return hFont;
  280. }
  281. void CExtGroupBox::OnDrawFrameRect(
  282. CDC & dc,
  283. const CRect & rcClient,
  284. bool bEnabled
  285. )
  286. {
  287. COLORREF clrFrame = OnQueryFrameColor( bEnabled );
  288. CRect rcBorder( rcClient );
  289. switch( m_eStyle )
  290. {
  291. case STYLE_SYSTEM:
  292. {
  293. PmBridge_GetPM()->PaintGroupBoxFrame(
  294. dc,
  295. rcBorder,
  296. clrFrame,
  297. this
  298. );
  299. }
  300. break;
  301. case STYLE_ETCHED:
  302. {
  303. if( clrFrame == COLORREF(-1L) )
  304. clrFrame = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_GROUP_BOX_FRAME, this );
  305. dc.Draw3dRect(
  306. &rcBorder,
  307. clrFrame,
  308. PmBridge_GetPM()->GetColor( COLOR_WINDOW, this )
  309. );
  310. rcBorder.DeflateRect(1,1);
  311. dc.Draw3dRect(
  312. &rcBorder,
  313. PmBridge_GetPM()->GetColor( COLOR_WINDOW, this ),
  314. clrFrame
  315. );
  316. }
  317. break;
  318. case STYLE_ROUNDED:
  319. {
  320. CBrush * pBrush =
  321. CBrush::FromHandle( (HBRUSH)::GetStockObject(NULL_BRUSH) );
  322. CBrush * pOldBrush = dc.SelectObject( pBrush );
  323. if( clrFrame == COLORREF(-1L) )
  324. clrFrame = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_GROUP_BOX_FRAME, this );
  325. CPen pen;
  326. pen.CreatePen(
  327. PS_SOLID,
  328. 1,
  329. clrFrame
  330. );
  331. CPen * pOldPen = dc.SelectObject( &pen );
  332. dc.RoundRect(
  333. &rcClient,
  334. CPoint( 10, 10 )
  335. );
  336. dc.SelectObject( pOldPen );
  337. dc.SelectObject( pOldBrush );
  338. }
  339. break;
  340. case STYLE_FLAT:
  341. {
  342. if( clrFrame == COLORREF(-1L) )
  343. clrFrame = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_GROUP_BOX_FRAME, this );
  344. dc.Draw3dRect(
  345. &rcBorder,
  346. clrFrame,
  347. clrFrame
  348. );
  349. }
  350. break;
  351. case STYLE_CAPTION:
  352. {
  353. if( clrFrame == COLORREF(-1L) )
  354. clrFrame = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_GROUP_BOX_FRAME, this );
  355. GetClientRect( &rcBorder );
  356. dc.Draw3dRect(
  357. &rcBorder,
  358. clrFrame,
  359. clrFrame
  360. );
  361. CRect rcHeader( rcBorder);
  362. rcHeader.bottom = rcHeader.top + m_nCaptionHeaderHeight;
  363. dc.FillSolidRect( 
  364. &rcHeader, 
  365. clrFrame
  366. );
  367. // caption 
  368. CExtSafeString strText;
  369. int nTextLen = GetWindowTextLength();
  370. if( nTextLen > 0 )
  371. {
  372. GetWindowText( strText.GetBuffer( nTextLen + 2 ), nTextLen + 1 );
  373. strText.ReleaseBuffer();
  374. } // if( nTextLen > 0 )
  375. if( strText.GetLength() > 0 )
  376. {
  377. e_text_align_t eTextAlign = m_eTextAlign;
  378. if( eTextAlign == ALIGN_DEFAULT )
  379. {
  380. DWORD dwStyle = CWnd::GetStyle();
  381. const UINT nMask = (BS_LEFT|BS_CENTER|BS_RIGHT);
  382. if( (dwStyle & nMask) == BS_RIGHT )
  383. eTextAlign = ALIGN_RIGHT;
  384. else if( (dwStyle & nMask) == BS_CENTER )
  385. eTextAlign = ALIGN_CENTER;
  386. else
  387. eTextAlign = ALIGN_LEFT;
  388. }
  389. DWORD dwDrawTextFlags = DT_LEFT;
  390. if( eTextAlign == ALIGN_RIGHT )
  391. dwDrawTextFlags = DT_RIGHT;
  392. else if( eTextAlign == ALIGN_CENTER )
  393. dwDrawTextFlags = DT_CENTER;
  394. if( strText.Find( _T('t') ) != -1 ) // do tabs expanding
  395. dwDrawTextFlags |= DT_EXPANDTABS;
  396. dwDrawTextFlags |= (DT_VCENTER|DT_END_ELLIPSIS); 
  397. HFONT hFont = OnQueryFont();
  398. LOGFONT lf;
  399. ::GetObject( 
  400. (HGDIOBJ)hFont, 
  401. sizeof(lf), 
  402. (LPVOID) &lf 
  403. );
  404. hFont = NULL;
  405. lf.lfWeight = FW_BOLD;
  406. hFont = ::CreateFontIndirect( &lf );
  407. ASSERT( hFont != NULL );
  408. CFont _fontDestructor;
  409. _fontDestructor.Attach( hFont );
  410. HGDIOBJ hOldFont = NULL;
  411. if( hFont != NULL )
  412. hOldFont = ::SelectObject( dc, (HGDIOBJ)hFont );
  413. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  414. COLORREF clrText = OnQueryTextColor( bEnabled );
  415. COLORREF clrOldText =
  416. dc.SetTextColor(
  417. clrText != COLORREF(-1L) 
  418. ? clrText 
  419. : PmBridge_GetPM()->GetColor( COLOR_WINDOW, this )
  420. );
  421. CRect rcTextDimension =
  422. CExtPaintManager::stat_CalcTextDimension(
  423. dc,
  424. *(CFont::FromHandle(hFont)),
  425. strText
  426. );
  427. CRect rcText(
  428. 5,
  429. (m_nCaptionHeaderHeight - rcTextDimension.Height())/2,
  430. rcClient.right - 4,
  431. rcClient.bottom
  432. );
  433. dc.DrawText(
  434. LPCTSTR(strText),
  435. int(_tcslen(strText)),
  436. rcText,
  437. dwDrawTextFlags
  438. );
  439. dc.SetTextColor( clrOldText );
  440. dc.SetBkMode( nOldBkMode );
  441. if( hFont != NULL )
  442. ::SelectObject( dc, hOldFont );
  443. } // if( strText.GetLength() > 0 )
  444. }
  445. break;
  446. } // switch( m_eStyle )
  447. }
  448. void CExtGroupBox::OnDrawLabelText(
  449. CDC & dc,
  450. CRect & rcText,
  451. __EXT_MFC_SAFE_LPCTSTR strText,
  452. DWORD dwDrawTextFlags,
  453. bool bEnabled
  454. )
  455. {
  456. HFONT hFont = OnQueryFont();
  457. COLORREF clrText = OnQueryTextColor( bEnabled );
  458. PmBridge_GetPM()->PaintGroupBoxLabel(
  459. dc,
  460. strText,
  461. clrText,
  462. hFont,
  463. dwDrawTextFlags,
  464. bEnabled,
  465. rcText,
  466. this
  467. );
  468. }
  469. void CExtGroupBox::SetStyle( e_style_t eStyle )
  470. {
  471. ASSERT_VALID( this );
  472. m_eStyle = eStyle;
  473. if( GetSafeHwnd() != NULL )
  474. Invalidate();
  475. }
  476. CExtGroupBox::e_style_t CExtGroupBox::GetStyle() const
  477. {
  478. ASSERT_VALID( this );
  479. return m_eStyle;
  480. }
  481. void CExtGroupBox::SetTextAlign( e_text_align_t eTextAlign )
  482. {
  483. ASSERT_VALID( this );
  484. m_eTextAlign = eTextAlign;
  485. if( GetSafeHwnd() != NULL )
  486. Invalidate();
  487. }
  488. CExtGroupBox::e_text_align_t CExtGroupBox::GetTextAlign() const
  489. {
  490. ASSERT_VALID( this );
  491. return m_eTextAlign;
  492. }
  493. void CExtGroupBox::SetCaptionHeaderHeight( int nHeight )
  494. {
  495. ASSERT_VALID( this );
  496. m_nCaptionHeaderHeight = nHeight;
  497. if( GetSafeHwnd() != NULL )
  498. Invalidate();
  499. }
  500. int CExtGroupBox::GetCaptionHeaderHeight() const
  501. {
  502. ASSERT_VALID( this );
  503. return m_nCaptionHeaderHeight;
  504. }
  505. void CExtGroupBox::SetBkColor( COLORREF clrBk )
  506. ASSERT_VALID( this );
  507. m_clrBackground = clrBk; 
  508. if( GetSafeHwnd() != NULL )
  509. Invalidate();
  510. }
  511. COLORREF CExtGroupBox::GetBkColor() const
  512. ASSERT_VALID( this );
  513. return m_clrBackground; 
  514. }
  515. void CExtGroupBox::SetTextColor(
  516. COLORREF clrText, // = COLORREF(-1L)
  517. bool bEnabled // = true
  518. )
  519. {
  520. ASSERT_VALID( this );
  521. if( bEnabled )
  522. m_clrTextNormal = clrText;
  523. else
  524. m_clrTextDisabled = clrText;
  525. if( GetSafeHwnd() != NULL )
  526. Invalidate();
  527. }
  528. COLORREF CExtGroupBox::GetTextColor(
  529. bool bEnabled // = true
  530. ) const
  531. {
  532. ASSERT_VALID( this );
  533. COLORREF clrText =
  534. bEnabled
  535. ? m_clrTextNormal
  536. : m_clrTextDisabled
  537. ;
  538. return clrText;
  539. }
  540. void CExtGroupBox::SetFrameColor(
  541. COLORREF clrFrame, // = COLORREF(-1L)
  542. bool bEnabled // = true
  543. )
  544. {
  545. ASSERT_VALID( this );
  546. if( bEnabled )
  547. m_clrFrameNormal = clrFrame;
  548. else
  549. m_clrFrameDisabled = clrFrame;
  550. if( GetSafeHwnd() != NULL )
  551. Invalidate();
  552. }
  553. COLORREF CExtGroupBox::GetFrameColor(
  554. bool bEnabled // = true
  555. ) const
  556. {
  557. ASSERT_VALID( this );
  558. COLORREF clrFrame =
  559. bEnabled
  560. ? m_clrFrameNormal
  561. : m_clrFrameDisabled
  562. ;
  563. return clrFrame;
  564. }
  565. COLORREF CExtGroupBox::OnQueryTextColor(
  566. bool bEnabled // = true
  567. ) const
  568. {
  569. ASSERT_VALID( this );
  570. COLORREF clrText = GetTextColor( bEnabled );
  571. return clrText;
  572. }
  573. COLORREF CExtGroupBox::OnQueryFrameColor(
  574. bool bEnabled // = true
  575. ) const
  576. {
  577. ASSERT_VALID( this );
  578. COLORREF clrText = GetFrameColor( bEnabled );
  579. return clrText;
  580. }