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

界面编程

开发平台:

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_NC_FRAME_H)
  23. #include <ExtNcFrame.h>
  24. #endif
  25. #if (!defined __EXT_PAINT_MANAGER_H)
  26. #include <ExtPaintManager.h>
  27. #endif
  28. #if (!defined __EXT_MENUCONTROLBAR_H)
  29. #include <ExtMenuControlBar.h>
  30. #endif
  31. #if (!defined __AFXPRIV_H__)
  32. #include <AfxPriv.h>
  33. #endif 
  34. #if _MFC_VER < 0x700
  35. #include <../src/AfxImpl.h>
  36. #else
  37. #ifndef __AFXSTATE_H__
  38. #include <../src/mfc/afxstat_.h>
  39. #endif
  40. #include <../src/mfc/AfxImpl.h>
  41. #endif
  42. // disable warning 4706
  43. #pragma warning( push )
  44. #pragma warning ( disable : 4706 )
  45. #include <multimon.h>
  46. // rollback warning 4706
  47. #pragma warning( pop )
  48. #ifdef _DEBUG
  49. #define new DEBUG_NEW
  50. #undef THIS_FILE
  51. static char THIS_FILE[] = __FILE__;
  52. #endif
  53. #if (!defined __EXT_MFC_NO_NC_FRAME )
  54. IMPLEMENT_CExtPmBridge_MEMBERS_GENERIC( CExtPmBridgeNC )
  55. CExtPmBridgeNC::CExtPmBridgeNC(
  56. CExtNcFrameImpl * pNcFrameImpl // = NULL
  57. )
  58. : m_pNcFrameImpl( pNcFrameImpl )
  59. {
  60. PmBridge_Install();
  61. }
  62. CExtPmBridgeNC::~CExtPmBridgeNC()
  63. {
  64. PmBridge_Uninstall();
  65. }
  66. const CExtNcFrameImpl * CExtPmBridgeNC::NcFrameImpl_Get() const
  67. {
  68. return m_pNcFrameImpl;
  69. }
  70. CExtNcFrameImpl * CExtPmBridgeNC::NcFrameImpl_Get()
  71. {
  72. return m_pNcFrameImpl;
  73. }
  74. void CExtPmBridgeNC::NcFrameImpl_Set(
  75. CExtNcFrameImpl * pNcFrameImpl
  76. )
  77. {
  78. m_pNcFrameImpl = pNcFrameImpl;
  79. }
  80. HWND CExtPmBridgeNC::PmBridge_GetSafeHwnd() const
  81. {
  82. if( m_pNcFrameImpl != NULL )
  83. {
  84. HWND hWnd =
  85. m_pNcFrameImpl->NcFrameImpl_OnQueryHWND();
  86. return hWnd;
  87. }
  88. return NULL;
  89. }
  90. void CExtPmBridgeNC::PmBridge_OnPaintManagerChanged(
  91. CExtPaintManager * pGlobalPM
  92. )
  93. {
  94. if( m_pNcFrameImpl == NULL )
  95. return;
  96. m_pNcFrameImpl->NcFrameImpl_SyncThemeSettings( pGlobalPM, false );
  97. if( ! m_pNcFrameImpl->m_bNcFrameImpl_PivotPmSyncMode )
  98. {
  99. if( g_PaintManager.m_nInsallPaintManagerCounter != 0 )
  100. {
  101. HWND hWnd = PmBridge_GetSafeHwnd();
  102. if( hWnd != NULL )
  103. ::PostMessage( hWnd, g_PaintManager.m_nMsgPaintManagerChanged, 0L, 0L );
  104. }
  105. else
  106. _AdjustThemeSettings();
  107. CExtPmBridge::PmBridge_OnPaintManagerChanged( pGlobalPM );
  108. }
  109. m_pNcFrameImpl->NcFrameImpl_SyncThemeSettings( pGlobalPM, true );
  110. }
  111. #if (! defined SPI_GETSCREENSAVERRUNNING)
  112. #define SPI_GETSCREENSAVERRUNNING 114
  113. #endif
  114. void CExtPmBridgeNC::PmBridge_OnDisplayChange(
  115. CExtPaintManager * pGlobalPM,
  116. CWnd * pWndNotifySrc,
  117. INT nDepthBPP,
  118. CPoint ptSizes
  119. )
  120. {
  121. CExtPmBridge::PmBridge_OnDisplayChange(
  122. pGlobalPM,
  123. pWndNotifySrc,
  124. nDepthBPP,
  125. ptSizes
  126. );
  127. // if( g_PaintManager.m_bIsWinVistaOrLater )
  128. // Sleep( 3000 );
  129. CExtNcFrameImpl * pNCFI = NcFrameImpl_Get();
  130. if( pNCFI == NULL )
  131. return;
  132. CWnd * pWndFrameImpl = pNCFI->NcFrameImpl_GetFrameWindow();
  133. if( pWndFrameImpl->GetSafeHwnd() == NULL )
  134. return;
  135. if( ( pWndFrameImpl->GetStyle() & WS_CHILD ) != 0 )
  136. return;
  137. if( g_PaintManager.m_bIsWin2000orLater )
  138. {
  139. BOOL bScreenSavingIsRunning = FALSE;
  140. if( ! SystemParametersInfo( SPI_GETSCREENSAVERRUNNING, 0, &bScreenSavingIsRunning, 0 ) )
  141. bScreenSavingIsRunning = FALSE;
  142. if( bScreenSavingIsRunning )
  143. return;
  144. }
  145. else
  146. {
  147. CPoint ptCursor( 0, 0 );
  148. if( ! ::GetCursorPos( &ptCursor) )
  149. return;
  150. }
  151. _AdjustThemeSettings();
  152. }
  153. void CExtPmBridgeNC::PmBridge_OnThemeChanged(
  154. CExtPaintManager * pGlobalPM,
  155. CWnd * pWndNotifySrc,
  156. WPARAM wParam,
  157. LPARAM lParam
  158. )
  159. {
  160. CExtPmBridge::PmBridge_OnThemeChanged(
  161. pGlobalPM,
  162. pWndNotifySrc,
  163. wParam,
  164. lParam
  165. );
  166. // if( g_PaintManager.m_bIsWinVistaOrLater )
  167. // Sleep( 1000 );
  168. _AdjustThemeSettings();
  169. }
  170. void CExtPmBridgeNC::_AdjustThemeSettings()
  171. {
  172. if( m_pNcFrameImpl == NULL
  173. || m_pNcFrameImpl->m_bNcFrameImpl_InAdjustAdjustThemeSettings
  174. )
  175. return;
  176. m_pNcFrameImpl->m_bNcFrameImpl_CreatePassed = true; // IMPORTANT: this may not be set earlier if frame is started as non-skinned
  177. HWND hWndOwn = PmBridge_GetSafeHwnd();
  178. if( hWndOwn == NULL )
  179. return;
  180. ASSERT( ::IsWindow( hWndOwn ) );
  181. m_pNcFrameImpl->m_bNcFrameImpl_InAdjustAdjustThemeSettings = true;
  182. WINDOWPLACEMENT _wp;
  183. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  184. _wp.length = sizeof(WINDOWPLACEMENT);
  185. CExtNcFrameImpl::stat_GetWindowPlacement(
  186. hWndOwn,
  187. _wp
  188. );
  189. if( ( ::__EXT_MFC_GetWindowLong( hWndOwn, GWL_STYLE ) & WS_VISIBLE ) == 0 )
  190. _wp.showCmd = SW_HIDE;
  191. CWnd * pWndFrameImpl = (CWnd *)m_pNcFrameImpl->NcFrameImpl_GetFrameWindow();
  192. pWndFrameImpl->ModifyStyle( 0, WS_CAPTION|WS_BORDER, 0 );
  193. m_pNcFrameImpl->m_bNcFrameImpl_IsActive = false;
  194. if( pWndFrameImpl != NULL )
  195. {
  196. HWND hWndFocus = ::GetFocus();
  197. if( hWndFocus != NULL
  198. && ( pWndFrameImpl->m_hWnd == hWndFocus
  199. || ::IsChild( pWndFrameImpl->m_hWnd, hWndFocus )
  200. )
  201. )
  202. m_pNcFrameImpl->m_bNcFrameImpl_IsActive = true;
  203. }
  204. DWORD dwInitialStyle = m_pNcFrameImpl->NcFrameImpl_GetInitialStyle();
  205. DWORD dwCurrentStyle = dwInitialStyle; // ::__EXT_MFC_GetWindowLong( hWndOwn, GWL_STYLE );
  206. HWND hWndSurface = NULL;
  207. if( (dwCurrentStyle&(WS_CHILD|WS_VISIBLE)) == WS_VISIBLE
  208. && (! m_pNcFrameImpl->m_bNcFrameImpl_PivotPmSyncMode )
  209. // && (! m_pNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement() )
  210. )
  211. {
  212. CRect rcSurface;
  213. ::GetWindowRect( hWndOwn, &rcSurface );
  214. hWndSurface =
  215. ::CreateWindowEx(
  216. 0, _T("Static"), _T(""), WS_POPUP,
  217. rcSurface.left,
  218. rcSurface.top,
  219. rcSurface.Width()
  220. + ( ( _wp.showCmd == SW_SHOWNORMAL
  221. && g_PaintManager.m_bIsWinXPorLater
  222. ) ? 1 : 0  // +1 for recomputing Window HRGN on WindowsXP or Later
  223. ),
  224. rcSurface.Height(),
  225. hWndOwn, (HMENU)NULL, ::AfxGetInstanceHandle(), NULL
  226. );
  227. if( hWndSurface != NULL )
  228. {
  229. ::EnableWindow( hWndSurface, FALSE );
  230. ::ShowWindow( hWndSurface, SW_SHOWNOACTIVATE );
  231. } // if( hWndSurface != NULL )
  232. } // if( (dwCurrentStyle&(WS_CHILD|WS_VISIBLE)) == WS_VISIBLE )
  233. CExtNcFrameImpl::NcLock _NcLock( * m_pNcFrameImpl );
  234. ::SetWindowRgn( hWndOwn, NULL, TRUE );
  235. if( ! ::IsWindow( hWndOwn ) )
  236. return;
  237. _NcLock.UnlockNow();
  238. if( m_pNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement() )
  239. m_pNcFrameImpl->NcFrameImpl_AdjustVistaDwmCompatibilityIssues();
  240. else
  241. m_pNcFrameImpl->NcFrameImpl_SetupRgn();
  242. if( pWndFrameImpl != NULL
  243. && pWndFrameImpl->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) )
  244. && g_PaintManager.m_UxTheme.IsAppThemed()
  245. )
  246. {
  247. CRect rc;
  248. pWndFrameImpl->GetWindowRect( &rc );
  249. pWndFrameImpl->GetParent()->ScreenToClient( &rc );
  250. rc.left ++;
  251. pWndFrameImpl->MoveWindow( &rc, FALSE );
  252. rc.left --;
  253. pWndFrameImpl->MoveWindow( &rc, FALSE );
  254. }
  255. m_pNcFrameImpl->NcFrameImpl_RecalcNcFrame();
  256. CWnd * pWndPermanent = CWnd::FromHandlePermanent( hWndOwn );
  257. if( pWndPermanent != NULL )
  258. {
  259. CFrameWnd * pFrameWnd = DYNAMIC_DOWNCAST( CFrameWnd, pWndPermanent );
  260. if( pFrameWnd != NULL )
  261. pFrameWnd->RecalcLayout();
  262. }
  263. if( m_pNcFrameImpl->NcFrameImpl_IsSupported()
  264. && ( ! m_pNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement() )
  265. )
  266. {
  267. m_pNcFrameImpl->NcFrameImpl_SetupRgn( NULL );
  268. ::RedrawWindow(
  269. hWndOwn, NULL, NULL,
  270. RDW_INVALIDATE|RDW_ERASE
  271. |RDW_FRAME
  272. |RDW_ALLCHILDREN
  273. );
  274. } // if( m_pNcFrameImpl->NcFrameImpl_IsSupported() ...
  275. else
  276. {
  277. m_pNcFrameImpl->NcFrameImpl_RecalcNcFrame();
  278. if( (dwCurrentStyle&(WS_CHILD|WS_VISIBLE)) == WS_VISIBLE )
  279. {
  280. switch( _wp.showCmd )
  281. {
  282. case SW_SHOWNORMAL:
  283. if( g_PaintManager.m_bIsWinXPorLater )
  284. {
  285. CRect rc = _wp.rcNormalPosition;
  286. rc.right++;
  287. MoveWindow( hWndOwn, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE );
  288. rc.right--;
  289. MoveWindow( hWndOwn, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE );
  290. } // if( g_PaintManager.m_bIsWinXPorLater )
  291. break;
  292. } // switch( _wp.showCmd )
  293. } // if( (dwCurrentStyle&(WS_CHILD|WS_VISIBLE)) == WS_VISIBLE )
  294. } // else from if( m_pNcFrameImpl->NcFrameImpl_IsSupported() ...
  295. if( m_pNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement() )
  296. m_pNcFrameImpl->NcFrameImpl_RecalcNcFrame();
  297. else if( m_pNcFrameImpl->NcFrameImpl_IsSupported() )
  298. CExtNcFrameImpl::stat_SetWindowPlacement(
  299. hWndOwn,
  300. _wp
  301. );
  302. bool bContinueRecalc = true;
  303. while( bContinueRecalc )
  304. {
  305. bContinueRecalc = false;
  306. MSG _msg;
  307. while( ::PeekMessage( &_msg, NULL, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, PM_NOREMOVE ) )
  308. {
  309. if( ! ::GetMessage( &_msg, NULL, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED ) )
  310. break;
  311. ::DispatchMessage( &_msg );
  312. bContinueRecalc = true;
  313. }
  314. while( ::PeekMessage( &_msg, NULL, WM_NCCALCSIZE, WM_NCCALCSIZE, PM_NOREMOVE ) )
  315. {
  316. if( ! ::GetMessage( &_msg, NULL, WM_NCCALCSIZE, WM_NCCALCSIZE ) )
  317. break;
  318. ::DispatchMessage( &_msg );
  319. bContinueRecalc = true;
  320. }
  321. while( ::PeekMessage( &_msg, NULL, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, PM_NOREMOVE ) )
  322. {
  323. if( ! ::GetMessage( &_msg, NULL, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED ) )
  324. break;
  325. ::DispatchMessage( &_msg );
  326. bContinueRecalc = true;
  327. }
  328. while( ::PeekMessage( &_msg, NULL, WM_SIZE, WM_SIZE, PM_NOREMOVE ) )
  329. {
  330. if( ! ::GetMessage( &_msg, NULL, WM_SIZE, WM_SIZE ) )
  331. break;
  332. ::DispatchMessage( &_msg );
  333. bContinueRecalc = true;
  334. }
  335. } // while( bContinueRecalc )
  336. if( hWndSurface != NULL )
  337. {
  338. ::DestroyWindow( hWndSurface );
  339. CExtPaintManager::stat_PassPaintMessages();
  340. }
  341. if( ! m_pNcFrameImpl->NcFrameImpl_IsDwmBased() )
  342. {
  343. HWND hWndCheckZoomState = m_pNcFrameImpl->NcFrameImpl_OnQueryHWND();
  344. if( hWndCheckZoomState != NULL
  345. && ::IsWindow( hWndCheckZoomState )
  346. && ::IsZoomed( hWndCheckZoomState )
  347. && (! m_pNcFrameImpl->NcFrameImpl_IsSupported() )
  348. )
  349. {
  350. CExtPaintManager::monitor_parms_t _mp;
  351. CExtPaintManager::stat_GetMonitorParms( _mp, hWndCheckZoomState );
  352. ::SendMessage( hWndCheckZoomState, WM_SETREDRAW, 0L, 0L );
  353. MINMAXINFO _mmi;
  354. ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  355. _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  356. _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  357. _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width();
  358. _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height();
  359. _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  360. _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  361. _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  362. _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  363. ::SendMessage( hWndCheckZoomState, WM_GETMINMAXINFO, 0, LPARAM(&_mmi) );
  364. CSize maxSize(
  365. max( _mmi.ptMaxTrackSize.x, _mp.m_rcWorkArea.Width() ),
  366. max( _mmi.ptMaxTrackSize.y, _mp.m_rcWorkArea.Height() )
  367. );
  368. CRect rcMax( _mmi.ptMaxPosition, maxSize );
  369. WINDOWPLACEMENT _wp, _wp2;
  370. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  371. _wp.length = sizeof(WINDOWPLACEMENT);
  372. ::GetWindowPlacement( hWndCheckZoomState, &_wp );
  373. ::memcpy( &_wp2, &_wp, sizeof(WINDOWPLACEMENT) );
  374. ::CopyRect( &_wp2.rcNormalPosition, &rcMax );
  375. _wp2.showCmd = SW_SHOWMAXIMIZED;
  376. ::SetWindowPlacement( hWndCheckZoomState, &_wp2 );
  377. _wp.showCmd = SW_SHOWMAXIMIZED;
  378. ::SendMessage( hWndCheckZoomState, WM_SETREDRAW, 1L, 0L );
  379. ::SetWindowPlacement( hWndCheckZoomState, &_wp );
  380. }
  381. }
  382. m_pNcFrameImpl->m_bNcFrameImpl_InAdjustAdjustThemeSettings = false;
  383. }
  384. CExtNcFrameImpl::NcLock::NcLock( const CExtNcFrameImpl & _NcFrameImpl )
  385. : m_NcFrameImpl( _NcFrameImpl )
  386. , m_bLocked( true )
  387. {
  388. m_NcFrameImpl.NcFrameImpl_NcLock( true );
  389. }
  390. CExtNcFrameImpl::NcLock::~NcLock()
  391. {
  392. UnlockNow();
  393. }
  394. void CExtNcFrameImpl::NcLock::UnlockNow()
  395. {
  396. if( ! m_bLocked )
  397. return;
  398. m_bLocked = false;
  399. m_NcFrameImpl.NcFrameImpl_NcLock( false );
  400. }
  401. const UINT CExtNcFrameImpl::g_nMsgFindExtNcFrameImpl =
  402. ::RegisterWindowMessage(
  403. _T("CExtNcFrameImpl::g_nMsgFindExtNcFrameImpl")
  404. );
  405. CExtNcFrameImpl::CExtNcFrameImpl()
  406. : m_bNcFrameImpl_PivotPmSyncMode( false )
  407. , m_bNcFrameImpl_IsActive( false )
  408. , m_bNcFrameImpl_RgnSet( false )
  409. , m_bNcFrameImpl_RestoreBorder( false )
  410. , m_bNcFrameImpl_DelatayedFrameRecalc( false )
  411. , m_bNcFrameImpl_IsEnabled( true )
  412. , m_bNcFrameImpl_IsDwmBased( true )
  413. , m_bNcFrameImpl_Resizing( true )
  414. , m_bNcFrameImpl_Moving( true )
  415. , m_bNcFrameImpl_ResizingLoopTracking( false )
  416. , m_bNcFrameImpl_MovingLoopTracking( false )
  417. , m_bNcFrameImpl_QuickWindowPlacement( false )
  418. , m_rcNcFrameImpl_ScClose( 0, 0, 0, 0 )
  419. , m_rcNcFrameImpl_ScMaximize( 0, 0, 0, 0 )
  420. , m_rcNcFrameImpl_ScMinimize( 0, 0, 0, 0 )
  421. , m_rcNcFrameImpl_ScHelp( 0, 0, 0, 0 )
  422. , m_rcNcFrameImpl_Text( 0, 0, 0, 0 )
  423. , m_rcNcFrameImpl_Icon( 0, 0, 0, 0 )
  424. , m_nNcFrameImpl_ScTrackedButtonHover( 0 )
  425. , m_nNcFrameImpl_ScTrackedButtonPressed( 0 )
  426. , m_strNcFrameImpl_TipMinimize( _T("") )
  427. , m_strNcFrameImpl_TipMaximize( _T("") )
  428. , m_strNcFrameImpl_TipRestore( _T("") )
  429. , m_strNcFrameImpl_TipClose( _T("") )
  430. , m_strNcFrameImpl_TipHelp( _T("") )
  431. , m_dwNcFrameImpl_StyleInitial( 0 )
  432. , m_dwNcFrameImpl_StyleExInitial( 0 )
  433. , m_nNcFrameImpl_Lock( 0 )
  434. , m_nNcFrameImpl_LastCheckCursorHT( HTNOWHERE )
  435. , m_ptNcFrameImpl_LastCheckCursor( -32767, -32767 )
  436. , m_pNcFrameImplBridge( NULL )
  437. , m_bNcFrameImpl_HelperInsideNcHitTest( false )
  438. , m_bNcFrameImpl_RestoreEnabledState( false )
  439. , m_nNcFrameImpl_LastShowCmd( SW_HIDE )
  440. , m_bNcFrameImpl_NcInitPassed( false )
  441. , m_nNcFrameImpl_LastExternalNcHT( UINT(-1) )
  442. , m_rcNcFrameImpl_LastExternalNcHT( -1, -1, -1, -1 )
  443. , m_bNcFrameImpl_DwmSurfaceInitializationComplete( false )
  444. , m_bNcFrameImpl_CreatePassed( false )
  445. , m_bNcFrameImpl_AssigningRGN( false )
  446. , m_bNcFrameImpl_InAdjustAdjustThemeSettings( false )
  447. {
  448. ::memset( &m_NcFrameImpl_MinMaxInfo_Cache, 0, sizeof(MINMAXINFO) );
  449. m_BridgeNC.NcFrameImpl_Set( this );
  450. m_wndNcFrameImpl_Tip.SetTipStyle( CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON );
  451. m_wndNcFrameImpl_Tip.SetShadowSize( 0 );
  452. }
  453. CExtNcFrameImpl::~CExtNcFrameImpl()
  454. {
  455. m_wndNcFrameImpl_Tip.Hide();
  456. if( m_wndNcFrameImpl_Tip.GetSafeHwnd() != NULL )
  457. m_wndNcFrameImpl_Tip.DestroyWindow();
  458. m_BridgeNC.NcFrameImpl_Set( NULL );
  459. NcFrameImpl_MapHtRects_Clean();
  460. }
  461. void CExtNcFrameImpl::NcFrameImpl_SyncThemeSettings( CExtPaintManager * pPM, bool bPostNotification )
  462. {
  463. ASSERT( this != NULL );
  464. pPM;
  465. bPostNotification;
  466. }
  467. bool CExtNcFrameImpl::NcFrameImpl_GetWindowPlacement( WINDOWPLACEMENT & _wp ) const
  468. {
  469. ASSERT( this != NULL );
  470. CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  471. if( pWndFrameImpl->GetSafeHwnd() == NULL )
  472. return false;
  473. ASSERT_VALID( pWndFrameImpl );
  474. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  475. _wp.length = sizeof(WINDOWPLACEMENT);
  476. bool bRetVal = ::GetWindowPlacement( pWndFrameImpl->m_hWnd, &_wp ) ? true : false;
  477. return bRetVal;
  478. }
  479. bool CExtNcFrameImpl::NcFrameImpl_SetWindowPlacement( const WINDOWPLACEMENT & _wp )
  480. {
  481. ASSERT( this != NULL );
  482. CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  483. if( pWndFrameImpl->GetSafeHwnd() == NULL )
  484. return false;
  485. bool bRetVal = ::SetWindowPlacement( pWndFrameImpl->m_hWnd, &_wp ) ? true : false;
  486. return bRetVal;
  487. }
  488. BOOL CExtNcFrameImpl::GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  489. {
  490. ASSERT( this != NULL );
  491. if( pWP == NULL )
  492. return FALSE;
  493. return NcFrameImpl_GetWindowPlacement( *pWP ) ? TRUE : FALSE;
  494. }
  495. BOOL CExtNcFrameImpl::GetWindowPlacement( WINDOWPLACEMENT & _wp ) const
  496. {
  497. ASSERT( this != NULL );
  498. return NcFrameImpl_GetWindowPlacement( _wp ) ? TRUE : FALSE;
  499. }
  500. BOOL CExtNcFrameImpl::SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  501. {
  502. ASSERT( this != NULL );
  503. if( pWP == NULL )
  504. return FALSE;
  505. return NcFrameImpl_SetWindowPlacement( *pWP ) ? TRUE : FALSE;
  506. }
  507. BOOL CExtNcFrameImpl::SetWindowPlacement( const WINDOWPLACEMENT & _wp )
  508. {
  509. ASSERT( this != NULL );
  510. return NcFrameImpl_SetWindowPlacement( _wp ) ? TRUE : FALSE;
  511. }
  512. bool CExtNcFrameImpl::stat_GetWindowPlacement( HWND hWnd, WINDOWPLACEMENT & _wp )
  513. {
  514. if( hWnd == NULL || ( ! ::IsWindow( hWnd ) ) )
  515. return false;
  516. bool bRetVal = false;
  517. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  518. _wp.length = sizeof(WINDOWPLACEMENT);
  519. bRetVal = ::GetWindowPlacement( hWnd, &_wp ) ? true : false;
  520. return bRetVal;
  521. }
  522. bool CExtNcFrameImpl::stat_SetWindowPlacement( HWND hWnd, const WINDOWPLACEMENT & _wp )
  523. {
  524. if( hWnd == NULL || ( ! ::IsWindow( hWnd ) ) )
  525. return false;
  526. bool bRetVal = false;
  527. bRetVal = ::SetWindowPlacement( hWnd, &_wp ) ? true : false;
  528. return bRetVal;
  529. }
  530. void CExtNcFrameImpl::NcFrameImpl_CalcWindowRect(
  531. LPRECT lpClientRect,
  532. UINT nAdjustType // = UINT(CWnd::adjustBorder)
  533. )
  534. {
  535. ASSERT( this != NULL );
  536. ASSERT( lpClientRect != NULL );
  537. CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  538. ASSERT_VALID( pWndFrameImpl );
  539. if( NcFrameImpl_IsSupported() && ( ! NcFrameImpl_IsDwmBased() ) )
  540. {
  541. CExtPaintManager * pPM = NcFrameImpl_GetPM();
  542. ASSERT_VALID( pPM );
  543. CRect rcInflate, rcTmp;
  544. pPM->NcFrame_GetMetrics( rcInflate, rcTmp, pWndFrameImpl );
  545. bool bFrameActive = NcFrameImpl_IsActive();
  546. INT nAdjustCaptionHeight = 0;
  547. // if( m_pNcFrameImplBridge != NULL
  548. // && m_pNcFrameImplBridge->NcFrameImplBridge_OnQueryCaptionMergeMode()
  549. // )
  550. {
  551. nAdjustCaptionHeight =
  552. pPM->NcFrame_GetCaptionHeight(
  553. bFrameActive,
  554. pWndFrameImpl
  555. );
  556. rcInflate.top += nAdjustCaptionHeight;
  557. }
  558. lpClientRect->top     -=  rcInflate.top;
  559. lpClientRect->bottom  +=  rcInflate.bottom;
  560. lpClientRect->left    -=  rcInflate.left;
  561. lpClientRect->right   +=  rcInflate.right;
  562. }
  563. else
  564. {
  565. DWORD dwExStyle = pWndFrameImpl->GetExStyle();
  566. if( nAdjustType == 0 )
  567. dwExStyle &= ~WS_EX_CLIENTEDGE;
  568. ::AdjustWindowRectEx( lpClientRect, pWndFrameImpl->GetStyle(), FALSE, dwExStyle );
  569. }
  570. }
  571. bool CExtNcFrameImpl::stat_SaveWindowRect(
  572. HWND hWnd,
  573. __EXT_MFC_SAFE_LPCTSTR strSection,
  574. __EXT_MFC_SAFE_LPCTSTR strEntry
  575. )
  576. {
  577. if( LPCTSTR( strSection ) == NULL
  578. || LPCTSTR( strEntry ) == NULL
  579. || _tcslen( LPCTSTR( strSection ) ) == 0
  580. || _tcslen( LPCTSTR( strEntry ) ) == 0
  581. || hWnd == NULL
  582. || ( ! ::IsWindow( hWnd ) )
  583. )
  584. return false;
  585. CExtSafeString strWP;
  586. WINDOWPLACEMENT _wp;
  587. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  588. _wp.length = sizeof(WINDOWPLACEMENT);
  589. CExtControlBar::stat_GetWindowPlacement( hWnd, _wp );
  590. RECT & rc = _wp.rcNormalPosition;
  591. strWP.Format( _T("%d,%d,%d,%d,%d,%d"), rc.left, rc.top, rc.right, rc.bottom, _wp.showCmd, _wp.flags );
  592. ::AfxGetApp()->WriteProfileString( strSection, strEntry, __EXT_MFC_SAFE_LPCTSTR( strWP ) );
  593. return true;
  594. }
  595. bool CExtNcFrameImpl::stat_LoadWindowRect(
  596. HWND hWnd,
  597. __EXT_MFC_SAFE_LPCTSTR strSection,
  598. __EXT_MFC_SAFE_LPCTSTR strEntry,
  599. bool bForceHideWindow // = false
  600. )
  601. {
  602. if( LPCTSTR( strSection ) == NULL
  603. || LPCTSTR( strEntry ) == NULL
  604. || _tcslen( LPCTSTR( strSection ) ) == 0
  605. || _tcslen( LPCTSTR( strEntry ) ) == 0
  606. || hWnd == NULL
  607. || ( ! ::IsWindow( hWnd ) )
  608. )
  609. return false;
  610. CExtSafeString strWP;
  611. WINDOWPLACEMENT _wp;
  612. strWP = ::AfxGetApp()->GetProfileString( strSection, strEntry );
  613. if( strWP.IsEmpty() )
  614. return false;
  615. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  616. _wp.length = sizeof(WINDOWPLACEMENT);
  617. CExtControlBar::stat_GetWindowPlacement( hWnd, _wp );
  618. RECT & rc = _wp.rcNormalPosition;
  619. if( __EXT_MFC_STSCANF(
  620. __EXT_MFC_SAFE_LPCTSTR( strWP ),
  621. __EXT_MFC_SAFE_LPCTSTR( _T("%d,%d,%d,%d,%d,%d") ),
  622. &rc.left, 
  623. &rc.top, 
  624. &rc.right, 
  625. &rc.bottom,
  626. &_wp.showCmd,
  627. &_wp.flags
  628. ) == 6
  629. )
  630. {
  631. if( bForceHideWindow )
  632. _wp.showCmd = SW_HIDE;
  633. CExtControlBar::stat_SetWindowPlacement( hWnd, _wp );
  634. }
  635. ::RedrawWindow( hWnd, NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_FRAME );
  636. return true;
  637. }
  638. void CExtNcFrameImpl::stat_MDI_GetWindowList(
  639. HWND hWndMdiClient,
  640. CList < HWND, HWND > & _list,
  641. CList < HWND, HWND > & _listWindowsToSkip,
  642. bool bAddActiveToTail,
  643. bool bIncludeEnabled,
  644. bool bIncludeDisabled,
  645. bool bIncludeIconic,
  646. bool bIncludeNonIconic,
  647. bool bIncludeWithOwner,
  648. bool bIncludeWithoutOwner,
  649. bool bIncludeVisible, // = true
  650. bool bIncludeHidden // = false
  651. )
  652. {
  653. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  654. _list.RemoveAll();
  655. BOOL bMax = FALSE;
  656. HWND hWndActiveMdiChildFrame = (HWND) ::SendMessage( hWndMdiClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMax );
  657. HWND hWnd = ::GetWindow( hWndMdiClient, GW_CHILD );
  658. for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDNEXT ) )
  659. {
  660. bool bAdd = false;
  661. bool bEnabled = ::IsWindowEnabled( hWnd ) ? true : false;
  662. if(   bEnabled  && bIncludeEnabled )
  663. bAdd = true;
  664. else if( (!bEnabled) && bIncludeDisabled )
  665. bAdd = true;
  666. if( ! bAdd )
  667. {
  668. if( hWnd == hWndActiveMdiChildFrame )
  669. hWndActiveMdiChildFrame = NULL;
  670. continue;
  671. }
  672. bAdd = false;
  673. bool bIconic = ::IsIconic( hWnd ) ? true : false;
  674. if(   bIconic   && bIncludeIconic )
  675. bAdd = true;
  676. else if( (!bIconic)  && bIncludeNonIconic )
  677. bAdd = true;
  678. if( ! bAdd )
  679. {
  680. if( hWnd == hWndActiveMdiChildFrame )
  681. hWndActiveMdiChildFrame = NULL;
  682. continue;
  683. }
  684. bAdd = false;
  685. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWnd, GWL_STYLE );
  686. bool bVisible = ( ( dwStyle & WS_VISIBLE ) != 0 ) ? true : false;
  687. if(   bVisible  && bIncludeVisible )
  688. bAdd = true;
  689. else if( (!bVisible) && bIncludeHidden )
  690. bAdd = true;
  691. if( ! bAdd )
  692. {
  693. if( hWnd == hWndActiveMdiChildFrame )
  694. hWndActiveMdiChildFrame = NULL;
  695. continue;
  696. }
  697. bAdd = false;
  698. HWND hWndOwner = ::GetWindow( hWnd, GW_OWNER );
  699. if(  bIncludeWithOwner    && ( hWndOwner != NULL ) )
  700. bAdd = true;
  701. else if( bIncludeWithoutOwner && ( hWndOwner == NULL ) )
  702. bAdd = true;
  703. if( ! bAdd )
  704. {
  705. if( hWnd == hWndActiveMdiChildFrame )
  706. hWndActiveMdiChildFrame = NULL;
  707. continue;
  708. }
  709. bAdd = true;
  710. if( bAddActiveToTail && hWndActiveMdiChildFrame == hWnd )
  711. {
  712. if( bAdd )
  713. bAdd = false;
  714. else
  715. hWndActiveMdiChildFrame = NULL;
  716. }
  717. if( ! bAdd )
  718. continue;
  719. if( bAdd
  720. && _listWindowsToSkip.Find( hWnd )
  721. )
  722. bAdd = false;
  723. if( ! bAdd )
  724. {
  725. if( hWnd == hWndActiveMdiChildFrame )
  726. hWndActiveMdiChildFrame = NULL;
  727. continue;
  728. }
  729. if( bAdd )
  730. {
  731. TCHAR szCompare[512] = _T("");
  732. ::GetClassName(
  733. hWnd,
  734. szCompare,
  735. sizeof( szCompare )/sizeof( szCompare[0] )
  736. );
  737. if( _tcsicmp( szCompare, _T("Static") ) == 0 )
  738. bAdd = false;
  739. }
  740. if( ! bAdd )
  741. {
  742. if( hWnd == hWndActiveMdiChildFrame )
  743. hWndActiveMdiChildFrame = NULL;
  744. continue;
  745. }
  746. _list.AddTail( hWnd );
  747. }
  748. if( bAddActiveToTail && hWndActiveMdiChildFrame != NULL )
  749. _list.AddTail( hWndActiveMdiChildFrame );
  750. }
  751. INT CExtNcFrameImpl::stat_MDI_ArrangeIconic(
  752. HWND hWndMdiClient,
  753. CList < HWND, HWND > & _listWindowsToSkip
  754. )
  755. {
  756. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  757. CList < HWND, HWND > _list;
  758. stat_MDI_GetWindowList(
  759. hWndMdiClient,
  760. _list,
  761. _listWindowsToSkip,
  762. false, // bAddActiveToTail
  763. true,  // bIncludeEnabled
  764. true,  // bIncludeDisabled
  765. true,  // bIncludeIconic
  766. false, // bIncludeNonIconic
  767. false, // bIncludeWithOwner,
  768. true   // bIncludeWithoutOwner,
  769. );
  770. INT nRetVal = stat_MDI_ArrangeIconicEWL( hWndMdiClient, _list );
  771. return nRetVal;
  772. }
  773. INT CExtNcFrameImpl::stat_MDI_ArrangeIconicEWL( // explicit window list based version
  774. HWND hWndMdiClient,
  775. CList < HWND, HWND > & _list
  776. )
  777. {
  778. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  779. INT nIndex, nCount = INT( _list.GetCount() );
  780. if( nCount == 0 )
  781. return 0;
  782. INT nCaptionHeight = -1;
  783. INT nBorderHeightX2 = -1;
  784. CExtPaintManager * pPM = g_PaintManager.GetPM();
  785. ASSERT_VALID( pPM );
  786. POSITION pos = _list.GetHeadPosition();
  787. if( pos != NULL )
  788. {
  789. HWND hWnd = _list.GetNext( pos );
  790. ASSERT( hWnd != NULL && ::IsWindow( hWnd ) );
  791. CWnd * pWnd = CWnd::FromHandle( hWnd );
  792. nCaptionHeight = pPM->NcFrame_GetCaptionHeight( true, pWnd );
  793. CRect rcNcBorders, rcThemePadding;
  794. pPM->NcFrame_GetMetrics( rcNcBorders, rcThemePadding, pWnd );
  795. nBorderHeightX2 = rcNcBorders.top + rcNcBorders.bottom;
  796. }
  797. if( nCaptionHeight <= 0 )
  798. nCaptionHeight = ::GetSystemMetrics( SM_CYCAPTION );
  799. nBorderHeightX2 = ::GetSystemMetrics( SM_CYBORDER ) * 2;
  800. CSize sizeItem(
  801. ::GetSystemMetrics( SM_CXSMICON )
  802. + ::GetSystemMetrics( SM_CXBORDER ) * 2
  803. + 142
  804. ,
  805. nCaptionHeight + nBorderHeightX2
  806. );
  807. CSize sizeSpacing( 0, 0 );
  808. CRect rcClient;
  809.     GetClientRect( hWndMdiClient, &rcClient );
  810. CSize sizeClient = rcClient.Size();
  811. INT nCountInRow = sizeClient.cx / ( sizeItem.cx + sizeSpacing.cx );
  812. HDWP hDWP = ::BeginDeferWindowPos( nCount );
  813. pos = _list.GetHeadPosition();
  814.     for( nIndex = 0; nIndex < nCount; nIndex ++ )
  815. {
  816. ASSERT( pos != NULL );
  817. HWND hWnd = _list.GetNext( pos );
  818. ASSERT( hWnd != NULL && ::IsWindow( hWnd ) );
  819. INT nRow = nIndex / nCountInRow;
  820. INT nColumn = nIndex % nCountInRow;
  821. hDWP =
  822. ::DeferWindowPos(
  823. hDWP, hWnd, NULL,
  824. nColumn * ( sizeSpacing.cx + sizeItem.cx ),
  825. sizeClient.cy - ( nRow + 1) * ( sizeSpacing.cy + sizeItem.cy ),
  826. sizeItem.cx, sizeItem.cy,
  827. SWP_NOZORDER|SWP_NOACTIVATE
  828. );
  829. }
  830. ::EndDeferWindowPos( hDWP );
  831. INT nRetVal = sizeItem.cy + sizeSpacing.cy;
  832. return nRetVal;
  833. }
  834. void CExtNcFrameImpl::stat_MDI_Cascade(
  835. HWND hWndMdiClient,
  836. CList < HWND, HWND > & _listWindowsToSkip,
  837. WPARAM nActionFlags,
  838. INT nStairWindowCount // = 0 // zero or negative - compute automatically
  839. )
  840. {
  841. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  842. CList < HWND, HWND > _list;
  843. stat_MDI_GetWindowList(
  844. hWndMdiClient,
  845. _list,
  846. _listWindowsToSkip,
  847. true,  // bAddActiveToTail
  848. true,  // bIncludeEnabled
  849. ( ( nActionFlags & MDITILE_SKIPDISABLED ) == 0 ) ? true : false, // bIncludeDisabled
  850. false, // bIncludeIconic
  851. true,  // bIncludeNonIconic
  852. false, // bIncludeWithOwner,
  853. true   // bIncludeWithoutOwner,
  854. );
  855. stat_MDI_CascadeEWL( hWndMdiClient, _list, nStairWindowCount );
  856. }
  857. void CExtNcFrameImpl::stat_MDI_CascadeEWL( // explicit window list based version
  858. HWND hWndMdiClient,
  859. CList < HWND, HWND > & _list,
  860. INT nStairWindowCount // = 0 // zero or negative - compute automatically
  861. )
  862. {
  863. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  864. INT nIndex, nCount = INT( _list.GetCount() );
  865. if( nCount == 0 )
  866. return;
  867. if( nStairWindowCount <= 0 )
  868. nStairWindowCount = 7;
  869.     ShowScrollBar( hWndMdiClient, SB_BOTH, FALSE );
  870. INT nStepX = ::GetSystemMetrics( SM_CYCAPTION ) - ::GetSystemMetrics( SM_CYFRAME );
  871. INT nStepY = ::GetSystemMetrics( SM_CYCAPTION ) + ::GetSystemMetrics( SM_CYFRAME ) - 1;
  872. CRect rcClient;
  873.     GetClientRect( hWndMdiClient, &rcClient );
  874. // rcClient.bottom -= stat_MDI_ArrangeIconicEWL( hWndMdiClient, _list );
  875. CList < HWND, HWND > _listWindowsToSkip;
  876. rcClient.bottom -= stat_MDI_ArrangeIconic( hWndMdiClient, _listWindowsToSkip );
  877. CSize sizeClient = rcClient.Size();
  878. CSize sizeChild( sizeClient.cx - nStepX * nStairWindowCount, sizeClient.cy - nStepY * nStairWindowCount );
  879. HDWP hDWP = ::BeginDeferWindowPos( nCount );
  880. POSITION pos = _list.GetHeadPosition();
  881.     for( nIndex = 0; nIndex < nCount; nIndex ++ )
  882. {
  883. ASSERT( pos != NULL );
  884. HWND hWnd = _list.GetNext( pos );
  885. ASSERT( hWnd != NULL && ::IsWindow( hWnd ) );
  886. INT nDI = nIndex % nStairWindowCount;
  887. hDWP =
  888. ::DeferWindowPos(
  889. hDWP, hWnd, HWND_TOP,
  890. nDI * nStepX, nDI * nStepY, sizeChild.cx, sizeChild.cy,
  891. SWP_NOACTIVATE|SWP_FRAMECHANGED
  892. );
  893.     }
  894. ::EndDeferWindowPos( hDWP );
  895. }
  896. void CExtNcFrameImpl::stat_MDI_Tile(
  897. HWND hWndMdiClient,
  898. CList < HWND, HWND > & _listWindowsToSkip,
  899. WPARAM nActionFlags
  900. )
  901. {
  902. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  903. CList < HWND, HWND > _list;
  904. stat_MDI_GetWindowList(
  905. hWndMdiClient,
  906. _list,
  907. _listWindowsToSkip,
  908. true,  // bAddActiveToTail
  909. true,  // bIncludeEnabled
  910. ( ( nActionFlags & MDITILE_SKIPDISABLED ) == 0 ) ? true : false, // bIncludeDisabled
  911. false, // bIncludeIconic
  912. true,  // bIncludeNonIconic
  913. false, // bIncludeWithOwner,
  914. true   // bIncludeWithoutOwner,
  915. );
  916. bool bHorizontal = ( ( nActionFlags & MDITILE_HORIZONTAL ) != 0 ) ? true : false;
  917. stat_MDI_TileEWL( hWndMdiClient, _list, bHorizontal );
  918. }
  919. void CExtNcFrameImpl::stat_MDI_TileEWL( // explicit window list based version
  920. HWND hWndMdiClient,
  921. CList < HWND, HWND > & _list,
  922. bool bHorizontal
  923. )
  924. {
  925. ASSERT( hWndMdiClient != NULL && ::IsWindow( hWndMdiClient ) );
  926. INT nCount = INT( _list.GetCount() );
  927. if( nCount == 0 )
  928. return;
  929.     ShowScrollBar( hWndMdiClient, SB_BOTH, FALSE );
  930. CRect rcClient;
  931.     GetClientRect( hWndMdiClient, &rcClient );
  932. // rcClient.bottom -= stat_MDI_ArrangeIconicEWL( hWndMdiClient, _list );
  933. CList < HWND, HWND > _listWindowsToSkip;
  934. rcClient.bottom -= stat_MDI_ArrangeIconic( hWndMdiClient, _listWindowsToSkip );
  935. CSize sizeClient = rcClient.Size();
  936. INT nRest = 1;
  937. INT nIndexX = (INT)::sqrt( (double)nCount );
  938. INT nIndexY = nIndexX;
  939.     if( nIndexY == 1 )
  940. {
  941. if( bHorizontal )
  942. nIndexY = nCount;
  943. else
  944. nIndexX = nCount;
  945. }
  946. else
  947. {
  948. for( ; true; )
  949. {
  950. nRest = nCount - nIndexY * ( nIndexX - 1 );
  951. if( bHorizontal )
  952. {
  953. if( ( nRest - nIndexX ) >= nIndexY )
  954. nIndexY ++;
  955. else
  956. break;
  957. }
  958. else
  959. {
  960. if( ( nRest - nIndexY ) >= nIndexX )
  961. nIndexX ++;
  962. else
  963. break;
  964. }
  965. }
  966.     }
  967. CSize sizeChild( sizeClient.cx / nIndexX, sizeClient.cy / nIndexY );
  968. HDWP hDWP = ::BeginDeferWindowPos( nCount );
  969. POSITION pos = _list.GetHeadPosition();
  970. INT nWalkIndex = 0, nX, nY;
  971. for( nX = 0, nY = 0; nX < nCount; nX ++ )
  972. {
  973. ASSERT( pos != NULL );
  974. HWND hWnd = _list.GetNext( pos );
  975. ASSERT( hWnd != NULL && ::IsWindow( hWnd ) );
  976. CPoint ptTopLeft( 0, 0 );
  977. if( bHorizontal )
  978. {
  979. ptTopLeft.x = ( nWalkIndex - nY * nIndexX ) * sizeChild.cx;
  980. ptTopLeft.y = nY * sizeChild.cy;
  981. if( ( ( nWalkIndex % nIndexX ) == ( nIndexX - 1 ) )
  982. && ( nY < ( nIndexY - 1 ) )
  983. )
  984. nY ++;
  985. }
  986. else
  987. {
  988. ptTopLeft.x = nY * sizeChild.cx;
  989. ptTopLeft.y = ( nWalkIndex - nY * nIndexY ) * sizeChild.cy;
  990. if( ( ( nWalkIndex % nIndexY ) == ( nIndexY - 1 ) )
  991. && ( nY < ( nIndexX - 1 ) )
  992. )
  993. nY ++;
  994. }
  995. hDWP =
  996. ::DeferWindowPos(
  997. hDWP, hWnd, NULL,
  998. ptTopLeft.x, ptTopLeft.y, sizeChild.cx, sizeChild.cy,
  999. SWP_NOACTIVATE|SWP_NOZORDER
  1000. );
  1001. if( bHorizontal )
  1002. {
  1003. if( nY == ( nIndexY - 1 ) )
  1004. sizeChild.cx = sizeClient.cx / nRest;
  1005. }
  1006. else
  1007. {
  1008. if( nY == ( nIndexX - 1 ) )
  1009. sizeChild.cy = sizeClient.cy / nRest;
  1010. }
  1011. nWalkIndex ++;
  1012. }
  1013. ::EndDeferWindowPos( hDWP );
  1014. }
  1015. void CExtNcFrameImpl::NcFrameImpl_MapHtRects_Clean()
  1016. {
  1017. POSITION pos = m_mapNcFrameImpl_HtRects.GetStartPosition();
  1018. for( ; pos != NULL; )
  1019. {
  1020. LPVOID p1, p2;
  1021. m_mapNcFrameImpl_HtRects.GetNextAssoc( pos, p1, p2 );
  1022. ASSERT( p2 != NULL );
  1023. RECT * pRect = ( RECT * ) p2;
  1024. delete pRect;
  1025. } // for( ; pos != NULL; )
  1026. m_mapNcFrameImpl_HtRects.RemoveAll();
  1027. }
  1028. void CExtNcFrameImpl::NcFrameImpl_MapHtRects_SetAt( LONG nHT, const RECT & rc ) const
  1029. {
  1030. LPVOID p;
  1031. if( m_mapNcFrameImpl_HtRects.Lookup( LPVOID(__EXT_MFC_LONG_PTR(nHT)), p ) )
  1032. {
  1033. ASSERT( p != NULL );
  1034. RECT * pRect = ( RECT * ) p;
  1035. pRect->left = rc.left;
  1036. pRect->top = rc.top;
  1037. pRect->right = rc.right;
  1038. pRect->bottom = rc.bottom;
  1039. }
  1040. else
  1041. {
  1042. RECT * pRect = new RECT;
  1043. pRect->left = rc.left;
  1044. pRect->top = rc.top;
  1045. pRect->right = rc.right;
  1046. pRect->bottom = rc.bottom;
  1047. m_mapNcFrameImpl_HtRects.SetAt( LPVOID(__EXT_MFC_LONG_PTR(nHT)), pRect );
  1048. }
  1049. }
  1050. bool CExtNcFrameImpl::NcFrameImpl_MapHtRects_GetAt( LONG nHT, RECT & rc ) const
  1051. {
  1052. LPVOID p;
  1053. if( m_mapNcFrameImpl_HtRects.Lookup( LPVOID(__EXT_MFC_LONG_PTR(nHT)), p ) )
  1054. {
  1055. ASSERT( p != NULL );
  1056. RECT * pRect = ( RECT * ) p;
  1057. rc.left = pRect->left;
  1058. rc.top = pRect->top;
  1059. rc.right = pRect->right;
  1060. rc.bottom = pRect->bottom;
  1061. return true;
  1062. }
  1063. return false;
  1064. }
  1065. bool CExtNcFrameImpl::NcFrameImpl_IsNcLocked() const
  1066. {
  1067. ASSERT( m_nNcFrameImpl_Lock >= 0 );
  1068. if( m_nNcFrameImpl_Lock == 0 )
  1069. return false;
  1070. else
  1071. return true;
  1072. }
  1073. void CExtNcFrameImpl::NcFrameImpl_NcLock( bool bLock ) const
  1074. {
  1075. ASSERT( m_nNcFrameImpl_Lock >= 0 );
  1076. if( bLock )
  1077. m_nNcFrameImpl_Lock ++;
  1078. else
  1079. m_nNcFrameImpl_Lock --;
  1080. ASSERT( m_nNcFrameImpl_Lock >= 0 );
  1081. }
  1082. DWORD CExtNcFrameImpl::NcFrameImpl_GetInitialStyle() const
  1083. {
  1084. return (DWORD)m_dwNcFrameImpl_StyleInitial;
  1085. }
  1086. DWORD CExtNcFrameImpl::NcFrameImpl_GetInitialStyleEx() const
  1087. {
  1088. return (DWORD)m_dwNcFrameImpl_StyleExInitial;
  1089. }
  1090. HWND CExtNcFrameImpl::NcFrameImpl_OnQueryHWND() const
  1091. {
  1092. return ( const_cast < CExtNcFrameImpl * > (this) ) -> NcFrameImpl_OnQueryHWND();
  1093. }
  1094. CWnd * CExtNcFrameImpl::NcFrameImpl_GetFrameWindow()
  1095. {
  1096. HWND hWnd = NcFrameImpl_OnQueryHWND();
  1097. if( hWnd == NULL )
  1098. return NULL;
  1099. ASSERT( ::IsWindow( hWnd ) );
  1100. return CWnd::FromHandle( hWnd );
  1101. }
  1102. const CWnd * CExtNcFrameImpl::NcFrameImpl_GetFrameWindow() const
  1103. {
  1104. return ( const_cast < CExtNcFrameImpl * > (this) ) -> NcFrameImpl_GetFrameWindow();
  1105. }
  1106. CRect CExtNcFrameImpl::NcFrameImpl_GetNcHtRect(
  1107. UINT nHT,
  1108. LPMINMAXINFO pMinMaxInfo,
  1109. LPCRECT pRectWnd // = NULL
  1110. ) const
  1111. {
  1112. return
  1113. NcFrameImpl_GetNcHtRect(
  1114. nHT,
  1115. true,
  1116. false,
  1117. false,
  1118. pMinMaxInfo,
  1119. pRectWnd
  1120. );
  1121. }
  1122. CRect CExtNcFrameImpl::NcFrameImpl_GetNcHtRect(
  1123. UINT nHT,
  1124. bool bScreenMapping, // = true
  1125. bool bLayoutBordersH, // = false
  1126. bool bLayoutBordersV, // = false
  1127. LPMINMAXINFO pMinMaxInfo, // = NULL
  1128. LPCRECT pRectWnd // = NULL
  1129. ) const
  1130. {
  1131. if( m_pNcFrameImplBridge != NULL )
  1132. {
  1133. CRect rc;
  1134. if( m_pNcFrameImplBridge->
  1135. NcFrameImpl_GetNcHtRect(
  1136. rc,
  1137. nHT,
  1138. bScreenMapping,
  1139. bLayoutBordersH,
  1140. bLayoutBordersV,
  1141. pMinMaxInfo,
  1142. pRectWnd
  1143. )
  1144. )
  1145. return rc;
  1146. }
  1147. RECT rc = { 0, 0, 0, 0 };
  1148. if( NcFrameImpl_MapHtRects_GetAt( LONG(nHT), rc ) )
  1149. {
  1150. if( bScreenMapping )
  1151. {
  1152. CRect rcWnd( 0, 0, 0, 0 );
  1153. if( pRectWnd != NULL )
  1154. rcWnd = (*pRectWnd);
  1155. else
  1156. {
  1157.   CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1158.   ASSERT_VALID( pWndFrameImpl );
  1159. pWndFrameImpl->GetWindowRect( &rcWnd );
  1160. } // else from if( pRectWnd != NULL )
  1161. ::OffsetRect( &rc, rcWnd.left, rcWnd.top );
  1162. } // if( bScreenMapping )
  1163. } // if( NcFrameImpl_MapHtRects_GetAt( LONG(nHT), rc ) )
  1164. else
  1165. {
  1166. CExtCmdIcon _icon;
  1167. NcFrameImpl_GetIcon( _icon );
  1168. CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1169. ASSERT_VALID( pWndFrameImpl );
  1170. rc =
  1171. NcFrameImpl_GetPM()->NcFrame_GetHtRect(
  1172. nHT,
  1173. bScreenMapping,
  1174. bLayoutBordersH,
  1175. bLayoutBordersV,
  1176. &_icon,
  1177. pWndFrameImpl,
  1178. pMinMaxInfo
  1179. );
  1180. CRect rc2 = rc;
  1181. if( bScreenMapping )
  1182. {
  1183. CRect rcWnd( 0, 0, 0, 0 );
  1184. if( pRectWnd != NULL )
  1185. rcWnd = (*pRectWnd);
  1186. else
  1187. {
  1188.   CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1189.   ASSERT_VALID( pWndFrameImpl );
  1190. pWndFrameImpl->GetWindowRect( &rcWnd );
  1191. } // else from if( pRectWnd != NULL )
  1192. ::OffsetRect( &rc, -rcWnd.left, -rcWnd.top );
  1193. } // if( bScreenMapping )
  1194. NcFrameImpl_MapHtRects_SetAt( LONG(nHT), rc2 );
  1195. } // else from if( NcFrameImpl_MapHtRects_GetAt( LONG(nHT), rc1 ) )
  1196. return rc;
  1197. }
  1198. CRect CExtNcFrameImpl::NcFrameImpl_GetNcScRect( UINT nSC ) const
  1199. {
  1200. if( m_rcNcFrameImpl_ScClose.IsRectEmpty() )
  1201. NcFrameImpl_ReCacheScButtonRects();
  1202. if( m_pNcFrameImplBridge != NULL )
  1203. {
  1204. CRect rc;
  1205. if( m_pNcFrameImplBridge->NcFrameImplBridge_GetNcScRect( nSC, rc ) )
  1206. {
  1207. switch( nSC )
  1208. {
  1209. case SC_CLOSE:
  1210. m_rcNcFrameImpl_ScClose = rc;
  1211. case SC_MAXIMIZE:
  1212. case SC_RESTORE:
  1213. m_rcNcFrameImpl_ScMaximize = rc;
  1214. case SC_MINIMIZE:
  1215. m_rcNcFrameImpl_ScMinimize = rc;
  1216. case SC_CONTEXTHELP:
  1217. m_rcNcFrameImpl_ScHelp = rc;
  1218. } // switch( nSC )
  1219. return rc;
  1220. }
  1221. }
  1222. switch( nSC )
  1223. {
  1224. case SC_CLOSE:
  1225. return m_rcNcFrameImpl_ScClose;
  1226. case SC_RESTORE:
  1227. if( NcFrameImpl_GetFrameWindow() != NULL
  1228. && NcFrameImpl_GetFrameWindow()->IsIconic()
  1229. )
  1230. return m_rcNcFrameImpl_ScMinimize;
  1231. case SC_MAXIMIZE:
  1232. return m_rcNcFrameImpl_ScMaximize;
  1233. case SC_MINIMIZE:
  1234. return m_rcNcFrameImpl_ScMinimize;
  1235. case SC_CONTEXTHELP:
  1236. return m_rcNcFrameImpl_ScHelp;
  1237. } // switch( nSC )
  1238. return CRect( 0, 0, 0, 0 );
  1239. }
  1240. void CExtNcFrameImpl::NcFrameImpl_GetIcon( CExtCmdIcon & _icon ) const
  1241. {
  1242. _icon.Empty();
  1243. if( ! m_iconNcFrameImpl_QueryCache.IsEmpty() )
  1244. {
  1245. _icon = m_iconNcFrameImpl_QueryCache;
  1246. return;
  1247. }
  1248. const CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1249. HWND hWnd = (HWND)pWndFrameImpl->GetSafeHwnd();
  1250. if( hWnd == NULL )
  1251. return;
  1252. HICON hIcon = (HICON)
  1253. ::SendMessage(
  1254. hWnd,
  1255. WM_GETICON,
  1256. WPARAM(ICON_SMALL),
  1257. 0
  1258. );
  1259. if( hIcon == NULL )
  1260. {
  1261. hIcon = (HICON)
  1262. ::SendMessage(
  1263. hWnd,
  1264. WM_GETICON,
  1265. WPARAM(ICON_BIG),
  1266. 0
  1267. );
  1268. if( hIcon == NULL )
  1269. {
  1270. hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::__EXT_MFC_GetClassLong( hWnd, __EXT_MFC_GCL_HICONSM );
  1271. if( hIcon == NULL )
  1272. {
  1273. hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::__EXT_MFC_GetClassLong( hWnd, __EXT_MFC_GCL_HICON );
  1274. } // if( hIcon == NULL )
  1275. } // if( hIcon == NULL )
  1276. } // if( hIcon == NULL )
  1277. if( hIcon == NULL )
  1278. return;
  1279. _icon.AssignFromHICON( hIcon, true );
  1280. CSize _sizeIcon = _icon.GetSize();
  1281. if( _sizeIcon.cx != 16 || _sizeIcon.cy != 16 )
  1282. _icon.Scale( CSize(16,16) );
  1283. m_iconNcFrameImpl_QueryCache = _icon;
  1284. }
  1285. void CExtNcFrameImpl::NcFrameImpl_ReCacheScButtonRects() const
  1286. {
  1287. CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1288. ASSERT_VALID( pWndFrameImpl );
  1289. CExtCmdIcon _icon;
  1290. NcFrameImpl_GetIcon( _icon );
  1291. CString strCaption;
  1292. pWndFrameImpl->GetWindowText( strCaption );
  1293. //MINMAXINFO _mmi, * pMinMaxInfo = NULL;
  1294. // ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  1295. // CExtPaintManager::monitor_parms_t _mp;
  1296. // CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );
  1297. // _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  1298. // _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  1299. // _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  1300. // _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  1301. // _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  1302. // _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  1303. // _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  1304. // _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  1305. // if( pWndFrameImpl->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  1306. // pMinMaxInfo = &_mmi;
  1307. MINMAXINFO * pMinMaxInfo = (MINMAXINFO*)(&m_NcFrameImpl_MinMaxInfo_Cache);
  1308. NcFrameImpl_GetPM()->NcFrame_GetRects(
  1309. &_icon,
  1310. LPCTSTR(strCaption),
  1311. DT_LEFT|DT_VCENTER,
  1312. m_rcNcFrameImpl_Icon,
  1313. m_rcNcFrameImpl_Text,
  1314. m_rcNcFrameImpl_ScHelp,
  1315. m_rcNcFrameImpl_ScMinimize,
  1316. m_rcNcFrameImpl_ScMaximize,
  1317. m_rcNcFrameImpl_ScClose,
  1318. pWndFrameImpl,
  1319. pMinMaxInfo
  1320. );
  1321. if( m_pNcFrameImplBridge != NULL )
  1322. {
  1323. m_pNcFrameImplBridge->NcFrameImplBridge_GetNcScRect( SC_CLOSE, m_rcNcFrameImpl_ScClose );
  1324. m_pNcFrameImplBridge->NcFrameImplBridge_GetNcScRect( SC_MAXIMIZE, m_rcNcFrameImpl_ScMaximize );
  1325. m_pNcFrameImplBridge->NcFrameImplBridge_GetNcScRect( SC_MINIMIZE, m_rcNcFrameImpl_ScMinimize );
  1326. m_pNcFrameImplBridge->NcFrameImplBridge_GetNcScRect( SC_CONTEXTHELP, m_rcNcFrameImpl_ScHelp );
  1327. } // if( m_pNcFrameImplBridge != NULL )
  1328. }
  1329. void CExtNcFrameImpl::NcFrameImpl_DelayRgnAdjustment()
  1330. {
  1331. if( NcFrameImpl_IsDwmBased() )
  1332. return;
  1333. m_bNcFrameImpl_RgnSet = false;
  1334. }
  1335. void CExtNcFrameImpl::NcFrameImpl_SetupRgn(
  1336. WINDOWPOS * pWndPos // = NULL
  1337. )
  1338. {
  1339. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1340. ASSERT_VALID( pWndFrameImpl );
  1341. if( NcFrameImpl_IsDwmBased() )
  1342. {
  1343. m_bNcFrameImpl_AssigningRGN = true;
  1344. pWndFrameImpl->SetWindowRgn( NULL, TRUE );
  1345. m_bNcFrameImpl_AssigningRGN = false;
  1346. return;
  1347. }
  1348. if( NcFrameImpl_IsNcLocked() )
  1349. return;
  1350. m_nNcFrameImpl_LastCheckCursorHT = HTNOWHERE;
  1351. m_ptNcFrameImpl_LastCheckCursor.x = m_ptNcFrameImpl_LastCheckCursor.y = -32767;
  1352. m_bNcFrameImpl_RgnSet = true;
  1353. __EXT_MFC_LONG_PTR dwStyle = m_dwNcFrameImpl_StyleInitial; // pWndFrameImpl->GetStyle();
  1354. if( (dwStyle&WS_BORDER) == 0 )
  1355. return;
  1356. CRect rcWnd( 0, 0, 0, 0 );
  1357. if( pWndPos != NULL )
  1358. {
  1359. if( ( pWndPos->flags & SWP_NOSIZE) !=  0 )
  1360. return;
  1361. rcWnd.right = rcWnd.left + pWndPos->cx;
  1362. rcWnd.bottom = rcWnd.top + pWndPos->cy;
  1363. }
  1364. else
  1365. {
  1366. pWndFrameImpl->GetWindowRect( &rcWnd );
  1367. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  1368. }
  1369. m_rcNcFrameImpl_ScClose.SetRectEmpty();
  1370. m_rcNcFrameImpl_ScMaximize.SetRectEmpty();
  1371. m_rcNcFrameImpl_ScMinimize.SetRectEmpty();
  1372. m_rcNcFrameImpl_ScHelp.SetRectEmpty();
  1373. HRGN hRgn =
  1374. NcFrameImpl_GetPM()->NcFrame_GenerateSkinFrameRGN(
  1375. rcWnd,
  1376. pWndFrameImpl
  1377. );
  1378. if( m_pNcFrameImplBridge != NULL )
  1379. {
  1380. HRGN hRgnExclude = m_pNcFrameImplBridge->NcFrameImplBridge_GetNcExcludeHRGN();
  1381. if( hRgnExclude != NULL )
  1382. {
  1383. CRect rcBox( 0, 0, 0, 0 ); 
  1384. GetRgnBox( hRgnExclude, &rcBox );
  1385. HRGN hRgnBox = ::CreateRectRgnIndirect( &rcBox );
  1386. ::CombineRgn( hRgn, hRgn, hRgnBox, RGN_OR );
  1387. ::DeleteObject( hRgnBox );
  1388. ::CombineRgn( hRgn, hRgn, hRgnExclude, RGN_XOR );
  1389. }
  1390. }
  1391. m_bNcFrameImpl_AssigningRGN = true;
  1392. pWndFrameImpl->SetWindowRgn( hRgn, TRUE );
  1393. m_bNcFrameImpl_AssigningRGN = false;
  1394. }
  1395. BOOL CALLBACK stat_CalcMaxResizingInfo( HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData )
  1396. {
  1397. hMonitor; hdcMonitor; dwData;
  1398. ASSERT( lprcMonitor != NULL );
  1399. LPRECT pInfo = (LPRECT)dwData;
  1400. ASSERT( pInfo != NULL );
  1401. pInfo->left = min( pInfo->left, lprcMonitor->left );
  1402. pInfo->top = min( pInfo->top, lprcMonitor->top );
  1403. pInfo->right = max( pInfo->right, lprcMonitor->right );
  1404. pInfo->bottom = max( pInfo->bottom, lprcMonitor->bottom );
  1405. return TRUE;
  1406. }
  1407. bool CExtNcFrameImpl::NcFrameImpl_GetMinMaxInfo(
  1408. LPMINMAXINFO pMMI
  1409. ) const
  1410. {
  1411. ASSERT( pMMI != NULL );
  1412. if( ! NcFrameImpl_IsSupported() )
  1413. return false;
  1414. if( NcFrameImpl_IsDwmBased() )
  1415. return true;
  1416. CWnd * pWndFrameImpl = const_cast < CWnd * > ( NcFrameImpl_GetFrameWindow() );
  1417. if( ( pWndFrameImpl->GetStyle() & WS_CHILD ) == 0 )
  1418. {
  1419. CRect rcBorders( 0, 0, 0, 1 );
  1420. CExtPaintManager::monitor_parms_t _mp;
  1421. CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );
  1422. //  if( ! _mp.m_bPrimaryMonitor )
  1423. //  return false;
  1424. //  pMMI->ptMaxPosition.x = _mp.m_rcWorkArea.left + rcBorders.left;
  1425. //  pMMI->ptMaxPosition.y = _mp.m_rcWorkArea.top + rcBorders.top;
  1426. pMMI->ptMaxPosition.x = 0 + rcBorders.left;
  1427. pMMI->ptMaxPosition.y = 0 + rcBorders.top;
  1428. if( g_PaintManager.m_bIsWin98orLater || g_PaintManager.m_bIsWin2000orLater )
  1429. {
  1430. CRect rcClip( -32767, -32767, +32767, +32767 ), rcInfo( 0, 0, 0, 0 );
  1431. if( EnumDisplayMonitors( NULL, &rcClip, stat_CalcMaxResizingInfo, LPARAM(LPVOID(&rcInfo)) ) )
  1432. {
  1433. pMMI->ptMaxTrackSize.x = pMMI->ptMaxSize.x = rcInfo.Width();
  1434. pMMI->ptMaxTrackSize.y = pMMI->ptMaxSize.y = rcInfo.Height();
  1435. }
  1436. }
  1437. //  if( ! _mp.m_bPrimaryMonitor )
  1438. //  {
  1439. //  CPoint ptPrimary( 100, 100 );
  1440. //  CExtPaintManager::monitor_parms_t _mpPrimary;
  1441. //  CExtPaintManager::stat_GetMonitorParms( _mpPrimary, ptPrimary );
  1442. //  if( ! _mpPrimary.m_bPrimaryMonitor )
  1443. //  {
  1444. //  pMMI->ptMaxPosition.x = rcBorders.left;
  1445. //  pMMI->ptMaxPosition.y = rcBorders.top;
  1446. //  }
  1447. //  else
  1448. //  {
  1449. //  pMMI->ptMaxPosition.x = _mpPrimary.m_rcWorkArea.left + rcBorders.left;
  1450. //  pMMI->ptMaxPosition.y = _mpPrimary.m_rcWorkArea.top + rcBorders.top;
  1451. //  }
  1452. //  }
  1453. /*pMMI->ptMaxTrackSize.x =*/ pMMI->ptMaxSize.x = _mp.m_rcWorkArea.Width() - rcBorders.left - rcBorders.right;
  1454. /*pMMI->ptMaxTrackSize.y =*/ pMMI->ptMaxSize.y = _mp.m_rcWorkArea.Height() - rcBorders.top - rcBorders.bottom;
  1455. //TRACE2( "max-pos %d %drn", pMMI->ptMaxPosition.x, pMMI->ptMaxPosition.y );
  1456. APPBARDATA _data;
  1457. ::memset( &_data, 0, sizeof(APPBARDATA) );
  1458. _data.cbSize = sizeof(APPBARDATA);
  1459. UINT nSHR = (UINT)::SHAppBarMessage( ABM_GETSTATE, &_data );
  1460. if( nSHR == (ABS_AUTOHIDE|ABS_ALWAYSONTOP) )
  1461. {
  1462. nSHR = (UINT)::SHAppBarMessage( ABM_GETTASKBARPOS, &_data );
  1463. if( nSHR == 1 )
  1464. {
  1465. switch(_data.uEdge)
  1466. {
  1467. case ABE_TOP:
  1468. pMMI->ptMaxPosition.y ++;
  1469. pMMI->ptMaxSize.y --;
  1470. break;
  1471. case ABE_BOTTOM:
  1472. pMMI->ptMaxSize.y --;
  1473. break;
  1474. case ABE_LEFT:
  1475. pMMI->ptMaxPosition.x ++;
  1476. pMMI->ptMaxSize.x --;
  1477. break;
  1478. case ABE_RIGHT:
  1479. pMMI->ptMaxSize.x --;
  1480. break;
  1481. }
  1482. } // if( nSHR == 1 )
  1483. } // if( nSHR == (ABS_AUTOHIDE|ABS_ALWAYSONTOP) )
  1484. } // if( ( pWndFrameImpl->GetStyle() & WS_CHILD ) == 0 )
  1485. return true;
  1486. }
  1487. void CExtNcFrameImpl::NcFrameImpl_ExtractScTipText( const CWnd * pWnd, UINT nSC, CExtSafeString & strTipText )
  1488. {
  1489. if( ! strTipText.IsEmpty() )
  1490. return;
  1491. if( pWnd->GetSafeHwnd() != NULL )
  1492. {
  1493. if( pWnd->IsIconic() && nSC == SC_MINIMIZE )
  1494. nSC = SC_RESTORE;
  1495. CMenu * pMenu = pWnd->GetSystemMenu( FALSE );
  1496. if( pMenu->GetSafeHmenu() != NULL )
  1497. {
  1498. CString sTmp;
  1499. pMenu->GetMenuString( nSC, sTmp, MF_BYCOMMAND );
  1500. if( ! sTmp.IsEmpty() )
  1501. {
  1502. sTmp.Replace( _T("&"), _T("") );
  1503. INT nPos = sTmp.Find( _T("t") );
  1504. if( nPos > 0 )
  1505. sTmp = sTmp.Left( nPos );
  1506. strTipText = LPCTSTR( sTmp );
  1507. return;
  1508. }
  1509. }
  1510. }
  1511. switch( nSC )
  1512. {
  1513. case SC_MINIMIZE:
  1514. strTipText = _T("Minimize");
  1515. break;
  1516. case SC_MAXIMIZE:
  1517. strTipText = _T("Maximize");
  1518. break;
  1519. case SC_RESTORE:
  1520. strTipText = _T("Restore");
  1521. break;
  1522. case SC_CLOSE:
  1523. strTipText = _T("Close");
  1524. break;
  1525. case SC_CONTEXTHELP:
  1526. strTipText = _T("Help");
  1527. break;
  1528. }
  1529. }
  1530. __EXT_MFC_SAFE_LPCTSTR CExtNcFrameImpl::NcFrameImpl_GetScTipText( UINT nSC ) const
  1531. {
  1532. const CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1533. ASSERT_VALID( pWndFrameImpl );
  1534. if( m_rcNcFrameImpl_ScClose.IsRectEmpty() )
  1535. NcFrameImpl_ReCacheScButtonRects();
  1536. switch( nSC )
  1537. {
  1538. case SC_CLOSE:
  1539. {
  1540. NcFrameImpl_ExtractScTipText( pWndFrameImpl, nSC, m_strNcFrameImpl_TipClose );
  1541. return LPCTSTR( m_strNcFrameImpl_TipClose );
  1542. }
  1543. case SC_MAXIMIZE:
  1544. case SC_RESTORE:
  1545. {
  1546. if( pWndFrameImpl->IsZoomed() )
  1547. {
  1548. nSC = SC_RESTORE;
  1549. NcFrameImpl_ExtractScTipText( pWndFrameImpl, nSC, m_strNcFrameImpl_TipRestore );
  1550. return LPCTSTR( m_strNcFrameImpl_TipRestore );
  1551. }
  1552. else
  1553. {
  1554. nSC = SC_MAXIMIZE;
  1555. NcFrameImpl_ExtractScTipText( pWndFrameImpl, nSC, m_strNcFrameImpl_TipMaximize );
  1556. return LPCTSTR( m_strNcFrameImpl_TipMaximize );
  1557. }
  1558. }
  1559. case SC_MINIMIZE:
  1560. {
  1561. if( pWndFrameImpl->IsIconic() )
  1562. {
  1563. NcFrameImpl_ExtractScTipText( pWndFrameImpl, nSC, m_strNcFrameImpl_TipRestore );
  1564. return LPCTSTR( m_strNcFrameImpl_TipRestore );
  1565. }
  1566. else
  1567. {
  1568. NcFrameImpl_ExtractScTipText( pWndFrameImpl, nSC, m_strNcFrameImpl_TipMinimize );
  1569. return LPCTSTR( m_strNcFrameImpl_TipMinimize );
  1570. }
  1571. }
  1572. case SC_CONTEXTHELP:
  1573. {
  1574. NcFrameImpl_ExtractScTipText( pWndFrameImpl, nSC, m_strNcFrameImpl_TipHelp );
  1575. return LPCTSTR( m_strNcFrameImpl_TipHelp );
  1576. }
  1577. } // switch( nSC )
  1578. return NULL;
  1579. }
  1580. bool CExtNcFrameImpl::NcFrameImpl_IsSupported() const
  1581. {
  1582. if( ! m_bNcFrameImpl_IsEnabled )
  1583. return false;
  1584. const CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1585. if( pWndFrameImpl->GetSafeHwnd() == NULL )
  1586. return false;
  1587. if( ! NcFrameImpl_GetPM()->NcFrame_IsSupported( pWndFrameImpl ) )
  1588. return false;
  1589. CFrameWnd * pFrameWnd = DYNAMIC_DOWNCAST( CFrameWnd, pWndFrameImpl );
  1590. if( pFrameWnd != NULL
  1591. && CExtControlBar::IsOleIpObjActive( pFrameWnd )
  1592. )
  1593. {
  1594. if( m_bNcFrameImpl_RgnSet )
  1595. {
  1596. (((CExtNcFrameImpl*)this)->m_bNcFrameImpl_RgnSet) = false;
  1597. ::SetWindowRgn( pWndFrameImpl->m_hWnd, NULL, FALSE );
  1598. } // if( m_bNcFrameImpl_RgnSet )
  1599. return false;
  1600. }
  1601. return true;
  1602. }
  1603. bool CExtNcFrameImpl::NcFrameImpl_IsDwmBased() const
  1604. {
  1605. if( ! NcFrameImpl_IsSupported() )
  1606. return false;
  1607. bool bDwmMode = g_PaintManager.m_DWM.IsCompositionEnabled() ? true : false;
  1608. if( ! bDwmMode )
  1609. return false;
  1610. return m_bNcFrameImpl_IsDwmBased;
  1611. }
  1612. bool CExtNcFrameImpl::NcFrameImpl_IsDwmCaptionReplacement() const
  1613. {
  1614. if( ! NcFrameImpl_IsDwmBased() )
  1615. return false;
  1616. if( m_pNcFrameImplBridge != NULL )
  1617. {
  1618. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1619. if( hWnd != NULL
  1620. && ( ::__EXT_MFC_GetWindowLong( hWnd, GWL_STYLE ) & WS_VISIBLE ) != 0
  1621. && m_pNcFrameImplBridge->NcFrameImplBridge_OnOverPaint_IsEnabled()
  1622. )
  1623. return true;
  1624. }
  1625. return false;
  1626. }
  1627. bool CExtNcFrameImpl::NcFrameImpl_IsForceEmpty() const
  1628. {
  1629. if( NcFrameImpl_IsDwmBased() )
  1630. return true;
  1631. return false;
  1632. }
  1633. CRect CExtNcFrameImpl::NcFrameImpl_GetForceEmptyNcBorder() const
  1634. {
  1635. return CRect( 0, 0, 0, 0 );
  1636. }
  1637. bool CExtNcFrameImpl::NcFrameImpl_IsForceEmptyNcBorderEmpty() const
  1638. {
  1639. if( NcFrameImpl_IsDwmBased() )
  1640. return true;
  1641. CRect rc = NcFrameImpl_GetForceEmptyNcBorder();
  1642. ASSERT( rc.left >= 0 );
  1643. ASSERT( rc.top >= 0 );
  1644. ASSERT( rc.right >= 0 );
  1645. ASSERT( rc.bottom >= 0 );
  1646. if( rc.left > 0
  1647. || rc.top > 0
  1648. || rc.right > 0
  1649. || rc.bottom > 0
  1650. )
  1651. return false;
  1652. return true;
  1653. }
  1654. bool CExtNcFrameImpl::NcFrameImpl_IsActive()
  1655. {
  1656. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  1657. if( hWndOwn == NULL )
  1658. return false;
  1659. return m_bNcFrameImpl_IsActive;
  1660. }
  1661. void CExtNcFrameImpl::NcFrameImpl_OnNcPaint(
  1662. CDC & dcPaint,
  1663. bool bOuterEmulationMode // = false
  1664. )
  1665. {
  1666. bOuterEmulationMode;
  1667. CExtPaintManager * pPM = NcFrameImpl_GetPM();
  1668. ASSERT_VALID( pPM );
  1669. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1670. CRect rcNcBorders, rcThemePadding;
  1671. pPM->NcFrame_GetMetrics( rcNcBorders, rcThemePadding, pWndFrameImpl );
  1672. bool bFrameActive = NcFrameImpl_IsActive();
  1673. INT nAdjustCaptionHeight = 0;
  1674. if( m_pNcFrameImplBridge != NULL
  1675. && m_pNcFrameImplBridge->NcFrameImplBridge_OnQueryCaptionMergeMode()
  1676. )
  1677. {
  1678. nAdjustCaptionHeight =
  1679. pPM->NcFrame_GetCaptionHeight(
  1680. bFrameActive,
  1681. pWndFrameImpl
  1682. );
  1683. rcNcBorders.top += nAdjustCaptionHeight;
  1684. }
  1685. CRect rcWnd, rcClient;
  1686. pWndFrameImpl->GetWindowRect( &rcWnd );
  1687. pWndFrameImpl->GetClientRect( &rcClient );
  1688. CRect rcSavedClient = rcClient;
  1689. pWndFrameImpl->ClientToScreen( &rcClient );
  1690. rcClient.OffsetRect( -rcWnd.TopLeft() );
  1691. CRect rcRealClient = rcClient;
  1692. rcClient.top += nAdjustCaptionHeight;
  1693. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  1694. DWORD dwOldLayout = dcPaint.SetLayout( LAYOUT_LTR );
  1695. if( ! bOuterEmulationMode  )
  1696. {
  1697. dcPaint.ExcludeClipRect( &rcRealClient );
  1698. if( m_pNcFrameImplBridge != NULL && nAdjustCaptionHeight > 0 )
  1699. {
  1700. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1701. if( hWnd != NULL )
  1702. {
  1703. CRect rc = rcSavedClient;
  1704. rc.bottom = rc.top + nAdjustCaptionHeight;
  1705. pWndFrameImpl->ClientToScreen( &rc );
  1706. ::ScreenToClient( hWnd, (LPPOINT)&rc );
  1707. ::ScreenToClient( hWnd, ((LPPOINT)&rc)+1 );
  1708. ::InvalidateRect( hWnd, &rc, TRUE );
  1709. ::UpdateWindow( hWnd );
  1710. }
  1711. }
  1712. } // if( ! bOuterEmulationMode  )
  1713. { // BLOCK: memory DC
  1714. CExtMemoryDC dc( &dcPaint, &rcWnd );
  1715. NcFrameImpl_ReCacheScButtonRects();
  1716. bool bFrameEnabled = pWndFrameImpl->IsWindowEnabled() ? true : false;
  1717. bool bFrameMaximized = pWndFrameImpl->IsZoomed() ? true : false;
  1718. CExtPaintManager::e_nc_button_state_t
  1719. eStateButtonHelp = CExtPaintManager::__ENCBS_DISABLED,
  1720. eStateButtonMinimize = CExtPaintManager::__ENCBS_DISABLED,
  1721. eStateButtonMaximizeRestore = CExtPaintManager::__ENCBS_DISABLED,
  1722. eStateButtonClose = CExtPaintManager::__ENCBS_DISABLED;
  1723. if( ! m_rcNcFrameImpl_ScClose.IsRectEmpty() )
  1724. {
  1725. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_CLOSE ) )
  1726. eStateButtonClose =
  1727. ( m_nNcFrameImpl_ScTrackedButtonPressed == SC_CLOSE )
  1728. ? CExtPaintManager::__ENCBS_PRESSED
  1729. : ( ( m_nNcFrameImpl_ScTrackedButtonHover == SC_CLOSE
  1730. && m_nNcFrameImpl_ScTrackedButtonPressed == 0 )
  1731. ? CExtPaintManager::__ENCBS_HOVER
  1732. : CExtPaintManager::__ENCBS_NORMAL )
  1733. ;
  1734. }
  1735. if( ! m_rcNcFrameImpl_ScMaximize.IsRectEmpty() )
  1736. {
  1737. if( bFrameMaximized )
  1738. {
  1739. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_RESTORE )
  1740. || NcFrameImpl_OnQuerySystemCommandEnabled( SC_MAXIMIZE )
  1741. )
  1742. eStateButtonMaximizeRestore =
  1743. ( m_nNcFrameImpl_ScTrackedButtonPressed == SC_MAXIMIZE )
  1744. ? CExtPaintManager::__ENCBS_PRESSED
  1745. : ( ( m_nNcFrameImpl_ScTrackedButtonHover == SC_MAXIMIZE
  1746. && m_nNcFrameImpl_ScTrackedButtonPressed == 0 )
  1747. ? CExtPaintManager::__ENCBS_HOVER
  1748. : CExtPaintManager::__ENCBS_NORMAL )
  1749. ;
  1750. }
  1751. else
  1752. {
  1753. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_RESTORE )
  1754. || NcFrameImpl_OnQuerySystemCommandEnabled( SC_MAXIMIZE )
  1755. )
  1756. eStateButtonMaximizeRestore =
  1757. ( m_nNcFrameImpl_ScTrackedButtonPressed == SC_MAXIMIZE )
  1758. ? CExtPaintManager::__ENCBS_PRESSED
  1759. : ( ( m_nNcFrameImpl_ScTrackedButtonHover == SC_MAXIMIZE
  1760. && m_nNcFrameImpl_ScTrackedButtonPressed == 0 )
  1761. ? CExtPaintManager::__ENCBS_HOVER
  1762. : CExtPaintManager::__ENCBS_NORMAL )
  1763. ;
  1764. }
  1765. }
  1766. if( ! m_rcNcFrameImpl_ScMinimize.IsRectEmpty() )
  1767. {
  1768. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_MINIMIZE ) )
  1769. eStateButtonMinimize =
  1770. ( m_nNcFrameImpl_ScTrackedButtonPressed == SC_MINIMIZE )
  1771. ? CExtPaintManager::__ENCBS_PRESSED
  1772. : ( ( m_nNcFrameImpl_ScTrackedButtonHover == SC_MINIMIZE
  1773. && m_nNcFrameImpl_ScTrackedButtonPressed == 0 )
  1774. ? CExtPaintManager::__ENCBS_HOVER
  1775. : CExtPaintManager::__ENCBS_NORMAL )
  1776. ;
  1777. }
  1778. if( ! m_rcNcFrameImpl_ScHelp.IsRectEmpty() )
  1779. {
  1780. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_CONTEXTHELP ) )
  1781. eStateButtonHelp =
  1782. ( m_nNcFrameImpl_ScTrackedButtonPressed == SC_CONTEXTHELP )
  1783. ? CExtPaintManager::__ENCBS_PRESSED
  1784. : ( ( m_nNcFrameImpl_ScTrackedButtonHover == SC_CONTEXTHELP
  1785. && m_nNcFrameImpl_ScTrackedButtonPressed == 0 )
  1786. ? CExtPaintManager::__ENCBS_HOVER
  1787. : CExtPaintManager::__ENCBS_NORMAL )
  1788. ;
  1789. }
  1790. bool bDrawIcon = true, bDrawCaptionText = true;
  1791. CExtCmdIcon _icon;
  1792. CString strCaption;
  1793. CRect rcDrawIcon = m_rcNcFrameImpl_Icon;
  1794. CRect rcDrawText = m_rcNcFrameImpl_Text;
  1795. UINT nDtFlags = DT_SINGLELINE|DT_LEFT|DT_VCENTER;
  1796. if( m_pNcFrameImplBridge != NULL )
  1797. {
  1798. bDrawIcon =
  1799. m_pNcFrameImplBridge->NcFrameImplBridge_OnQueryDrawIcon(
  1800. rcDrawIcon
  1801. );
  1802. bDrawCaptionText =
  1803. m_pNcFrameImplBridge->NcFrameImplBridge_OnQueryDrawCaptionText(
  1804. rcDrawText,
  1805. nDtFlags
  1806. );
  1807. } // if( m_pNcFrameImplBridge != NULL )
  1808. if( bDrawIcon )
  1809. NcFrameImpl_GetIcon( _icon );
  1810. pWndFrameImpl->GetWindowText( strCaption );
  1811. pPM->NcFrame_Paint(
  1812. dc,
  1813. bDrawIcon ? (&_icon) : NULL,
  1814. bDrawCaptionText ? LPCTSTR(strCaption) : _T(""),
  1815. nDtFlags,
  1816. rcWnd,
  1817. rcClient,
  1818. rcDrawIcon,
  1819. rcDrawText,
  1820. m_rcNcFrameImpl_ScHelp,
  1821. m_rcNcFrameImpl_ScMinimize,
  1822. m_rcNcFrameImpl_ScMaximize,
  1823. m_rcNcFrameImpl_ScClose,
  1824. bFrameActive,
  1825. bFrameEnabled,
  1826. bFrameMaximized,
  1827. eStateButtonHelp,
  1828. eStateButtonMinimize,
  1829. eStateButtonMaximizeRestore,
  1830. eStateButtonClose,
  1831. pWndFrameImpl
  1832. );
  1833. if( m_pNcFrameImplBridge != NULL )
  1834. {
  1835. if( ! bOuterEmulationMode )
  1836. m_pNcFrameImplBridge->NcFrameImplBridge_OnOverPaint(
  1837. dc,
  1838. rcWnd,
  1839. rcClient
  1840. );
  1841. if( ! bDrawCaptionText )
  1842. m_pNcFrameImplBridge->NcFrameImplBridge_OnDrawCaptionText(
  1843. dc,
  1844. LPCTSTR(strCaption),
  1845. rcDrawText
  1846. );
  1847. }
  1848. } // BLOCK: memory DC
  1849. dcPaint.SetLayout( dwOldLayout );
  1850. }
  1851. void CExtNcFrameImpl::NcFrameImpl_AdjustVistaDwmCompatibilityIssues()
  1852. {
  1853. bool bDwmMode = g_PaintManager.m_DWM.IsCompositionEnabled() ? true : false;
  1854. if( ! bDwmMode )
  1855. return;
  1856. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  1857. if( hWndOwn == NULL || ( ! ::IsWindow( hWndOwn ) ) )
  1858. return;
  1859. bool bDwmArea = NcFrameImpl_IsDwmCaptionReplacement();
  1860. if( ! bDwmArea )
  1861. return;
  1862. bool bCustomNcArea = false;
  1863. CExtDWM::__EXT_DWMNCRENDERINGPOLICY ncrp =
  1864. bCustomNcArea
  1865. ? CExtDWM::__EXT_DWMNCRP_DISABLED
  1866. : CExtDWM::__EXT_DWMNCRP_ENABLED // CExtDWM::__EXT_DWMNCRP_USEWINDOWSTYLE
  1867. ;
  1868. HRESULT hr = 
  1869. g_PaintManager.m_DWM.DwmSetWindowAttribute(
  1870. hWndOwn,
  1871. CExtDWM::__EXT_DWMWA_NCRENDERING_POLICY,
  1872. &ncrp,
  1873. sizeof(ncrp)
  1874. );
  1875. // ASSERT( hr == S_OK );
  1876. BOOL bAllow = bDwmArea ? TRUE : FALSE;
  1877. hr = 
  1878. g_PaintManager.m_DWM.DwmSetWindowAttribute(
  1879. hWndOwn,
  1880. CExtDWM::__EXT_DWMWA_ALLOW_NCPAINT,
  1881. &bAllow,
  1882. sizeof(bAllow)
  1883. );
  1884. hr;
  1885. }
  1886. bool CExtNcFrameImpl::NcFrameImpl_FilterWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )
  1887. {
  1888. wParam;
  1889. lParam;
  1890. if( message == g_PaintManager.m_nMsgPaintManagerChanged )
  1891. {
  1892. m_BridgeNC.PmBridge_OnPaintManagerChanged( m_BridgeNC.PmBridge_GetPM() );
  1893. lResult = 0L;
  1894. return true;
  1895. } // if( message == g_PaintManager.m_nMsgPaintManagerChanged )
  1896. if( message == g_nMsgFindExtNcFrameImpl )
  1897. {
  1898. CExtNcFrameImpl ** ppExtNcFrameImpl = (CExtNcFrameImpl **)wParam;
  1899. (*ppExtNcFrameImpl) = this;
  1900. m_pNcFrameImplBridge = (IExtNcFrameImplBridge*)lParam;
  1901. return true;
  1902. } // if( message == g_nMsgFindExtNcFrameImpl )
  1903. return false;
  1904. }
  1905. bool CExtNcFrameImpl::NcFrameImpl_PreWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )
  1906. {
  1907. m_bNcFrameImpl_RestoreBorder = false;
  1908. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1909. switch( message )
  1910. {
  1911. case __EXT_MFC_WM_NCUAHDRAWCAPTION:
  1912. case __EXT_MFC_WM_NCUAHDRAWFRAME:
  1913. if( ! NcFrameImpl_IsSupported() )
  1914. break;
  1915. if( NcFrameImpl_IsDwmBased() )
  1916. break;
  1917. lResult = 0;
  1918. return true;
  1919. case WM_SETTEXT:
  1920. {
  1921. if( ! NcFrameImpl_IsSupported() )
  1922. break;
  1923. if( NcFrameImpl_IsDwmBased() )
  1924. {
  1925. if( m_pNcFrameImplBridge != NULL )
  1926. {
  1927. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1928. if( hWnd != NULL )
  1929. {
  1930. ::InvalidateRect( hWnd, NULL, TRUE );
  1931. //::UpdateWindow( hWnd );
  1932. }
  1933. }
  1934. break;
  1935. }
  1936. struct friendly_wnd_t : public CWnd { friend class CExtNcFrameImpl; };
  1937. DWORD dw = pWndFrameImpl->GetStyle()&WS_CAPTION;
  1938. if( dw != 0 )
  1939. pWndFrameImpl->ModifyStyle( WS_CAPTION, 0 );
  1940. lResult = ((friendly_wnd_t*)pWndFrameImpl)->DefWindowProc( message, wParam, lParam );
  1941. if( dw != 0 )
  1942. pWndFrameImpl->ModifyStyle( 0, dw );
  1943. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1944. if( m_pNcFrameImplBridge != NULL )
  1945. {
  1946. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1947. if( hWnd != NULL )
  1948. {
  1949. ::InvalidateRect( hWnd, NULL, TRUE );
  1950. //::UpdateWindow( hWnd );
  1951. }
  1952. }
  1953. }
  1954. return true;
  1955. case WM_MDIRESTORE:
  1956. case WM_MDIMAXIMIZE:
  1957. case WM_MDIACTIVATE:
  1958. {
  1959. if( ! NcFrameImpl_IsSupported() )
  1960. break;
  1961. if( NcFrameImpl_IsDwmBased() )
  1962. break;
  1963. HWND hWndMdiClient = ::GetParent( pWndFrameImpl->m_hWnd );
  1964. CRect rcClient;
  1965. ::GetClientRect( hWndMdiClient, &rcClient );
  1966. ::SendMessage( hWndMdiClient, WM_SIZE, SIZE_RESTORED, MAKELPARAM( rcClient.Width(), rcClient.Height() ) );
  1967. NcFrameImpl_SetupRgn();
  1968. if( message == WM_MDIACTIVATE )
  1969. {
  1970. CMDIChildWnd * pWndMdiChild = DYNAMIC_DOWNCAST( CMDIChildWnd, pWndFrameImpl );
  1971. if( pWndMdiChild != NULL )
  1972. {
  1973. HWND hWnd = (HWND)wParam;
  1974. if( hWnd != NULL && ::IsWindow(hWnd) )
  1975. {
  1976. MSG _msg;
  1977. for( ; ::PeekMessage( &_msg, hWnd, WM_NCPAINT, WM_NCPAINT, PM_REMOVE ); );
  1978. ::PostMessage( hWnd, WM_NCACTIVATE, FALSE, 0 );
  1979. }
  1980. hWnd = (HWND)lParam;
  1981. if( hWnd != NULL && ::IsWindow(hWnd) )
  1982. {
  1983. MSG _msg;
  1984. for( ; ::PeekMessage( &_msg, hWnd, WM_NCPAINT, WM_NCPAINT, PM_REMOVE ); );
  1985. ::PostMessage( hWnd, WM_NCACTIVATE, TRUE, 0 );
  1986. }
  1987. }
  1988. }
  1989. }
  1990. break;
  1991. case WM_WINDOWPOSCHANGED:
  1992. case WM_WINDOWPOSCHANGING:
  1993. case WM_SIZE:
  1994. if( ! NcFrameImpl_IsSupported() )
  1995. break;
  1996. if( NcFrameImpl_IsDwmBased() )
  1997. break;
  1998. if( NcFrameImpl_IsNcLocked() )
  1999. return true;
  2000. break;
  2001. case WM_SETICON:
  2002. if( wParam == ICON_SMALL && ((HICON)lParam) != NULL )
  2003. {
  2004. m_iconNcFrameImpl_QueryCache.AssignFromHICON( ((HICON)lParam), true );
  2005. m_iconNcFrameImpl_QueryCache.Scale( CSize(16,16) );
  2006. } // if( wParam == ICON_SMALL && ((HICON)lParam) != NULL )
  2007. break;
  2008. case WM_NCACTIVATE:
  2009. {
  2010. if( ! NcFrameImpl_IsSupported() )
  2011. break;
  2012. if( NcFrameImpl_IsDwmBased() )
  2013. break;
  2014. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  2015. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  2016. if( m_pNcFrameImplBridge != NULL )
  2017. {
  2018. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  2019. if( hWnd != NULL )
  2020. {
  2021. ::InvalidateRect( hWnd, NULL, TRUE );
  2022. //::UpdateWindow( hWnd );
  2023. }
  2024. if( NcFrameImpl_IsDwmCaptionReplacement() )
  2025. {
  2026. CExtControlBar * pBar = DYNAMIC_DOWNCAST( CExtControlBar, CWnd::FromHandlePermanent( hWnd ) );
  2027. if( pBar != NULL )
  2028. {
  2029. INT nIndex, nCount = pBar->AnimationSite_ClientGetCount();
  2030. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  2031. {
  2032. CExtAnimationClient * pAC = pBar->AnimationSite_ClientGetAt( nIndex );
  2033. ASSERT( pAC != NULL );
  2034. pBar->AnimationSite_ClientProgressStop( pAC );
  2035. pAC->AnimationClient_StateGet( false ).Empty();
  2036. pAC->AnimationClient_StateGet( true ).Empty();
  2037. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  2038. } // if( pBar != NULL )
  2039. if( m_pNcFrameImplBridge != NULL )
  2040. {
  2041. if( hWnd != NULL && ::IsWindow( hWnd ) )
  2042. ::RedrawWindow(
  2043. hWnd,
  2044. NULL,
  2045. NULL,
  2046. RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN
  2047. );
  2048. }
  2049. ::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
  2050. break;
  2051. } // if( NcFrameImpl_IsDwmCaptionReplacement() )
  2052. }
  2053. if( NcFrameImpl_IsDwmBased() )
  2054. break;
  2055. if( pWndFrameImpl->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) ) )
  2056. {
  2057. pWndFrameImpl->SetRedraw( FALSE );
  2058. struct friendly_wnd_t : public CWnd { friend class CExtNcFrameImpl; };
  2059. lResult = ((friendly_wnd_t*)pWndFrameImpl)->DefWindowProc( message, wParam, lParam );
  2060. pWndFrameImpl->SetRedraw( TRUE );
  2061. pWndFrameImpl->RedrawWindow(
  2062. NULL,
  2063. NULL,
  2064. RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN
  2065. );
  2066. }
  2067. ::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
  2068.   lResult = 1;
  2069. }
  2070. if( ! m_bNcFrameImpl_NcInitPassed )
  2071. {
  2072. m_bNcFrameImpl_NcInitPassed = true;
  2073. break;
  2074. }
  2075. return true;
  2076. case WM_CREATE:
  2077. NcFrameImpl_MapHtRects_Clean();
  2078. NcFrameImpl_AdjustVistaDwmCompatibilityIssues();
  2079. if( NcFrameImpl_IsSupported() )
  2080. NcFrameImpl_RecalcNcFrame();
  2081. break;
  2082. case WM_INITDIALOG:
  2083. NcFrameImpl_AdjustVistaDwmCompatibilityIssues();
  2084. if( NcFrameImpl_IsSupported()
  2085. && ( ! NcFrameImpl_IsDwmBased() )
  2086. )
  2087. {
  2088. CExtPaintManager * pPM = NcFrameImpl_GetPM();
  2089. ASSERT_VALID( pPM );
  2090. INT nCaptionHeightSkinned = pPM->NcFrame_GetCaptionHeight( true, pWndFrameImpl );
  2091. if( nCaptionHeightSkinned > 0 )
  2092. {
  2093. INT nCaptionHeightDefault = ::GetSystemMetrics( SM_CYCAPTION );
  2094. INT nCaptionHeightDifference = nCaptionHeightSkinned - nCaptionHeightDefault;
  2095. if( nCaptionHeightDifference != 0 )
  2096. {
  2097. WINDOWPLACEMENT _wp;
  2098. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  2099. _wp.length = sizeof(WINDOWPLACEMENT);
  2100. if( ::GetWindowPlacement( pWndFrameImpl->m_hWnd, &_wp ) )
  2101. {
  2102. _wp.rcNormalPosition.bottom += nCaptionHeightDifference;
  2103. // ::SetWindowPlacement( pWndFrameImpl->m_hWnd, &_wp );
  2104. if( _wp.showCmd == SW_SHOWNORMAL || _wp.showCmd == SW_RESTORE )
  2105. pWndFrameImpl->SetWindowPos(
  2106. NULL,
  2107. 0,
  2108. 0,
  2109. _wp.rcNormalPosition.right - _wp.rcNormalPosition.left,
  2110. _wp.rcNormalPosition.bottom - _wp.rcNormalPosition.top,
  2111. SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_NOREDRAW
  2112. );
  2113. }
  2114. }
  2115. }
  2116. }
  2117. NcFrameImpl_SetupRgn();
  2118. break;
  2119. case WM_ACTIVATEAPP:
  2120. if( wParam == 0 )
  2121. m_bNcFrameImpl_IsActive = false;
  2122. else
  2123. m_bNcFrameImpl_IsActive = NcFrameImpl_IsActive();
  2124. if( NcFrameImpl_IsSupported()
  2125. && ( ! NcFrameImpl_IsDwmBased() )
  2126. && m_pNcFrameImplBridge != NULL
  2127. )
  2128. {
  2129. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  2130. if( hWnd != NULL )
  2131. {
  2132. ::InvalidateRect( hWnd, NULL, TRUE );
  2133. //::UpdateWindow( hWnd );
  2134. }
  2135. }
  2136. if( (! NcFrameImpl_IsForceEmpty() )
  2137. || (! NcFrameImpl_IsForceEmptyNcBorderEmpty() )
  2138. )
  2139. pWndFrameImpl->SendMessage( WM_NCPAINT );
  2140. else
  2141. {
  2142. if( NcFrameImpl_IsDwmCaptionReplacement() )
  2143. {
  2144. if( m_pNcFrameImplBridge != NULL )
  2145. {
  2146. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  2147. if( hWnd != NULL && ::IsWindow( hWnd ) )
  2148. ::RedrawWindow(
  2149. hWnd,
  2150. NULL,
  2151. NULL,
  2152. RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN
  2153. );
  2154. }
  2155. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  2156. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  2157. ::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
  2158. break;
  2159. } // if( NcFrameImpl_IsDwmCaptionReplacement() )
  2160. }
  2161. break;
  2162. case WM_ACTIVATE:
  2163. {
  2164. m_bNcFrameImpl_IsActive = ( LOWORD(wParam) == WA_INACTIVE ) ? false : true;
  2165. if( ! m_bNcFrameImpl_IsActive )
  2166. {
  2167. HWND hWnd = ::GetActiveWindow();
  2168. if( hWnd != NULL )
  2169. {
  2170. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  2171. if( pWnd != NULL
  2172. && ( pWnd == pWndFrameImpl
  2173. || pWnd->IsKindOf( RUNTIME_CLASS(CMiniFrameWnd) )
  2174. )
  2175. )
  2176. m_bNcFrameImpl_IsActive = true;