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

界面编程

开发平台:

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. #if (!defined __EXT_NC_FRAME_H)
  22. #define __EXT_NC_FRAME_H
  23. #if (!defined __EXT_MFC_DEF_H)
  24. #include <ExtMfcDef.h>
  25. #endif
  26. #if (!defined __EXT_RESIZABLE_DIALOG_H)
  27. #include <ExtResizableDialog.h>
  28. #endif
  29. #if (!defined __EXT_POPUP_MENU_WND_H)
  30. #include <ExtPopupMenuWnd.h>
  31. #endif
  32. #if (!defined __EXT_CONTROLBAR_H)
  33. #include <ExtControlBar.h>
  34. #endif
  35. #if (!defined __EXT_HOOK_H)
  36. #include "../Src/ExtHook.h"
  37. #endif
  38. #if _MSC_VER > 1000
  39. #pragma once
  40. #endif
  41. #if (!defined __EXT_MFC_NO_NC_FRAME )
  42. class CExtPmBridgeNC;
  43. class CExtNcFrameImpl;
  44. class CExtPaintManager;
  45. class __PROF_UIS_API CExtPmBridgeNC
  46. : public CExtPmBridge
  47. {
  48. CExtNcFrameImpl * m_pNcFrameImpl;
  49. public:
  50. DECLARE_CExtPmBridge_MEMBERS( CExtPmBridgeNC );
  51. CExtPmBridgeNC(
  52. CExtNcFrameImpl * pNcFrameImpl = NULL
  53. );
  54. virtual ~CExtPmBridgeNC();
  55. const CExtNcFrameImpl * NcFrameImpl_Get() const;
  56. CExtNcFrameImpl * NcFrameImpl_Get();
  57. void NcFrameImpl_Set(
  58. CExtNcFrameImpl * pNcFrameImpl
  59. );
  60. virtual void PmBridge_OnPaintManagerChanged(
  61. CExtPaintManager * pGlobalPM
  62. );
  63. virtual void PmBridge_OnDisplayChange(
  64. CExtPaintManager * pGlobalPM,
  65. CWnd * pWndNotifySrc,
  66. INT nDepthBPP,
  67. CPoint ptSizes
  68. );
  69. virtual void PmBridge_OnThemeChanged(
  70. CExtPaintManager * pGlobalPM,
  71. CWnd * pWndNotifySrc,
  72. WPARAM wParam,
  73. LPARAM lParam
  74. );
  75. virtual void _AdjustThemeSettings();
  76. }; // class CExtPmBridgeNC
  77. class __PROF_UIS_API CExtNcFrameImpl
  78. {
  79. protected:
  80. mutable CMapPtrToPtr m_mapNcFrameImpl_HtRects;
  81. mutable bool m_bNcFrameImpl_HelperInsideNcHitTest:1;
  82. MINMAXINFO m_NcFrameImpl_MinMaxInfo_Cache;
  83. public:
  84. CExtPmBridgeNC m_BridgeNC;
  85. bool m_bNcFrameImpl_PivotPmSyncMode:1;
  86. protected:
  87. bool m_bNcFrameImpl_IsActive:1, m_bNcFrameImpl_RgnSet:1,
  88. m_bNcFrameImpl_RestoreBorder:1, m_bNcFrameImpl_DelatayedFrameRecalc:1,
  89. m_bNcFrameImpl_QuickWindowPlacement:1,
  90. m_bNcFrameImpl_AssigningRGN:1,
  91. m_bNcFrameImpl_InAdjustAdjustThemeSettings:1;
  92. __EXT_MFC_LONG_PTR m_dwNcFrameImpl_StyleInitial, m_dwNcFrameImpl_StyleExInitial;
  93. mutable INT m_nNcFrameImpl_Lock;
  94. UINT m_nNcFrameImpl_LastShowCmd;
  95. LPARAM m_nNcFrameImpl_LastCheckCursorHT;
  96. CPoint m_ptNcFrameImpl_LastCheckCursor;
  97. mutable CExtCmdIcon m_iconNcFrameImpl_QueryCache;
  98. void NcFrameImpl_MapHtRects_Clean();
  99. void NcFrameImpl_MapHtRects_SetAt( LONG nHT, const RECT & rc ) const;
  100. bool NcFrameImpl_MapHtRects_GetAt( LONG nHT, RECT & rc ) const;
  101. bool m_bNcFrameImpl_NcInitPassed:1, m_bNcFrameImpl_CreatePassed:1;
  102. public:
  103. bool m_bNcFrameImpl_RestoreEnabledState:1, m_bNcFrameImpl_DwmSurfaceInitializationComplete:1;
  104. static const UINT g_nMsgFindExtNcFrameImpl;
  105. UINT m_nNcFrameImpl_LastExternalNcHT;
  106. CRect m_rcNcFrameImpl_LastExternalNcHT;
  107. struct __PROF_UIS_API IExtNcFrameImplBridge
  108. {
  109. virtual HWND NcFrameImplBridge_GetSafeHwnd() const = 0;
  110. virtual bool NcFrameImplBridge_OnQueryCaptionMergeMode() const = 0;
  111. virtual void NcFrameImplBridge_OnOverPaint(
  112. CDC & dc,
  113. CRect rcWnd,
  114. CRect rcClient
  115. ) const = 0;
  116. virtual bool NcFrameImplBridge_OnOverPaint_IsEnabled() const = 0;
  117. virtual void NcFrameImplBridge_OnDrawCaptionText(
  118. CDC & dc,
  119. __EXT_MFC_SAFE_LPCTSTR strCaption,
  120. CRect rcDrawText
  121. ) const = 0;
  122. virtual HRGN NcFrameImplBridge_GetNcExcludeHRGN() const = 0;
  123. virtual HRGN NcFrameImplBridge_GetNcResizingHRGN() const = 0;
  124. virtual bool NcFrameImplBridge_GetNcScRect( UINT nSC, CRect & rc ) const = 0;
  125. virtual bool NcFrameImpl_GetNcHtRect(
  126. CRect & rc,
  127. UINT nHT,
  128. bool bScreenMapping = true,
  129. bool bLayoutBordersH = false,
  130. bool bLayoutBordersV = false,
  131. LPMINMAXINFO pMinMaxInfo = NULL,
  132. LPCRECT pRectWnd = NULL
  133. ) const = 0;
  134. virtual bool NcFrameImplBridge_OnQueryDrawIcon(
  135. CRect & rcAdjustLocation
  136. ) const = 0;
  137. virtual bool NcFrameImplBridge_OnQueryDrawCaptionText(
  138. CRect & rcAdjustLocation,
  139. UINT & nAdjustDrawTextFlags
  140. ) const = 0;
  141. virtual void NcFrameImpl_PreSetWindowPlacement( const WINDOWPLACEMENT & _wp ) = 0;
  142. virtual void NcFrameImpl_PostSetWindowPlacement( const WINDOWPLACEMENT & _wp ) = 0;
  143. virtual void NcFrameImpl_AdjustDwmArea( CExtUxTheme::__EXT_UX_MARGINS & _margins ) = 0;
  144. }; // struct IExtNcFrameImplBridge
  145. IExtNcFrameImplBridge * m_pNcFrameImplBridge;
  146. public:
  147. class __PROF_UIS_API NcLock
  148. {
  149. const CExtNcFrameImpl & m_NcFrameImpl;
  150. bool m_bLocked:1;
  151. public:
  152. NcLock( const CExtNcFrameImpl & _NcFrameImpl );
  153. ~NcLock();
  154. void UnlockNow();
  155. }; // class NcLock
  156. bool m_bNcFrameImpl_IsEnabled:1, m_bNcFrameImpl_IsDwmBased:1,
  157. m_bNcFrameImpl_Resizing:1, m_bNcFrameImpl_Moving:1;
  158. protected:
  159. bool m_bNcFrameImpl_ResizingLoopTracking:1, m_bNcFrameImpl_MovingLoopTracking:1;
  160. public:
  161. mutable CRect
  162. m_rcNcFrameImpl_Icon,
  163. m_rcNcFrameImpl_Text,
  164. m_rcNcFrameImpl_ScHelp,
  165. m_rcNcFrameImpl_ScClose,
  166. m_rcNcFrameImpl_ScMaximize,
  167. m_rcNcFrameImpl_ScMinimize;
  168. enum e_StateIndex_t
  169. {
  170. __ESI_NORMAL   = 0,
  171. __ESI_HOVER    = 1,
  172. __ESI_PRESSED  = 2,
  173. };
  174. UINT m_nNcFrameImpl_ScTrackedButtonHover,
  175. m_nNcFrameImpl_ScTrackedButtonPressed;
  176. CExtPopupMenuTipWnd m_wndNcFrameImpl_Tip;
  177. mutable CExtSafeString
  178. m_strNcFrameImpl_TipMinimize,
  179. m_strNcFrameImpl_TipMaximize,
  180. m_strNcFrameImpl_TipRestore,
  181. m_strNcFrameImpl_TipClose,
  182. m_strNcFrameImpl_TipHelp;
  183. CExtNcFrameImpl();
  184. virtual ~CExtNcFrameImpl();
  185. virtual bool NcFrameImpl_IsNcLocked() const;
  186. virtual void NcFrameImpl_NcLock( bool bLock ) const;
  187. virtual DWORD NcFrameImpl_GetInitialStyle() const;
  188. virtual DWORD NcFrameImpl_GetInitialStyleEx() const;
  189. virtual HWND NcFrameImpl_OnQueryHWND() = 0;
  190. HWND NcFrameImpl_OnQueryHWND() const;
  191. virtual CWnd * NcFrameImpl_GetFrameWindow();
  192. const CWnd * NcFrameImpl_GetFrameWindow() const;
  193. CRect NcFrameImpl_GetNcHtRect(
  194. UINT nHT,
  195. LPMINMAXINFO pMinMaxInfo,
  196. LPCRECT pRectWnd = NULL
  197. ) const;
  198. virtual CRect NcFrameImpl_GetNcHtRect(
  199. UINT nHT,
  200. bool bScreenMapping = true,
  201. bool bLayoutBordersH = false,
  202. bool bLayoutBordersV = false,
  203. LPMINMAXINFO pMinMaxInfo = NULL,
  204. LPCRECT pRectWnd = NULL
  205. ) const;
  206. virtual CRect NcFrameImpl_GetNcScRect( UINT nSC ) const;
  207. virtual void NcFrameImpl_GetIcon( CExtCmdIcon & _icon ) const;
  208. virtual void NcFrameImpl_ReCacheScButtonRects() const;
  209. virtual void NcFrameImpl_DelayRgnAdjustment();
  210. virtual void NcFrameImpl_SetupRgn(
  211. WINDOWPOS * pWndPos = NULL
  212. );
  213. virtual bool NcFrameImpl_GetMinMaxInfo(
  214. LPMINMAXINFO pMMI
  215. ) const;
  216. static void NcFrameImpl_ExtractScTipText( const CWnd * pWnd, UINT nSC, CExtSafeString & strTipText );
  217. virtual __EXT_MFC_SAFE_LPCTSTR NcFrameImpl_GetScTipText( UINT nSC ) const;
  218. virtual bool NcFrameImpl_IsSupported() const;
  219. virtual bool NcFrameImpl_IsDwmBased() const;
  220. virtual bool NcFrameImpl_IsDwmCaptionReplacement() const;
  221. virtual bool NcFrameImpl_IsForceEmpty() const;
  222. virtual CRect NcFrameImpl_GetForceEmptyNcBorder() const;
  223. bool NcFrameImpl_IsForceEmptyNcBorderEmpty() const;
  224. virtual bool NcFrameImpl_IsActive();
  225. virtual bool NcFrameImpl_FilterWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam );
  226. virtual bool NcFrameImpl_PreWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam );
  227. virtual void NcFrameImpl_PostWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam );
  228. virtual bool NcFrameImpl_OnQueryQuickWindowPlacement() const;
  229. virtual bool NcFrameImpl_RecalcNcFrame();
  230. virtual void PreSubclassWindow();
  231. virtual void PostNcDestroy();
  232. virtual bool NcFrameImpl_OnQuerySystemCommandEnabled(
  233. UINT nSystemCommandID
  234. );
  235. virtual void NcFrameImpl_CheckCursor(
  236. CPoint pointScreen,
  237. LPARAM nHT,
  238. bool bCheckWindowFromPoint = true
  239. );
  240. static CExtNcFrameImpl * NcFrameImpl_FindInstance(
  241. HWND hWnd,
  242. IExtNcFrameImplBridge * pNcFrameImplBridge = NULL
  243. );
  244. virtual CExtPaintManager * NcFrameImpl_GetPM();
  245. CExtPaintManager * NcFrameImpl_GetPM() const;
  246. virtual void NcFrameImpl_OnNcPaint(
  247. CDC & dcPaint,
  248. bool bOuterEmulationMode = false
  249. );
  250. virtual void NcFrameImpl_AdjustVistaDwmCompatibilityIssues();
  251. virtual bool NcFrameImpl_GetWindowPlacement( WINDOWPLACEMENT & _wp ) const;
  252. virtual bool NcFrameImpl_SetWindowPlacement( const WINDOWPLACEMENT & _wp );
  253. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const;
  254. BOOL GetWindowPlacement( WINDOWPLACEMENT & _wp ) const;
  255. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP );
  256. BOOL SetWindowPlacement( const WINDOWPLACEMENT & _wp );
  257. static bool stat_GetWindowPlacement( HWND hWnd, WINDOWPLACEMENT & _wp );
  258. static bool stat_SetWindowPlacement( HWND hWnd, const WINDOWPLACEMENT & _wp );
  259. static bool stat_SaveWindowRect(
  260. HWND hWnd,
  261. __EXT_MFC_SAFE_LPCTSTR strSection,
  262. __EXT_MFC_SAFE_LPCTSTR strEntry
  263. );
  264. static bool stat_LoadWindowRect(
  265. HWND hWnd,
  266. __EXT_MFC_SAFE_LPCTSTR strSection,
  267. __EXT_MFC_SAFE_LPCTSTR strEntry,
  268. bool bForceHideWindow = false
  269. );
  270. virtual void NcFrameImpl_CalcWindowRect(
  271. LPRECT lpClientRect,
  272. UINT nAdjustType = CWnd::adjustBorder
  273. );
  274. static void stat_MDI_GetWindowList(
  275. HWND hWndMdiClient,
  276. CList < HWND, HWND > & _list,
  277. CList < HWND, HWND > & _listWindowsToSkip,
  278. bool bAddActiveToTail,
  279. bool bIncludeEnabled,
  280. bool bIncludeDisabled,
  281. bool bIncludeIconic,
  282. bool bIncludeNonIconic,
  283. bool bIncludeWithOwner,
  284. bool bIncludeWithoutOwner,
  285. bool bIncludeVisible = true,
  286. bool bIncludeHidden = false
  287. );
  288. static INT stat_MDI_ArrangeIconic(
  289. HWND hWndMdiClient,
  290. CList < HWND, HWND > & _listWindowsToSkip
  291. );
  292. static INT stat_MDI_ArrangeIconicEWL( // explicit window list based version
  293. HWND hWndMdiClient,
  294. CList < HWND, HWND > & _list
  295. );
  296. static void stat_MDI_Cascade(
  297. HWND hWndMdiClient,
  298. CList < HWND, HWND > & _listWindowsToSkip,
  299. WPARAM nActionFlags,
  300. INT nStairWindowCount = 0 // zero or negative - compute automatically
  301. );
  302. static void stat_MDI_CascadeEWL( // explicit window list based version
  303. HWND hWndMdiClient,
  304. CList < HWND, HWND > & _list,
  305. INT nStairWindowCount = 0 // zero or negative - compute automatically
  306. );
  307. static void stat_MDI_Tile(
  308. HWND hWndMdiClient,
  309. CList < HWND, HWND > & _listWindowsToSkip,
  310. WPARAM nActionFlags
  311. );
  312. static void stat_MDI_TileEWL( // explicit window list based version
  313. HWND hWndMdiClient,
  314. CList < HWND, HWND > & _list,
  315. bool bHorizontal
  316. );
  317. virtual void NcFrameImpl_SyncThemeSettings( CExtPaintManager * pPM, bool bPostNotification );
  318. friend class CExtPmBridgeNC;
  319. }; // class CExtNcFrameImpl
  320. template < class _BTNCW >
  321. class CExtNCW
  322. : public _BTNCW
  323. , public CExtNcFrameImpl
  324. {
  325. public:
  326. CExtNCW()
  327. {
  328. }
  329. virtual ~CExtNCW()
  330. {
  331. }
  332. virtual HWND NcFrameImpl_OnQueryHWND()
  333. {
  334. return GetSafeHwnd();
  335. }
  336. protected:
  337. virtual void PreSubclassWindow()
  338. {
  339. _BTNCW::PreSubclassWindow();
  340. CExtNcFrameImpl::PreSubclassWindow();
  341. }
  342. virtual void PostNcDestroy()
  343. {
  344. CExtNcFrameImpl::PostNcDestroy();
  345. _BTNCW::PostNcDestroy();
  346. }
  347. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  348. {
  349. HWND hWndOwn = m_hWnd;
  350. LRESULT lResult = 0;
  351. if( NcFrameImpl_FilterWindowProc( lResult, message, wParam, lParam ) )
  352. return lResult;
  353. if( ! ::IsWindow( hWndOwn ) )
  354. return lResult;
  355. if( ! NcFrameImpl_IsSupported() )
  356. return _BTNCW::WindowProc( message, wParam, lParam );
  357. if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
  358. return lResult;
  359. lResult = _BTNCW::WindowProc( message, wParam, lParam );
  360. if( ! ::IsWindow( hWndOwn ) )
  361. return lResult;
  362. if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
  363. return lResult;
  364. NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
  365. return lResult;
  366. }
  367. public:
  368. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  369. {
  370. ASSERT_VALID( this );
  371. return CExtNcFrameImpl::GetWindowPlacement( pWP );
  372. }
  373. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  374. {
  375. ASSERT_VALID( this );
  376. return CExtNcFrameImpl::SetWindowPlacement( pWP );
  377. }
  378. virtual void CalcWindowRect(
  379. LPRECT lpClientRect,
  380. UINT nAdjustType = CWnd::adjustBorder
  381. )
  382. {
  383. NcFrameImpl_CalcWindowRect( lpClientRect, nAdjustType );
  384. }
  385. }; // class CExtNCW
  386. class __PROF_UIS_API CExtNcFrameWatchMDIMF
  387. : public CExtHookSink
  388. , public CExtPmBridge
  389. {
  390. public:
  391. DECLARE_CExtPmBridge_MEMBERS( CExtNcFrameWatchMDIMF );
  392. static UINT g_nMsgSurface;
  393. HWND m_hWndSurface;
  394. CExtNcFrameImpl * m_pNcFrameImpl;
  395. CExtNcFrameWatchMDIMF();
  396. virtual ~CExtNcFrameWatchMDIMF();
  397. void _Surface( bool bForward );
  398. virtual bool OnHookWndMsg(
  399. LRESULT & lResult,
  400. HWND hWndHooked,
  401. UINT nMessage,
  402. WPARAM & wParam,
  403. LPARAM & lParam
  404. );
  405. virtual void OnPostHookWndMsg(
  406. LRESULT lResult,
  407. HWND hWndHooked,
  408. UINT nMessage,
  409. WPARAM wParam,
  410. LPARAM lParam
  411. );
  412. }; // class CExtNcFrameWatchMDIMF
  413. template < >
  414. class CExtNCW < CMDIFrameWnd >
  415. : public CMDIFrameWnd
  416. , public CExtNcFrameImpl
  417. {
  418. protected:
  419. CExtNcFrameWatchMDIMF m_hookWatchMDI;
  420. public:
  421. CExtNCW()
  422. {
  423. m_hookWatchMDI.m_pNcFrameImpl = this;
  424. }
  425. virtual ~CExtNCW()
  426. {
  427. }
  428. virtual HWND NcFrameImpl_OnQueryHWND()
  429. {
  430. return GetSafeHwnd();
  431. }
  432. protected:
  433. virtual void PreSubclassWindow()
  434. {
  435. CMDIFrameWnd::PreSubclassWindow();
  436. CExtNcFrameImpl::PreSubclassWindow();
  437. }
  438. virtual void PostNcDestroy()
  439. {
  440. CExtNcFrameImpl::PostNcDestroy();
  441. CMDIFrameWnd::PostNcDestroy();
  442. }
  443. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  444. {
  445. HWND hWndOwn = m_hWnd;
  446. LRESULT lResult = 0;
  447. if( NcFrameImpl_FilterWindowProc( lResult, message, wParam, lParam ) )
  448. return lResult;
  449. if( ! ::IsWindow( hWndOwn ) )
  450. return lResult;
  451. if( ! NcFrameImpl_IsSupported() )
  452. return CMDIFrameWnd::WindowProc( message, wParam, lParam );
  453. if( message == WM_DESTROY )
  454. m_hookWatchMDI.RemoveAllWndHooks();
  455. if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
  456. return lResult;
  457. lResult = CMDIFrameWnd::WindowProc( message, wParam, lParam );
  458. if( ! ::IsWindow( hWndOwn ) )
  459. return lResult;
  460. if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
  461. return lResult;
  462. NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
  463. if( message == WM_CREATE )
  464. {
  465. HWND hWndMdiClient = CExtControlBar::stat_FindMdiClientHWND( m_hWnd );
  466. ASSERT( hWndMdiClient != NULL );
  467. m_hookWatchMDI.SetupHookWndSink( hWndMdiClient );
  468. }
  469. return lResult;
  470. public:
  471. virtual void OnUpdateFrameTitle( BOOL bAddToTitle )
  472. {
  473. HWND hWndOwn = GetSafeHwnd();
  474. CMDIFrameWnd::OnUpdateFrameTitle( bAddToTitle );
  475. if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
  476. ::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
  477. }
  478. virtual void OnUpdateFrameMenu( HMENU hMenuAlt )
  479. {
  480. HWND hWndOwn = GetSafeHwnd();
  481. CMDIFrameWnd::OnUpdateFrameMenu( hMenuAlt );
  482. if( hWndOwn != NULL && ::IsWindow( hWndOwn ) )
  483. ::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
  484. }
  485. virtual BOOL DestroyWindow()
  486. {
  487. m_hookWatchMDI.RemoveAllWndHooks();
  488. return CMDIFrameWnd::DestroyWindow();
  489. }
  490. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  491. {
  492. ASSERT_VALID( this );
  493. return CExtNcFrameImpl::GetWindowPlacement( pWP );
  494. }
  495. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  496. {
  497. ASSERT_VALID( this );
  498. return CExtNcFrameImpl::SetWindowPlacement( pWP );
  499. }
  500. virtual void CalcWindowRect(
  501. LPRECT lpClientRect,
  502. UINT nAdjustType = CWnd::adjustBorder
  503. )
  504. {
  505. NcFrameImpl_CalcWindowRect( lpClientRect, nAdjustType );
  506. }
  507. protected:
  508. virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam )
  509. {
  510. // BOOL bRetVal = CMDIFrameWnd :: OnCommand( wParam, lParam );
  511. // return bRetVal;
  512. CMDIChildWnd * pActiveChild = MDIGetActive();
  513. if (pActiveChild != NULL && AfxCallWndProc( pActiveChild, pActiveChild->m_hWnd, WM_COMMAND, wParam, lParam) != 0)
  514. return TRUE;
  515. if( CFrameWnd::OnCommand( wParam, lParam ) )
  516. return TRUE;
  517. HWND hWndCtrl = (HWND)lParam;
  518. //ASSERT( AFX_IDM_FIRST_MDICHILD == 0xFF00 );
  519. if (hWndCtrl == NULL && (LOWORD(wParam) & 0xf000) == 0xf000)
  520. {
  521. m_hookWatchMDI._Surface( true );
  522. ::SendMessage( m_hWndMDIClient, WM_SETREDRAW, 0, 0 );
  523. DefWindowProc( WM_COMMAND, wParam, lParam );
  524. ::SendMessage( m_hWndMDIClient, WM_SETREDRAW, 1, 0 );
  525. m_hookWatchMDI._Surface( false );
  526. return TRUE;
  527. }
  528. return FALSE;
  529. }
  530. }; // class CExtNCW
  531. template < >
  532. class CExtNCW < CExtResizableDialog >
  533. : public CExtResizableDialog
  534. , public CExtNcFrameImpl
  535. {
  536. public:
  537. CExtNCW()
  538. {
  539. }
  540. CExtNCW(
  541. UINT nIDTemplate,
  542. CWnd * pParentWnd = NULL
  543. )
  544. : CExtResizableDialog( nIDTemplate, pParentWnd )
  545. {
  546. }
  547. CExtNCW(
  548. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  549. CWnd * pParentWnd = NULL
  550. )
  551. : CExtResizableDialog( lpszTemplateName, pParentWnd )
  552. {
  553. }
  554. virtual ~CExtNCW()
  555. {
  556. }
  557. virtual HWND NcFrameImpl_OnQueryHWND()
  558. {
  559. return GetSafeHwnd();
  560. }
  561. protected:
  562. virtual void PreSubclassWindow()
  563. {
  564. CExtResizableDialog::PreSubclassWindow();
  565. CExtNcFrameImpl::PreSubclassWindow();
  566. }
  567. virtual void PostNcDestroy()
  568. {
  569. CExtNcFrameImpl::PostNcDestroy();
  570. CExtResizableDialog::PostNcDestroy();
  571. }
  572. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  573. {
  574. HWND hWndOwn = m_hWnd;
  575. LRESULT lResult = 0;
  576. if( NcFrameImpl_FilterWindowProc( lResult, message, wParam, lParam ) )
  577. return lResult;
  578. if( ! ::IsWindow( hWndOwn ) )
  579. return lResult;
  580. if( ! NcFrameImpl_IsSupported() )
  581. return CExtResizableDialog::WindowProc( message, wParam, lParam );
  582. if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
  583. return lResult;
  584. lResult = CExtResizableDialog::WindowProc( message, wParam, lParam );
  585. if( ! ::IsWindow( hWndOwn ) )
  586. return lResult;
  587. if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
  588. return lResult;
  589. NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
  590. return lResult;
  591. }
  592. public:
  593. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  594. {
  595. ASSERT_VALID( this );
  596. return CExtNcFrameImpl::GetWindowPlacement( pWP );
  597. }
  598. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  599. {
  600. ASSERT_VALID( this );
  601. return CExtNcFrameImpl::SetWindowPlacement( pWP );
  602. }
  603. virtual void CalcWindowRect(
  604. LPRECT lpClientRect,
  605. UINT nAdjustType = CWnd::adjustBorder
  606. )
  607. {
  608. NcFrameImpl_CalcWindowRect( lpClientRect, nAdjustType );
  609. }
  610. virtual bool NcFrameImpl_GetMinMaxInfo(
  611. LPMINMAXINFO pMMI
  612. ) const
  613. {
  614. return CExtResizableDialog::NcFrameImpl_GetMinMaxInfo( pMMI );
  615. }
  616. }; // class CExtNCW
  617. template < >
  618. class CExtNCW < CExtResizablePropertySheet >
  619. : public CExtResizablePropertySheet
  620. , public CExtNcFrameImpl
  621. {
  622. public:
  623. CExtNCW()
  624. {
  625. }
  626. CExtNCW(
  627. UINT nIDCaption,
  628. CWnd *pParentWnd = NULL,
  629. UINT iSelectPage = 0
  630. )
  631. : CExtResizablePropertySheet( nIDCaption, pParentWnd, iSelectPage )
  632. {
  633. }
  634. CExtNCW(
  635. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  636. CWnd *pParentWnd = NULL,
  637. UINT iSelectPage = 0
  638. )
  639. : CExtResizablePropertySheet( pszCaption, pParentWnd, iSelectPage )
  640. {
  641. }
  642. virtual ~CExtNCW()
  643. {
  644. }
  645. virtual HWND NcFrameImpl_OnQueryHWND()
  646. {
  647. return GetSafeHwnd();
  648. }
  649. protected:
  650. virtual void PreSubclassWindow()
  651. {
  652. CExtResizablePropertySheet::PreSubclassWindow();
  653. CExtNcFrameImpl::PreSubclassWindow();
  654. }
  655. virtual void PostNcDestroy()
  656. {
  657. CExtNcFrameImpl::PostNcDestroy();
  658. CExtResizablePropertySheet::PostNcDestroy();
  659. }
  660. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  661. {
  662. HWND hWndOwn = m_hWnd;
  663. LRESULT lResult = 0;
  664. if( NcFrameImpl_FilterWindowProc( lResult, message, wParam, lParam ) )
  665. return lResult;
  666. if( ! ::IsWindow( hWndOwn ) )
  667. return lResult;
  668. if( ! NcFrameImpl_IsSupported() )
  669. return CExtResizablePropertySheet::WindowProc( message, wParam, lParam );
  670. if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
  671. return lResult;
  672. lResult = CExtResizablePropertySheet::WindowProc( message, wParam, lParam );
  673. if( ! ::IsWindow( hWndOwn ) )
  674. return lResult;
  675. if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
  676. return lResult;
  677. NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
  678. return lResult;
  679. }
  680. public:
  681. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  682. {
  683. ASSERT_VALID( this );
  684. return CExtNcFrameImpl::GetWindowPlacement( pWP );
  685. }
  686. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  687. {
  688. ASSERT_VALID( this );
  689. return CExtNcFrameImpl::SetWindowPlacement( pWP );
  690. }
  691. virtual void CalcWindowRect(
  692. LPRECT lpClientRect,
  693. UINT nAdjustType = CWnd::adjustBorder
  694. )
  695. {
  696. NcFrameImpl_CalcWindowRect( lpClientRect, nAdjustType );
  697. }
  698. virtual bool NcFrameImpl_GetMinMaxInfo(
  699. LPMINMAXINFO pMMI
  700. ) const
  701. {
  702. return CExtResizablePropertySheet::NcFrameImpl_GetMinMaxInfo( pMMI );
  703. }
  704. }; // class CExtNCW
  705. template < >
  706. class CExtNCW < CFileDialog >
  707. : public CFileDialog
  708. , public CExtNcFrameImpl
  709. {
  710. public:
  711. CExtNCW(
  712. BOOL bOpenFileDialog,
  713. __EXT_MFC_SAFE_LPCTSTR lpszDefExt = NULL,
  714. __EXT_MFC_SAFE_LPCTSTR lpszFileName = NULL,
  715. DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  716. __EXT_MFC_SAFE_LPCTSTR lpszFilter = NULL,
  717. CWnd* pParentWnd = NULL
  718. )
  719. : CFileDialog( 
  720. bOpenFileDialog, 
  721. lpszDefExt, 
  722. lpszFileName, 
  723. dwFlags, 
  724. lpszFilter, 
  725. pParentWnd 
  726. )
  727. {
  728. }
  729. virtual ~CExtNCW()
  730. {
  731. }
  732. virtual HWND NcFrameImpl_OnQueryHWND()
  733. {
  734. return GetSafeHwnd();
  735. }
  736. protected:
  737. virtual void PreSubclassWindow()
  738. {
  739. CFileDialog::PreSubclassWindow();
  740. CExtNcFrameImpl::PreSubclassWindow();
  741. }
  742. virtual void PostNcDestroy()
  743. {
  744. CExtNcFrameImpl::PostNcDestroy();
  745. CFileDialog::PostNcDestroy();
  746. }
  747. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  748. {
  749. HWND hWndOwn = m_hWnd;
  750. LRESULT lResult = 0;
  751. if( NcFrameImpl_FilterWindowProc( lResult, message, wParam, lParam ) )
  752. return lResult;
  753. if( ! ::IsWindow( hWndOwn ) )
  754. return lResult;
  755. if( ! NcFrameImpl_IsSupported() )
  756. return CFileDialog::WindowProc( message, wParam, lParam );
  757. if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
  758. return lResult;
  759. lResult = CFileDialog::WindowProc( message, wParam, lParam );
  760. if( ! ::IsWindow( hWndOwn ) )
  761. return lResult;
  762. if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
  763. return lResult;
  764. NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
  765. return lResult;
  766. }
  767. public:
  768. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  769. {
  770. ASSERT_VALID( this );
  771. return CExtNcFrameImpl::GetWindowPlacement( pWP );
  772. }
  773. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  774. {
  775. ASSERT_VALID( this );
  776. return CExtNcFrameImpl::SetWindowPlacement( pWP );
  777. }
  778. virtual void CalcWindowRect(
  779. LPRECT lpClientRect,
  780. UINT nAdjustType = CWnd::adjustBorder
  781. )
  782. {
  783. NcFrameImpl_CalcWindowRect( lpClientRect, nAdjustType );
  784. }
  785. }; // class CExtNCW
  786. template < >
  787. class CExtNCW < CPrintDialog >
  788. : public CPrintDialog
  789. , public CExtNcFrameImpl
  790. {
  791. public:
  792. CExtNCW(
  793. BOOL bPrintSetupOnly,
  794. DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION,
  795. CWnd* pParentWnd = NULL
  796. )
  797. : CPrintDialog(
  798. bPrintSetupOnly,
  799. dwFlags,
  800. pParentWnd
  801. )
  802. {
  803. }
  804. virtual ~CExtNCW()
  805. {
  806. }
  807. virtual HWND NcFrameImpl_OnQueryHWND()
  808. {
  809. return GetSafeHwnd();
  810. }
  811. protected:
  812. virtual void PreSubclassWindow()
  813. {
  814. CPrintDialog::PreSubclassWindow();
  815. CExtNcFrameImpl::PreSubclassWindow();
  816. }
  817. virtual void PostNcDestroy()
  818. {
  819. CExtNcFrameImpl::PostNcDestroy();
  820. CPrintDialog::PostNcDestroy();
  821. }
  822. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  823. {
  824. HWND hWndOwn = m_hWnd;
  825. LRESULT lResult = 0;
  826. if( NcFrameImpl_FilterWindowProc( lResult, message, wParam, lParam ) )
  827. return lResult;
  828. if( ! ::IsWindow( hWndOwn ) )
  829. return lResult;
  830. if( ! NcFrameImpl_IsSupported() )
  831. return CPrintDialog::WindowProc( message, wParam, lParam );
  832. if( NcFrameImpl_PreWindowProc( lResult, message, wParam, lParam ) )
  833. return lResult;
  834. lResult = CPrintDialog::WindowProc( message, wParam, lParam );
  835. if( ! ::IsWindow( hWndOwn ) )
  836. return lResult;
  837. if( CWnd::FromHandlePermanent(hWndOwn) == NULL )
  838. return lResult;
  839. NcFrameImpl_PostWindowProc( lResult, message, wParam, lParam );
  840. return lResult;
  841. }
  842. public:
  843. BOOL GetWindowPlacement( WINDOWPLACEMENT * pWP ) const
  844. {
  845. ASSERT_VALID( this );
  846. return CExtNcFrameImpl::GetWindowPlacement( pWP );
  847. }
  848. BOOL SetWindowPlacement( const WINDOWPLACEMENT * pWP )
  849. {
  850. ASSERT_VALID( this );
  851. return CExtNcFrameImpl::SetWindowPlacement( pWP );
  852. }
  853. virtual void CalcWindowRect(
  854. LPRECT lpClientRect,
  855. UINT nAdjustType = CWnd::adjustBorder
  856. )
  857. {
  858. NcFrameImpl_CalcWindowRect( lpClientRect, nAdjustType );
  859. }
  860. }; // class CExtNCW
  861. #endif // (!defined __EXT_MFC_NO_NC_FRAME )
  862. #endif // __EXT_NC_FRAME_H