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

界面编程

开发平台:

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_LABEL_H)
  23. #include <ExtLabel.h>
  24. #endif
  25. #if (!defined __EXT_PAINT_MANAGER_H)
  26. #include <ExtPaintManager.h>
  27. #endif
  28. #if (!defined __EXT_POPUP_MENU_WND_H)
  29. #include <ExtPopupMenuWnd.h>
  30. #endif
  31. #if (!defined __EXT_MEMORY_DC_H)
  32. #include <../Src/ExtMemoryDC.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. // CExtLabel
  41. IMPLEMENT_DYNCREATE( CExtLabel, CStatic );
  42. IMPLEMENT_CExtPmBridge_MEMBERS( CExtLabel );
  43. bool CExtLabel::g_bHelper_AutoAdjust_SS_NOTIFY_style = true;
  44. CExtLabel::CExtLabel()
  45. : m_bFontBold(false)
  46. , m_bFontItalic(false)
  47. , m_bFontUnderline(false)
  48. , m_bFontStrikeOut(false)
  49. , m_clrTextNormal( COLORREF(-1L) )
  50. , m_clrTextDisabled( COLORREF(-1L) )
  51. , m_clrBackground( COLORREF(-1L) )
  52. , m_bInitText(false)
  53. , m_sText( _T("") )
  54. , m_eImageMode( eAlign )
  55. , m_nAdvancedTipStyle( INT(CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON) )
  56. , m_bHelper_AutoAdjust_SS_NOTIFY_style(  CExtLabel::g_bHelper_AutoAdjust_SS_NOTIFY_style )
  57. , m_rcLabelTextMargins( 0, 0, 0, 0 )
  58. {
  59. m_bmp.Empty();
  60. PmBridge_Install();
  61. }
  62. CExtLabel::~CExtLabel()
  63. {
  64. m_bmp.Empty();
  65. PmBridge_Uninstall();
  66. }
  67. BEGIN_MESSAGE_MAP(CExtLabel, CStatic)
  68. //{{AFX_MSG_MAP(CExtLabel)
  69. ON_WM_ERASEBKGND()
  70. ON_WM_PAINT()
  71. //}}AFX_MSG_MAP
  72. END_MESSAGE_MAP()
  73. BOOL CExtLabel::OnEraseBkgnd(CDC* pDC) 
  74. {
  75. pDC;
  76. return TRUE;
  77. }
  78. void CExtLabel::DoPaint(
  79. CDC * pDC,
  80. CRect & rcClient
  81. )
  82. {
  83. ASSERT_VALID( this );
  84. ASSERT_VALID( pDC );
  85. CExtMemoryDC dc( pDC, &rcClient );
  86. CRgn rgnClient;
  87. if( rgnClient.CreateRectRgnIndirect( &rcClient ) )
  88. dc.SelectClipRgn( &rgnClient );
  89. OnEraseBackground( dc, rcClient );
  90. DWORD dwWndStyle = GetStyle();
  91. DWORD dwWndType = (dwWndStyle&SS_TYPEMASK);
  92. bool bCenterImage = ( (dwWndStyle&SS_CENTERIMAGE) != 0 );
  93. if( ! m_bmp.IsEmpty() )
  94. {
  95. bool bSmootherAsPossible = true;
  96. e_ImageMode_t eImageMode = GetImageMode();
  97. if( eImageMode == eStretch )
  98. m_bmp.AlphaBlendSkinParts( dc.GetSafeHdc(), rcClient, CRect(0,0,0,0), CExtBitmap::__EDM_STRETCH, true, bSmootherAsPossible );
  99. else if( eImageMode == eTouchInside || eImageMode == eTouchOutside )
  100. {
  101. CRect rcTouchSurface = rcClient;
  102. CExtMemoryDC dcTouch( &dc, rcTouchSurface, CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_FILL_BITS|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY );
  103. if( dcTouch.GetSafeHdc() )
  104. {
  105. CSize sizeTouchSrc = rcTouchSurface.Size();
  106. CSize sizeBmp = m_bmp.GetSize();
  107. double lfAspectX = double(rcTouchSurface.Width())  / double(sizeBmp.cx);
  108. double lfAspectY = double(rcTouchSurface.Height()) / double(sizeBmp.cy);
  109. double lfAspect = ( eImageMode == eTouchInside ) ? ( min( lfAspectX, lfAspectY ) ) : ( max( lfAspectX, lfAspectY ) );
  110. CSize sizeNew( LONG(double(sizeBmp.cx)*lfAspect), LONG(double(sizeBmp.cy)*lfAspect) );
  111. CRect rcTouchDst( rcTouchSurface.left, rcTouchSurface.top, rcTouchSurface.left + sizeNew.cx, rcTouchSurface.top + sizeNew.cy );
  112. if( eImageMode == eTouchInside )
  113. {
  114. if( sizeNew.cx > sizeTouchSrc.cx )
  115. rcTouchDst.OffsetRect( ( sizeNew.cx - sizeTouchSrc.cx ) / 2, 0 );
  116. if( sizeNew.cy > sizeTouchSrc.cy )
  117. rcTouchDst.OffsetRect( 0, ( sizeNew.cy - sizeTouchSrc.cy ) / 2 );
  118. }
  119. else
  120. {
  121. rcTouchDst.OffsetRect( - ( sizeNew.cx - sizeTouchSrc.cx ) / 2, 0 );
  122. rcTouchDst.OffsetRect( 0, - ( sizeNew.cy - sizeTouchSrc.cy ) / 2 );
  123. }
  124. INT nOldStretchBltMode = bSmootherAsPossible ? ( ::GetStretchBltMode( dcTouch.m_hDC ) ) : ( COLORONCOLOR ) ;
  125. if( bSmootherAsPossible )
  126. ::SetStretchBltMode( dcTouch.m_hDC, ( g_PaintManager.m_bIsWinNT ) ? HALFTONE : COLORONCOLOR );
  127. m_bmp.AlphaBlend( dcTouch.m_hDC, rcTouchDst );
  128. if( bSmootherAsPossible )
  129. ::SetStretchBltMode( dcTouch.m_hDC, nOldStretchBltMode );
  130. }
  131. }
  132. else if( eImageMode == eTile )
  133. m_bmp.AlphaBlendSkinParts(  dc.GetSafeHdc(), rcClient, CRect(0,0,0,0), CExtBitmap::__EDM_TILE, true, bSmootherAsPossible );
  134. else if( eImageMode == eAlign )
  135. {
  136. CSize szSize = m_bmp.GetSize();
  137. CRect rcDst( rcClient.left, rcClient.top, rcClient.left + szSize.cx, rcClient.top + szSize.cy );
  138. bool bCenterHorizontally = false;
  139. switch( dwWndType )
  140. {
  141. case SS_RIGHT:  rcDst.OffsetRect( rcClient.right - rcDst.right, 0 ); break;
  142. case SS_CENTER: bCenterHorizontally = true;        break;
  143. default: /* all the other types assumed as left */ break;
  144. }
  145. if( bCenterHorizontally )
  146. rcDst.OffsetRect( ( (rcClient.right - rcClient.left) - (rcDst.right - rcDst.left) ) / 2, 0 );
  147. if( bCenterImage )
  148. rcDst.OffsetRect( 0, ( (rcClient.bottom - rcClient.top) - (rcDst.bottom - rcDst.top) ) / 2 );
  149. CRect rcSrc( 0, 0, szSize.cx, szSize.cy );
  150. rcDst.top = max( rcDst.top, rcClient.top );
  151. rcDst.left = max( rcDst.left, rcClient.left );
  152. rcDst.bottom = min( rcDst.bottom, rcClient.bottom );
  153. rcDst.right = min( rcDst.right, rcClient.right );
  154. if( ::RectVisible( dc.GetSafeHdc(), &rcDst ) )
  155. {
  156. INT nOldStretchBltMode = bSmootherAsPossible ? ( ::GetStretchBltMode( dc.m_hDC ) ) : ( COLORONCOLOR );
  157. if( bSmootherAsPossible )
  158. ::SetStretchBltMode( dc.m_hDC, ( g_PaintManager.m_bIsWinNT ) ? HALFTONE : COLORONCOLOR );
  159. m_bmp.AlphaBlend( dc.m_hDC, rcDst, rcSrc );
  160. if( bSmootherAsPossible )
  161. ::SetStretchBltMode( dc.m_hDC, nOldStretchBltMode );
  162. }
  163. }
  164. }
  165. else if( dwWndType == SS_ICON )
  166. {
  167. HICON hIcon = GetIcon();
  168. if( hIcon != NULL )
  169. {
  170. CExtCmdIcon _icon;
  171. _icon.AssignFromHICON( hIcon, true );
  172. CSize szIcon = _icon.GetSize();
  173. int nOffsetX = bCenterImage ? (rcClient.Width() - szIcon.cx) / 2 : 0;
  174. int nOffsetY = bCenterImage ? (rcClient.Height() - szIcon.cy) / 2 : 0;
  175. _icon.Paint(
  176. PmBridge_GetPM(), dc.GetSafeHdc(), rcClient.left + nOffsetX, rcClient.top + nOffsetY, -1, -1,
  177. IsWindowEnabled() ? CExtCmdIcon::__PAINT_NORMAL : CExtCmdIcon::__PAINT_DISABLED
  178. );
  179. }
  180. }
  181. else
  182. {
  183. CExtSafeString strText;
  184. int nTextLen = GetWindowTextLength();
  185. if( nTextLen > 0 )
  186. {
  187. GetWindowText( strText.GetBuffer( nTextLen + 2 ), nTextLen + 1 );
  188. strText.ReleaseBuffer();
  189. }
  190. if( strText.GetLength() > 0 )
  191. {
  192. DWORD dwDrawTextFlags = 0;
  193. switch( dwWndType )
  194. {
  195. case SS_RIGHT:           dwDrawTextFlags = DT_RIGHT;  break; 
  196. case SS_CENTER:          dwDrawTextFlags = DT_CENTER; break;
  197. case SS_LEFTNOWORDWRAP:  dwDrawTextFlags = DT_LEFT;   break;
  198. default: /* all the other types assumed as left */ dwDrawTextFlags = DT_LEFT; break;
  199. } // switch( dwWndType )
  200. if( strText.Find( _T('t') ) != -1 ) // do tabs expanding
  201. dwDrawTextFlags |= DT_EXPANDTABS;
  202. if( (dwWndType == SS_SIMPLE)
  203. || (dwWndStyle&(SS_CENTERIMAGE|SS_ENDELLIPSIS|SS_PATHELLIPSIS)) != 0
  204. )
  205. {
  206. dwDrawTextFlags |= DT_SINGLELINE;
  207. if( (dwWndStyle&SS_CENTERIMAGE) != 0 )
  208. dwDrawTextFlags |= DT_VCENTER;
  209. if( (dwWndStyle&SS_ENDELLIPSIS) != 0 )
  210. dwDrawTextFlags |= DT_END_ELLIPSIS;
  211. if( (dwWndStyle&SS_PATHELLIPSIS) != 0 )
  212. dwDrawTextFlags |= DT_PATH_ELLIPSIS;
  213. }
  214. else
  215. dwDrawTextFlags |= DT_WORDBREAK;
  216. if( dwWndType == SS_LEFTNOWORDWRAP )
  217. dwDrawTextFlags &= ~(DT_WORDBREAK|DT_SINGLELINE);
  218. if( (dwWndStyle&SS_NOPREFIX) != 0 )
  219. dwDrawTextFlags |= DT_NOPREFIX;
  220. bool bEnabled = IsWindowEnabled() ? true : false;
  221. OnDrawLabelText( dc, rcClient, strText, dwDrawTextFlags, bEnabled );
  222. } // if( strText.GetLength() > 0 )
  223. }
  224. PmBridge_GetPM()->OnPaintSessionComplete( this );
  225. if( rgnClient.GetSafeHandle() != NULL )
  226. dc.SelectClipRgn( &rgnClient );
  227. }
  228. void CExtLabel::OnPaint() 
  229. {
  230. ASSERT_VALID( this );
  231. DWORD dwWndStyle = GetStyle();
  232. DWORD dwWndType = (dwWndStyle&SS_TYPEMASK);
  233. if( dwWndType == SS_BLACKRECT 
  234. || dwWndType == SS_GRAYRECT 
  235. || dwWndType == SS_WHITERECT 
  236. || dwWndType == SS_BLACKFRAME 
  237. || dwWndType == SS_GRAYFRAME 
  238. || dwWndType == SS_WHITEFRAME 
  239. || dwWndType == SS_USERITEM 
  240. || dwWndType == SS_OWNERDRAW 
  241. || dwWndType == SS_BITMAP 
  242. || dwWndType == SS_ENHMETAFILE 
  243. || dwWndType == SS_ETCHEDHORZ 
  244. || dwWndType == SS_ETCHEDVERT 
  245. || dwWndType == SS_ETCHEDFRAME 
  246. )
  247. {
  248. Default();
  249. return;
  250. }
  251. CPaintDC dcPaint( this );
  252. CRect rcClient;
  253. GetClientRect( &rcClient );
  254. if( rcClient.IsRectEmpty() )
  255. return;
  256. DoPaint( &dcPaint, rcClient );
  257. }
  258. void CExtLabel::OnEraseBackground(
  259. CDC & dc,
  260. const CRect & rcClient
  261. )
  262. {
  263. ASSERT_VALID( this );
  264. COLORREF clrBackground = GetBkColor();
  265. bool bTransparent = false;
  266. if( PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  267. && ( clrBackground == COLORREF(-1L) )
  268. )
  269. {
  270. CExtPaintManager::stat_ExcludeChildAreas(
  271. dc,
  272. GetSafeHwnd(),
  273. CExtPaintManager::stat_DefExcludeChildAreaCallback
  274. );
  275. if( PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  276. bTransparent = true;
  277. }
  278. if( ! bTransparent )
  279. dc.FillSolidRect(
  280. &rcClient,
  281. (clrBackground != COLORREF(-1L)) 
  282. ? clrBackground 
  283. : PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_3DFACE_OUT, this ) 
  284. );
  285. }
  286. HFONT CExtLabel::OnQueryFont() const
  287. {
  288. ASSERT_VALID( this );
  289. HFONT hFont = NULL;
  290. if( GetSafeHwnd() != NULL )
  291. hFont = (HFONT) ::SendMessage( m_hWnd, WM_GETFONT, 0L, 0L );
  292. if( hFont == NULL )
  293. {
  294. HWND hWndParent = ::GetParent( m_hWnd );
  295. if( hWndParent != NULL )
  296. hFont = (HFONT)
  297. ::SendMessage( hWndParent, WM_GETFONT, 0L, 0L );
  298. } // if( hFont == NULL )
  299. if( hFont == NULL )
  300. {
  301. hFont = (HFONT)::GetStockObject( DEFAULT_GUI_FONT );
  302. if( hFont == NULL )
  303. hFont = (HFONT)::GetStockObject( SYSTEM_FONT );
  304. } // if( hFont == NULL )
  305. return hFont;
  306. }
  307. void CExtLabel::OnDrawLabelText(
  308. CDC & dc,
  309. const RECT & rcText,
  310. __EXT_MFC_SAFE_LPCTSTR strText,
  311. DWORD dwDrawTextFlags,
  312. bool bEnabled
  313. )
  314. {
  315. HFONT hFont = OnQueryFont();
  316. ASSERT( hFont != NULL );
  317. LOGFONT lf;
  318. ::GetObject( 
  319. (HGDIOBJ) hFont, 
  320.         sizeof( lf ), 
  321.         (LPVOID) & lf 
  322. );
  323. hFont = NULL;
  324. if( m_bFontBold )
  325. lf.lfWeight = 
  326. (lf.lfWeight > FW_BOLD) 
  327. ? lf.lfWeight 
  328. : FW_BOLD;
  329. lf.lfItalic = (BYTE)( m_bFontItalic ? 1 : 0 );
  330. lf.lfUnderline = (BYTE)( m_bFontUnderline ? 1 : 0 );
  331. lf.lfStrikeOut = (BYTE)( m_bFontStrikeOut ? 1 : 0 );
  332. hFont = ::CreateFontIndirect( &lf );
  333. ASSERT( hFont != NULL );
  334. CFont _fontDestructor;
  335. _fontDestructor.Attach( hFont );
  336. HGDIOBJ hOldFont = NULL;
  337. if( hFont != NULL )
  338. hOldFont = ::SelectObject( dc, (HGDIOBJ)hFont );
  339. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  340. COLORREF clrOldText =
  341. dc.SetTextColor( OnQueryTextColor( bEnabled ) );
  342. CRect rc( rcText );
  343. rc.DeflateRect( &m_rcLabelTextMargins );
  344. dc.DrawText(
  345. LPCTSTR(strText),
  346. int(_tcslen(strText)),
  347. rc,
  348. dwDrawTextFlags
  349. );
  350. dc.SetTextColor( clrOldText );
  351. dc.SetBkMode( nOldBkMode );
  352. if( hFont != NULL )
  353. ::SelectObject( dc, hOldFont );
  354. }
  355. COLORREF CExtLabel::OnQueryTextColor(
  356. bool bEnabled
  357. ) const
  358. {
  359. ASSERT_VALID( this );
  360. COLORREF clrText = GetTextColor( bEnabled );
  361. if( clrText != COLORREF(-1L) )
  362. return clrText;
  363. CWindowDC dcFake( NULL );
  364. clrText =
  365. PmBridge_GetPM()->QueryObjectTextColor(
  366. dcFake,
  367. bEnabled,
  368. false,
  369. false,
  370. false,
  371. (CObject*)this
  372. );
  373. if( clrText != COLORREF(-1L) )
  374. return clrText;
  375. clrText =
  376. PmBridge_GetPM()->GetColor(
  377. bEnabled
  378. ? COLOR_BTNTEXT
  379. : CExtPaintManager::CLR_TEXT_DISABLED,
  380. (CObject*)this
  381. );
  382. return clrText;
  383. }
  384. LRESULT CExtLabel::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  385. {
  386. #if (defined WM_UPDATEUISTATE)
  387. ASSERT( WM_UPDATEUISTATE == 0x0128 );
  388. #endif
  389. // WM_UPDATEUISTATE causes repaint without WM_PAINT, so we eat it
  390. if( message == 0x0128 )
  391. return 0;
  392. if( message == WM_ENABLE )
  393. {
  394. LRESULT lResult = CStatic::WindowProc(message, wParam, lParam);
  395. Invalidate();
  396. UpdateWindow();
  397. return lResult;
  398. }
  399. if( message == WM_PRINT || message == WM_PRINTCLIENT )
  400. {
  401. CDC * pDC = CDC::FromHandle( (HDC)wParam );
  402. CRect rcClient;
  403. GetClientRect( &rcClient );
  404. DoPaint( pDC, rcClient );
  405. HWND hWndChild = ::GetWindow( m_hWnd, GW_CHILD );
  406. for( ; hWndChild != NULL; hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT ) )
  407. {
  408. __EXT_MFC_LONG_PTR dwChildStyle = ::__EXT_MFC_GetWindowLong( hWndChild, GWL_STYLE );
  409. if( (dwChildStyle&WS_VISIBLE) == 0 )
  410. continue;
  411. CRect rcChildWnd, rcChildClient, rcStartClient;
  412. ::GetClientRect( m_hWnd, &rcStartClient );
  413. ::ClientToScreen( hWndChild, ((LPPOINT)(&rcStartClient)) );
  414. ::ClientToScreen( hWndChild, ((LPPOINT)(&rcStartClient))+1 );
  415. ::GetWindowRect( hWndChild, &rcChildWnd );
  416. ::GetClientRect( hWndChild, &rcChildClient );
  417. ::ClientToScreen( hWndChild, ((LPPOINT)(&rcChildClient)) );
  418. ::ClientToScreen( hWndChild, ((LPPOINT)(&rcChildClient))+1 );
  419. CPoint ptChildRenderOffset( 0, 0 );
  420. if( (lParam&PRF_NONCLIENT) != 0 )
  421. {
  422. ptChildRenderOffset.x = rcStartClient.left - rcChildWnd.left;
  423. ptChildRenderOffset.y = rcStartClient.top - rcChildWnd.top;
  424. }
  425. else
  426. {
  427. ptChildRenderOffset.x = rcStartClient.left - rcChildClient.left;
  428. ptChildRenderOffset.y = rcStartClient.top - rcChildClient.top;
  429. }
  430. if( ptChildRenderOffset.x != 0
  431. || ptChildRenderOffset.y != 0
  432. )
  433. ::OffsetViewportOrgEx(
  434. pDC->m_hDC,
  435. -ptChildRenderOffset.x,
  436. -ptChildRenderOffset.y,
  437. NULL
  438. );
  439. ::SendMessage(
  440. hWndChild,
  441. message,
  442. (WPARAM)pDC->m_hDC,
  443. lParam
  444. );
  445. // CExtPaintManager::stat_PrintChildren(
  446. // hWndChild,
  447. // message,
  448. // pDC->m_hDC,
  449. // lParam,
  450. // true,
  451. // this,
  452. // lParam
  453. // );
  454. if( ptChildRenderOffset.x != 0
  455. || ptChildRenderOffset.y != 0
  456. )
  457. ::OffsetViewportOrgEx(
  458. pDC->m_hDC,
  459. ptChildRenderOffset.x,
  460. ptChildRenderOffset.y,
  461. NULL
  462. );
  463. } // for( ; hWndChild != NULL; hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT ) )
  464. return (!0);
  465. }
  466. if( message == WM_MOUSEMOVE )
  467. {
  468. if( m_nAdvancedTipStyle != INT(CExtPopupMenuTipWnd::__ETS_NONE)
  469. && ( ! m_strToolTipText.IsEmpty() )
  470. && (! CExtPopupMenuWnd::IsMenuTracking() )
  471. )
  472. {
  473. CExtPopupMenuTipWnd * pATTW = OnAdvancedPopupMenuTipWndGet();
  474. if( pATTW != NULL )
  475. {
  476. CRect rcArea;
  477. GetWindowRect( &rcArea );
  478. OnAdvancedPopupMenuTipWndDisplay( *pATTW, rcArea );
  479. }
  480. }
  481. }
  482. else
  483. if( message == WM_SETTEXT 
  484. || message == WM_GETTEXT 
  485. || message == WM_GETTEXTLENGTH 
  486. )
  487. {
  488. DWORD dwWndStyle = GetStyle();
  489. DWORD dwWndType = (dwWndStyle&SS_TYPEMASK);
  490. if( dwWndType == SS_BLACKRECT 
  491. || dwWndType == SS_GRAYRECT 
  492. || dwWndType == SS_WHITERECT 
  493. || dwWndType == SS_BLACKFRAME 
  494. || dwWndType == SS_GRAYFRAME 
  495. || dwWndType == SS_WHITEFRAME 
  496. || dwWndType == SS_USERITEM 
  497. || dwWndType == SS_OWNERDRAW 
  498. || dwWndType == SS_BITMAP 
  499. || dwWndType == SS_ICON
  500. || dwWndType == SS_ENHMETAFILE 
  501. || dwWndType == SS_ETCHEDHORZ 
  502. || dwWndType == SS_ETCHEDVERT 
  503. || dwWndType == SS_ETCHEDFRAME 
  504. )
  505. return CStatic::WindowProc( message, wParam, lParam );
  506. if( (!m_bInitText)
  507. && (message == WM_GETTEXT || message == WM_GETTEXTLENGTH)
  508. )
  509. {
  510. LRESULT lResult = CStatic::WindowProc( message, wParam, lParam );
  511. INT nMaxLength = 0;
  512. if( message != WM_GETTEXTLENGTH )
  513. {
  514. WPARAM wParamLocal = 0L;
  515. LPARAM lParamLocal = 0L; 
  516. nMaxLength = (INT)
  517. CStatic::WindowProc( 
  518. WM_GETTEXTLENGTH, 
  519. wParamLocal, 
  520. lParamLocal 
  521. );
  522. }
  523. else
  524. nMaxLength = (INT)lResult;
  525. CString sTextInit;
  526. CStatic::WindowProc( 
  527. WM_GETTEXT, 
  528. nMaxLength + 1, 
  529. (LPARAM)sTextInit.GetBuffer( nMaxLength + 1 ) 
  530. );
  531. sTextInit.ReleaseBuffer();
  532. m_sText = sTextInit;
  533. m_bInitText = true;
  534. return lResult;
  535. }
  536. if( message == WM_SETTEXT )
  537. {
  538. LPCTSTR lpszText = (LPCTSTR)lParam;
  539. m_sText = lpszText;
  540. m_bInitText = true;
  541. RedrawWindow(
  542. NULL, NULL,
  543. RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ERASENOW
  544. );
  545. return TRUE;
  546. }
  547. else if( message == WM_GETTEXT )
  548. {
  549. TCHAR * lpszText = (TCHAR *)lParam;
  550. ::memset( lpszText, 0, wParam );
  551. __EXT_MFC_STRNCPY(
  552. lpszText,
  553. wParam,
  554. m_sText,
  555. wParam - 1
  556. );
  557. lpszText[ wParam - 1 ] = _T('');
  558. return m_sText.GetLength();
  559. }
  560. else if( message == WM_GETTEXTLENGTH )
  561. {
  562. return m_sText.GetLength();
  563. }
  564. }
  565. return CStatic::WindowProc(message, wParam, lParam);
  566. }
  567. void CExtLabel::PreSubclassWindow()
  568. {
  569. m_bInitText = false;
  570. CStatic::PreSubclassWindow();
  571. if( m_bHelper_AutoAdjust_SS_NOTIFY_style )
  572. ModifyStyle(
  573. m_strToolTipText.IsEmpty() ? SS_NOTIFY : 0,
  574. m_strToolTipText.IsEmpty() ? 0 : SS_NOTIFY
  575. );
  576. }
  577. void CExtLabel::SetFontBold( 
  578. bool bSet // = true 
  579. )
  580. {
  581. ASSERT_VALID( this );
  582. m_bFontBold = bSet;
  583. if( GetSafeHwnd() != NULL )
  584. Invalidate();
  585. }
  586. void CExtLabel::SetFontItalic( 
  587. bool bSet // = true 
  588. )
  589. {
  590. ASSERT_VALID( this );
  591. m_bFontItalic = bSet;
  592. if( GetSafeHwnd() != NULL )
  593. Invalidate();
  594. }
  595. void CExtLabel::SetFontUnderline( 
  596. bool bSet // = true 
  597. )
  598. {
  599. ASSERT_VALID( this );
  600. m_bFontUnderline = bSet;
  601. if( GetSafeHwnd() != NULL )
  602. Invalidate();
  603. }
  604. void CExtLabel::SetFontStrikeOut( 
  605. bool bSet // = true 
  606. )
  607. {
  608. ASSERT_VALID( this );
  609. m_bFontStrikeOut = bSet;
  610. if( GetSafeHwnd() != NULL )
  611. Invalidate();
  612. }
  613. void CExtLabel::SetBkColor( COLORREF clrBk )
  614. ASSERT_VALID( this );
  615. m_clrBackground = clrBk; 
  616. if( GetSafeHwnd() != NULL )
  617. Invalidate();
  618. }
  619. void CExtLabel::SetTextColor(
  620. bool bEnabled,
  621. COLORREF clrText // = COLORREF(-1L)
  622. )
  623. {
  624. ASSERT_VALID( this );
  625. if( bEnabled )
  626. m_clrTextNormal = clrText;
  627. else
  628. m_clrTextDisabled = clrText;
  629. if( GetSafeHwnd() != NULL )
  630. Invalidate();
  631. }
  632. bool CExtLabel::GetFontBold()
  633. {
  634. ASSERT_VALID( this );
  635. return m_bFontBold;
  636. }
  637. bool CExtLabel::GetFontItalic()
  638. {
  639. ASSERT_VALID( this );
  640. return m_bFontItalic;
  641. }
  642. bool CExtLabel::GetFontUnderline()
  643. {
  644. ASSERT_VALID( this );
  645. return m_bFontUnderline;
  646. }
  647. bool CExtLabel::GetFontStrikeOut()
  648. {
  649. ASSERT_VALID( this );
  650. return m_bFontStrikeOut;
  651. }
  652. COLORREF CExtLabel::GetBkColor() const
  653. ASSERT_VALID( this );
  654. return m_clrBackground; 
  655. }
  656. COLORREF CExtLabel::GetTextColor(
  657. bool bEnabled
  658. ) const
  659. {
  660. ASSERT_VALID( this );
  661. COLORREF clrText =
  662. bEnabled
  663. ? m_clrTextNormal
  664. : m_clrTextDisabled
  665. ;
  666. return clrText;
  667. }
  668. const CExtBitmap * CExtLabel::GetBitmapEx() const
  669. {
  670. ASSERT_VALID( this );
  671. return 
  672. ( const_cast < CExtLabel * > ( this ) ) -> GetBitmapEx();
  673. }
  674. CExtBitmap * CExtLabel::GetBitmapEx()
  675. {
  676. ASSERT_VALID( this );
  677. return (&m_bmp);
  678. }
  679. bool CExtLabel::SetBitmapEx( 
  680. CExtBitmap * pBmp 
  681. )
  682. {
  683. ASSERT_VALID( this );
  684. if( pBmp == NULL
  685. || pBmp->IsEmpty()
  686. )
  687. {
  688. m_bmp.Empty();
  689. if( GetSafeHwnd() != NULL )
  690. Invalidate();
  691. return true;
  692. }
  693. bool bRetVal = m_bmp.AssignFromOther( *pBmp );
  694. if( GetSafeHwnd() != NULL )
  695. Invalidate();
  696. return bRetVal;
  697. }
  698. CExtLabel::e_ImageMode_t CExtLabel::GetImageMode() const
  699. {
  700. ASSERT_VALID( this );
  701. return m_eImageMode;
  702. }
  703. CExtLabel::e_ImageMode_t CExtLabel::SetImageMode( 
  704. e_ImageMode_t eImageMode 
  705. )
  706. {
  707. ASSERT_VALID( this );
  708. e_ImageMode_t eImageModeOld = m_eImageMode;
  709. m_eImageMode = eImageMode;
  710. return eImageModeOld;
  711. }
  712. void CExtLabel::SetTooltipText( int nId )
  713. {
  714. ASSERT_VALID( this );
  715. CExtSafeString sText;
  716. g_ResourceManager->LoadString( sText, nId );
  717. SetTooltipText( LPCTSTR(sText) );
  718. }
  719. void CExtLabel::SetTooltipText( __EXT_MFC_SAFE_LPCTSTR sText )
  720. {
  721. ASSERT_VALID( this );
  722. if( sText == NULL )
  723. sText = _T("");
  724. m_strToolTipText = sText;
  725. if( m_bHelper_AutoAdjust_SS_NOTIFY_style
  726. && GetSafeHwnd() != NULL
  727. )
  728. ModifyStyle(
  729. m_strToolTipText.IsEmpty() ? SS_NOTIFY : 0,
  730. m_strToolTipText.IsEmpty() ? 0 : SS_NOTIFY
  731. );
  732. }
  733. CExtPopupMenuTipWnd * CExtLabel::OnAdvancedPopupMenuTipWndGet() const
  734. {
  735. if( m_nAdvancedTipStyle == INT(CExtPopupMenuTipWnd::__ETS_NONE) )
  736. return NULL;
  737. return (&( CExtPopupMenuSite::g_DefPopupMenuSite.GetTip() ));
  738. }
  739. void CExtLabel::OnAdvancedPopupMenuTipWndDisplay(
  740. CExtPopupMenuTipWnd & _ATTW,
  741. const RECT & rcExcludeArea
  742. ) const
  743. {
  744. ASSERT_VALID( this );
  745. if( m_strToolTipText.IsEmpty() )
  746. return;
  747. _ATTW.SetText( LPCTSTR(m_strToolTipText) );
  748. _ATTW.SetTipStyle( (CExtPopupMenuTipWnd::e_tip_style_t)m_nAdvancedTipStyle );
  749. _ATTW.Show( (CWnd*)this, rcExcludeArea );
  750. }