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

界面编程

开发平台:

Visual C++

  1. }
  2. }
  3. if( pWndFrameImpl->IsWindowEnabled()
  4. && ( (! NcFrameImpl_IsForceEmpty() )
  5. || (! NcFrameImpl_IsForceEmptyNcBorderEmpty() )
  6. )
  7. )
  8. {
  9. NcFrameImpl_DelayRgnAdjustment();
  10. NcFrameImpl_SetupRgn();
  11. }
  12. else
  13. {
  14. if( NcFrameImpl_IsDwmCaptionReplacement() )
  15. {
  16. if( m_pNcFrameImplBridge != NULL )
  17. {
  18. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  19. if( hWnd != NULL && ::IsWindow( hWnd ) )
  20. ::RedrawWindow(
  21. hWnd,
  22. NULL,
  23. NULL,
  24. RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN
  25. );
  26. }
  27. } // if( NcFrameImpl_IsDwmCaptionReplacement() )
  28. }
  29. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  30. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  31. ::SendMessage( hWndOwn, WM_NCPAINT, 0L, 0L );
  32. if( m_pNcFrameImplBridge != NULL )
  33. {
  34. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  35. if( hWnd != NULL )
  36. {
  37. ::InvalidateRect( hWnd, NULL, TRUE );
  38. ::UpdateWindow( hWnd );
  39. }
  40. }
  41. }
  42. break;
  43. case WM_NCLBUTTONDBLCLK:
  44. if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  45. {
  46. if( wParam == HTCAPTION || wParam == HTSYSMENU || wParam == HTTOP )
  47. {
  48. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  49. if( hWnd != NULL && ::IsWindow( hWnd ) )
  50. {
  51. CPoint ptCursor;
  52. ::GetCursorPos( &ptCursor );
  53. ::ScreenToClient( hWnd, &ptCursor );
  54. CExtToolControlBar * pBar = DYNAMIC_DOWNCAST( CExtToolControlBar, CWnd::FromHandlePermanent( hWnd ) );
  55. if( pBar != NULL )
  56. {
  57. INT nToolBarButtonHT = pBar->HitTest( ptCursor );
  58. if( nToolBarButtonHT >= 0 )
  59. {
  60. lResult = ::SendMessage( hWnd, WM_LBUTTONDBLCLK, 0, MAKELPARAM( ptCursor.x, ptCursor.y ) );
  61. return true;
  62. }
  63. }
  64. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  65. } // if( wParam == ...
  66. break;
  67. } // if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  68. if( NcFrameImpl_IsForceEmpty() )
  69. break;
  70. if( wParam == HTCAPTION )
  71. {
  72. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  73. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  74. bool bZoomed = ( ::IsZoomed( hWndOwn ) ) ? true : false;
  75. UINT nSC = bZoomed ? SC_RESTORE : SC_MAXIMIZE;
  76. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_RESTORE )
  77. || NcFrameImpl_OnQuerySystemCommandEnabled( SC_MAXIMIZE )
  78. )
  79. ::SendMessage( hWndOwn, WM_SYSCOMMAND, WPARAM(nSC), lParam );
  80. lResult = 0L;
  81. return true;
  82. } // if( wParam == HTCAPTION )
  83. else if( wParam == HTSYSMENU )
  84. {
  85. if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_CLOSE ) )
  86. {
  87. HWND hWndOwn = pWndFrameImpl->GetSafeHwnd();
  88. ::SendMessage( hWndOwn, WM_SYSCOMMAND, SC_CLOSE, lParam );
  89. if( ::IsWindow( hWndOwn ) )
  90. pWndFrameImpl->SendMessage( WM_NCPAINT );
  91. lResult = 0L;
  92. return true;
  93. } // if( NcFrameImpl_OnQuerySystemCommandEnabled( SC_CLOSE ) )
  94. } // else if( wParam == HTSYSMENU )
  95. break;
  96. case WM_NCHITTEST:
  97. if( ! NcFrameImpl_IsSupported() )
  98. break;
  99. if( NcFrameImpl_IsDwmCaptionReplacement() )
  100. {
  101. if( g_PaintManager.m_DWM.DwmDefWindowProc(
  102. pWndFrameImpl->m_hWnd,
  103. message,
  104. wParam,
  105. lParam,
  106. &lResult
  107. )
  108. )
  109. return true;
  110. INT nV = ::GetSystemMetrics( SM_CYFRAME );
  111. INT nCV = nV + ::GetSystemMetrics( SM_CYCAPTION );
  112. if( pWndFrameImpl->IsZoomed() )
  113. nCV += nV;
  114. CPoint pointScreen;
  115. if( ::GetCursorPos( &pointScreen ) )
  116. {
  117. CRect rc;
  118. pWndFrameImpl->GetWindowRect( &rc );
  119. rc.bottom = rc.top + nV;
  120. if( rc.PtInRect( pointScreen ) )
  121. {
  122. lResult = HTTOP;
  123. return true;
  124. }
  125. rc.bottom = rc.top + nCV;
  126. rc.DeflateRect( ::GetSystemMetrics(SM_CXFRAME), 0 );
  127. if( rc.PtInRect( pointScreen ) )
  128. {
  129. lResult = HTCAPTION;
  130. return true;
  131. }
  132. }
  133. }
  134. if( NcFrameImpl_IsDwmBased() )
  135. break;
  136. if( ! NcFrameImpl_IsForceEmpty() )
  137. {
  138. if( m_bNcFrameImpl_HelperInsideNcHitTest )
  139. {
  140. lResult = HTNOWHERE;
  141. return true;
  142. }
  143. m_bNcFrameImpl_HelperInsideNcHitTest = true;
  144. CRect rcWnd;
  145. pWndFrameImpl->GetWindowRect( &rcWnd );
  146. CPoint pointScreen, pointWnd( -32767, -32767 );
  147. if( ::GetCursorPos( &pointScreen ) )
  148. {
  149. pointWnd = pointScreen;
  150. pointWnd -= rcWnd.TopLeft();
  151. }
  152. if( m_pNcFrameImplBridge != NULL )
  153. {
  154. HRGN hRgn = m_pNcFrameImplBridge->NcFrameImplBridge_GetNcResizingHRGN();
  155. if( hRgn != NULL
  156. && ::PtInRegion( hRgn, pointWnd.x, pointWnd.y )
  157. )
  158. {
  159. m_nNcFrameImpl_LastExternalNcHT = HTTOPLEFT;
  160. lResult = HTTOPLEFT;
  161. //NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  162. ::SetCursor( ::LoadCursor( NULL, IDC_SIZENWSE ) );
  163. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  164. return true;
  165. }
  166. }
  167. CRect rcTmp = NcFrameImpl_GetNcScRect( SC_CLOSE );
  168. if( rcTmp.PtInRect(pointWnd) )
  169. {
  170. m_nNcFrameImpl_LastExternalNcHT = HTCLOSE;
  171. lResult = HTCAPTION;
  172. NcFrameImpl_CheckCursor( pointScreen, LPARAM(HTCLOSE) );
  173. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  174. if( m_pNcFrameImplBridge != NULL )
  175. {
  176. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  177. if( hWnd != NULL && ::IsWindow( hWnd ) )
  178. {
  179. rcTmp.OffsetRect( rcWnd.TopLeft() );
  180. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+0 );
  181. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+1 );
  182. ::InvalidateRect( hWnd, &rcTmp, TRUE );
  183. if( m_rcNcFrameImpl_LastExternalNcHT != rcTmp )
  184. {
  185. ::InvalidateRect( hWnd, &m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  186. m_rcNcFrameImpl_LastExternalNcHT = rcTmp;
  187. }
  188. //::UpdateWindow( hWnd );
  189. }
  190. }
  191. return true;
  192. }
  193. rcTmp = NcFrameImpl_GetNcScRect( SC_MINIMIZE );
  194. if( rcTmp.PtInRect(pointWnd) )
  195. {
  196. m_nNcFrameImpl_LastExternalNcHT = HTMINBUTTON;
  197. lResult = HTCAPTION;
  198. NcFrameImpl_CheckCursor( pointScreen, LPARAM(HTMINBUTTON) );
  199. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  200. if( m_pNcFrameImplBridge != NULL )
  201. {
  202. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  203. if( hWnd != NULL && ::IsWindow( hWnd ) )
  204. {
  205. rcTmp.OffsetRect( rcWnd.TopLeft() );
  206. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+0 );
  207. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+1 );
  208. ::InvalidateRect( hWnd, &rcTmp, TRUE );
  209. if( m_rcNcFrameImpl_LastExternalNcHT != rcTmp )
  210. {
  211. ::InvalidateRect( hWnd, &m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  212. m_rcNcFrameImpl_LastExternalNcHT = rcTmp;
  213. }
  214. //::UpdateWindow( hWnd );
  215. }
  216. }
  217. return true;
  218. }
  219. rcTmp = NcFrameImpl_GetNcScRect( SC_MAXIMIZE );
  220. if( rcTmp.PtInRect(pointWnd) )
  221. {
  222. m_nNcFrameImpl_LastExternalNcHT = HTMAXBUTTON;
  223. lResult = HTCAPTION;
  224. NcFrameImpl_CheckCursor( pointScreen, LPARAM(HTMAXBUTTON) );
  225. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  226. if( m_pNcFrameImplBridge != NULL )
  227. {
  228. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  229. if( hWnd != NULL && ::IsWindow( hWnd ) )
  230. {
  231. rcTmp.OffsetRect( rcWnd.TopLeft() );
  232. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+0 );
  233. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+1 );
  234. ::InvalidateRect( hWnd, &rcTmp, TRUE );
  235. if( m_rcNcFrameImpl_LastExternalNcHT != rcTmp )
  236. {
  237. ::InvalidateRect( hWnd, &m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  238. m_rcNcFrameImpl_LastExternalNcHT = rcTmp;
  239. }
  240. }
  241. }
  242. return true;
  243. }
  244. rcTmp = NcFrameImpl_GetNcScRect( SC_CONTEXTHELP );
  245. if( rcTmp.PtInRect(pointWnd) )
  246. {
  247. m_nNcFrameImpl_LastExternalNcHT = HTHELP;
  248. lResult = HTCAPTION;
  249. NcFrameImpl_CheckCursor( pointScreen, LPARAM(HTHELP) );
  250. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  251. if( m_pNcFrameImplBridge != NULL )
  252. {
  253. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  254. if( hWnd != NULL && ::IsWindow( hWnd ) )
  255. {
  256. rcTmp.OffsetRect( rcWnd.TopLeft() );
  257. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+0 );
  258. ::ScreenToClient( hWnd, ((LPPOINT)(&rcTmp))+1 );
  259. ::InvalidateRect( hWnd, &rcTmp, TRUE );
  260. if( m_rcNcFrameImpl_LastExternalNcHT != rcTmp )
  261. {
  262. ::InvalidateRect( hWnd, &m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  263. m_rcNcFrameImpl_LastExternalNcHT = rcTmp;
  264. }
  265. }
  266. }
  267. return true;
  268. }
  269. // MINMAXINFO _mmi, * pMinMaxInfo = NULL;
  270. // ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  271. // CExtPaintManager::monitor_parms_t _mp;
  272. // CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );
  273. // _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  274. // _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  275. // _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  276. // _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  277. // _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  278. // _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  279. // _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  280. // _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  281. // if( pWndFrameImpl->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  282. // pMinMaxInfo = &_mmi;
  283. MINMAXINFO * pMinMaxInfo = &m_NcFrameImpl_MinMaxInfo_Cache;
  284. pWndFrameImpl->ModifyStyle( WS_CAPTION|WS_BORDER, 0, 0 );
  285. Sleep( 1 ); // this line of code magically fixes 50-100% CPU eating problem when moving mouse over skinable NC areas
  286. if( NcFrameImpl_GetNcHtRect(HTTOPLEFT,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  287. {
  288. m_nNcFrameImpl_LastExternalNcHT = HTTOPLEFT;
  289. lResult = HTTOPLEFT;
  290. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  291. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  292. return true;
  293. }
  294. if( NcFrameImpl_GetNcHtRect(HTTOPRIGHT,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  295. {
  296. m_nNcFrameImpl_LastExternalNcHT = HTTOPRIGHT;
  297. lResult = HTTOPRIGHT;
  298. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  299. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  300. return true;
  301. }
  302. if( NcFrameImpl_GetNcHtRect(HTBOTTOMLEFT,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  303. {
  304. m_nNcFrameImpl_LastExternalNcHT = HTBOTTOMLEFT;
  305. lResult = HTBOTTOMLEFT;
  306. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  307. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  308. return true;
  309. }
  310. if( NcFrameImpl_GetNcHtRect(HTBOTTOMRIGHT,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  311. {
  312. m_nNcFrameImpl_LastExternalNcHT = HTBOTTOMRIGHT;
  313. lResult = HTBOTTOMRIGHT;
  314. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  315. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  316. return true;
  317. }
  318. if( NcFrameImpl_GetNcHtRect(HTTOP,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  319. {
  320. m_nNcFrameImpl_LastExternalNcHT = HTTOP;
  321. lResult = HTTOP;
  322. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  323. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  324. return true;
  325. }
  326. if( NcFrameImpl_GetNcHtRect(HTBOTTOM,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  327. {
  328. m_nNcFrameImpl_LastExternalNcHT = HTBOTTOM;
  329. lResult = HTBOTTOM;
  330. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  331. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  332. return true;
  333. }
  334. if( NcFrameImpl_GetNcHtRect(HTLEFT,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  335. {
  336. m_nNcFrameImpl_LastExternalNcHT = HTLEFT;
  337. lResult = HTLEFT;
  338. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  339. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  340. return true;
  341. }
  342. if( NcFrameImpl_GetNcHtRect(HTRIGHT,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  343. {
  344. m_nNcFrameImpl_LastExternalNcHT = HTRIGHT;
  345. lResult = HTRIGHT;
  346. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  347. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  348. return true;
  349. }
  350. if( NcFrameImpl_GetNcHtRect(HTSYSMENU,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  351. {
  352. m_nNcFrameImpl_LastExternalNcHT = HTSYSMENU;
  353. lResult = HTSYSMENU;
  354. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  355. // if( pWndFrameImpl->IsIconic() && (! CExtPopupMenuWnd::IsKeyPressed( VK_LBUTTON) ) )
  356. // lResult = HTNOWHERE;
  357. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  358. return true;
  359. }
  360. if( NcFrameImpl_GetNcHtRect(HTCAPTION,false,false,false,pMinMaxInfo,&rcWnd).PtInRect(pointWnd) )
  361. {
  362. m_nNcFrameImpl_LastExternalNcHT = HTCAPTION;
  363. lResult = HTCAPTION;
  364. NcFrameImpl_CheckCursor( pointScreen, LPARAM(lResult) );
  365. // if( pWndFrameImpl->IsIconic() && (! CExtPopupMenuWnd::IsKeyPressed( VK_LBUTTON) ) )
  366. // lResult = HTNOWHERE;
  367. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  368. return true;
  369. }
  370. m_bNcFrameImpl_HelperInsideNcHitTest = false;
  371. } // if( ! NcFrameImpl_IsForceEmpty() )
  372. lResult = HTCLIENT;
  373. return true;
  374. //break;
  375. case WM_NCCALCSIZE:
  376. if( pWndFrameImpl->IsIconic() )
  377. break;
  378. { // BLOCK: adjust MDI client area styles
  379. HWND hWndMdiClient = CExtControlBar::stat_FindMdiClientHWND( pWndFrameImpl->m_hWnd );
  380. if( hWndMdiClient != NULL )
  381. {
  382. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWndMdiClient, GWL_STYLE );
  383. if( (dwStyle&WS_BORDER) != 0 )
  384. ::__EXT_MFC_SetWindowLong( hWndMdiClient, GWL_STYLE, dwStyle&(~(WS_BORDER)) );
  385. __EXT_MFC_LONG_PTR dwStyleEx = ::__EXT_MFC_GetWindowLong( hWndMdiClient, GWL_EXSTYLE );
  386. if( (dwStyleEx&(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) != 0 )
  387. ::__EXT_MFC_SetWindowLong( hWndMdiClient, GWL_EXSTYLE, (dwStyleEx&(~(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)))|WS_EX_CLIENTEDGE );
  388. }
  389. } // BLOCK: adjust MDI client area styles
  390. if( pWndFrameImpl->IsKindOf( RUNTIME_CLASS( CMDIChildWnd ) )
  391. && m_bNcFrameImpl_IsActive
  392. && (pWndFrameImpl->GetStyle()&WS_MAXIMIZE) != 0
  393. )
  394. break;
  395. else
  396. {
  397. bool bNcCaptionMerging = false;
  398. if( m_pNcFrameImplBridge != NULL )
  399. {
  400. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  401. if( hWnd != NULL
  402. && m_pNcFrameImplBridge->NcFrameImplBridge_OnQueryCaptionMergeMode()
  403. )
  404. {
  405. bNcCaptionMerging = true;
  406. if( ! m_bNcFrameImpl_CreatePassed )
  407. return false;
  408. if( NcFrameImpl_IsNcLocked() )
  409. return false;
  410. CFrameWnd * pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWndFrameImpl );
  411. if( pFrame != NULL )
  412. {
  413. bool bIsLoading = false;
  414. if( CExtControlBar::ProfileBarStateIsSerializing( pFrame, &bIsLoading ) )
  415. {
  416. if( bIsLoading )
  417. return false;
  418. }
  419. }
  420. }
  421. }
  422. CExtUxTheme::__EXT_UX_MARGINS _margins = { 0, 0, 0, 0 };
  423. bool bDwmMode = NcFrameImpl_IsDwmBased();
  424. if( bDwmMode && ( ! bNcCaptionMerging ) )
  425. {
  426. m_bNcFrameImpl_DwmSurfaceInitializationComplete = false;
  427. g_PaintManager.m_DWM.DwmExtendFrameIntoClientArea( pWndFrameImpl->m_hWnd, &_margins );
  428. return false;
  429. }
  430. if( ! NcFrameImpl_IsNcLocked() )
  431. {
  432. NCCALCSIZE_PARAMS * pNCCSP =
  433. reinterpret_cast < NCCALCSIZE_PARAMS * > ( lParam );
  434. ASSERT( pNCCSP != NULL );
  435. if( bNcCaptionMerging && bDwmMode )
  436. {
  437. INT nV = ::GetSystemMetrics( SM_CYFRAME );
  438. INT nCV = nV + ::GetSystemMetrics( SM_CYCAPTION );
  439. INT nLeftRight = ::GetSystemMetrics( SM_CXFRAME ), nTopBottom = nV;
  440. if( pWndFrameImpl->IsZoomed() )
  441. nCV += nV;
  442. _margins.cyTopHeight = nCV;
  443. pNCCSP->rgrc[0].left += nLeftRight;
  444. pNCCSP->rgrc[0].right -= nLeftRight;
  445. pNCCSP->rgrc[0].bottom -= nTopBottom;
  446. } // if( bNcCaptionMerging && bDwmMode )
  447. else if( NcFrameImpl_IsForceEmpty() )
  448. {
  449. if( ! NcFrameImpl_IsForceEmptyNcBorderEmpty() )
  450. {
  451. CRect rc = NcFrameImpl_GetForceEmptyNcBorder();
  452. if( ! bNcCaptionMerging )
  453. pNCCSP->rgrc[0].top += rc.top;
  454. pNCCSP->rgrc[0].left += rc.left;
  455. pNCCSP->rgrc[0].right -= rc.right;
  456. pNCCSP->rgrc[0].bottom -= rc.bottom;
  457. } // if( ! NcFrameImpl_IsForceEmptyNcBorderEmpty() )
  458. } // else if( NcFrameImpl_IsForceEmpty() )
  459. else
  460. {
  461. CRect rcNcBorders, rcThemePadding;
  462. NcFrameImpl_GetPM()->NcFrame_GetMetrics(
  463. rcNcBorders,
  464. rcThemePadding,
  465. pWndFrameImpl
  466. );
  467. if( ! bNcCaptionMerging )
  468. pNCCSP->rgrc[0].top += rcThemePadding.top;
  469. pNCCSP->rgrc[0].left    += rcThemePadding.left;
  470. pNCCSP->rgrc[0].right   -= rcThemePadding.right;
  471. pNCCSP->rgrc[0].bottom  -= rcThemePadding.bottom;
  472. // bool bMaximized = ( ( pWndFrameImpl->GetStyle() & WS_MAXIMIZE ) != 0 ) ? true : false;
  473. // if( bMaximized )
  474. // {
  475. // pNCCSP->rgrc[0].left   -= rcNcBorders.left;
  476. // pNCCSP->rgrc[0].right  += rcNcBorders.right;
  477. // pNCCSP->rgrc[0].top    -= rcNcBorders.top;
  478. // pNCCSP->rgrc[0].bottom += rcNcBorders.bottom;
  479. // }
  480. if( m_pNcFrameImplBridge != NULL
  481. && m_pNcFrameImplBridge->NcFrameImplBridge_OnQueryCaptionMergeMode()
  482. )
  483. pNCCSP->rgrc[0].top -=
  484. NcFrameImpl_GetPM() -> 
  485. NcFrame_GetCaptionHeight(
  486. NcFrameImpl_IsActive(),
  487. NcFrameImpl_GetFrameWindow()
  488. );
  489. }
  490. WINDOWPLACEMENT _wp;
  491. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  492. if( bDwmMode )
  493. GetWindowPlacement( &_wp );
  494. if( m_pNcFrameImplBridge != NULL && NcFrameImpl_IsDwmCaptionReplacement()  )
  495. {
  496. m_pNcFrameImplBridge->NcFrameImpl_PreSetWindowPlacement( _wp );
  497. m_pNcFrameImplBridge->NcFrameImpl_AdjustDwmArea( _margins );
  498. }
  499. m_bNcFrameImpl_DwmSurfaceInitializationComplete = true;
  500. g_PaintManager.m_DWM.DwmExtendFrameIntoClientArea( pWndFrameImpl->m_hWnd, &_margins );
  501. if( m_pNcFrameImplBridge != NULL && NcFrameImpl_IsDwmCaptionReplacement()  )
  502. m_pNcFrameImplBridge->NcFrameImpl_PostSetWindowPlacement( _wp );
  503. } // if( ! NcFrameImpl_IsNcLocked() )
  504. lResult = 0;
  505. return true;
  506. }
  507. case WM_NCPAINT:
  508. if( ! NcFrameImpl_IsDwmBased() )
  509. {
  510. if( (! NcFrameImpl_IsForceEmpty() )
  511. // || m_bNcFrameImpl_RestoreEnabledState
  512. )
  513. {
  514. CMDIChildWnd * pWndMdiChild = DYNAMIC_DOWNCAST( CMDIChildWnd, pWndFrameImpl );
  515. if( pWndMdiChild != NULL )
  516. {
  517. HWND hWndMDIClient = ::GetParent( pWndMdiChild->m_hWnd );
  518. HWND hWndActiveChildFrame = (HWND) ::SendMessage( hWndMDIClient, WM_MDIGETACTIVE, 0, NULL );
  519. if( hWndActiveChildFrame != NULL )
  520. m_bNcFrameImpl_IsActive = ( hWndActiveChildFrame == pWndMdiChild->m_hWnd ) ? true : false;
  521. }
  522. CWindowDC dcPaint( pWndFrameImpl );
  523. NcFrameImpl_OnNcPaint( dcPaint );
  524. lResult = 0;
  525. return true;
  526. }
  527. } //if( ! NcFrameImpl_IsDwmBased() )
  528. break;
  529. case WM_NCLBUTTONUP:
  530. if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  531. {
  532. if( wParam == HTCAPTION || wParam == HTSYSMENU || wParam == HTTOP )
  533. {
  534. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  535. if( hWnd != NULL && ::IsWindow( hWnd ) )
  536. {
  537. CPoint ptCursor;
  538. ::GetCursorPos( &ptCursor );
  539. ::ScreenToClient( hWnd, &ptCursor );
  540. CExtToolControlBar * pBar = DYNAMIC_DOWNCAST( CExtToolControlBar, CWnd::FromHandlePermanent( hWnd ) );
  541. if( pBar != NULL )
  542. {
  543. INT nToolBarButtonHT = pBar->HitTest( ptCursor );
  544. if( nToolBarButtonHT >= 0 )
  545. {
  546. lResult = ::SendMessage( hWnd, WM_LBUTTONUP, 0, MAKELPARAM( ptCursor.x, ptCursor.y ) );
  547. return true;
  548. }
  549. }
  550. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  551. } // if( wParam == ...
  552. break;
  553. } // if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  554. if( ! NcFrameImpl_IsSupported() )
  555. break;
  556. return true;
  557. // break;
  558. case WM_NCLBUTTONDOWN:
  559. {
  560. if( ! NcFrameImpl_IsSupported() )
  561. break;
  562. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  563. if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  564. {
  565. if( wParam == HTCAPTION || wParam == HTSYSMENU || wParam == HTTOP )
  566. {
  567. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  568. if( hWnd != NULL && ::IsWindow( hWnd ) )
  569. {
  570. CPoint ptCursor;
  571. ::GetCursorPos( &ptCursor );
  572. ::ScreenToClient( hWnd, &ptCursor );
  573. CExtToolControlBar * pBar = DYNAMIC_DOWNCAST( CExtToolControlBar, CWnd::FromHandlePermanent( hWnd ) );
  574. if( pBar != NULL )
  575. {
  576. CExtPaintManager * pPM = NcFrameImpl_GetPM();
  577. ASSERT_VALID( pPM );
  578. if( ( (! pPM->Ribbon_FileButtonIsItegrationSupported() )
  579. || pPM->Ribbon_IsSystemMenuIconPresent()
  580. )
  581. && pBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) )
  582. )
  583. {
  584. CRect rc;
  585. pBar->GetClientRect( &rc );
  586. rc.right = rc.left + ::GetSystemMetrics(SM_CXICON) / 2;
  587. rc.bottom = rc.top + ::GetSystemMetrics(SM_CYICON) / 2;
  588. rc.OffsetRect( 0, ::GetSystemMetrics(SM_CXFRAME) );
  589. if( rc.PtInRect( ptCursor ) )
  590. {
  591. ((CExtMenuControlBar*)pBar)->TrackMainFrameSystemMenu();
  592. return true;
  593. }
  594. }
  595. INT nToolBarButtonHT = pBar->HitTest( ptCursor );
  596. if( nToolBarButtonHT >= 0 )
  597. {
  598. lResult = ::SendMessage( hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM( ptCursor.x, ptCursor.y ) );
  599. return true;
  600. }
  601. }
  602. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  603. } // if( wParam == ...
  604. break;
  605. } // if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  606. #endif // #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  607. if( NcFrameImpl_IsForceEmpty() )
  608. break;
  609. if( ( ! ( m_bNcFrameImpl_Resizing || m_bNcFrameImpl_Moving ) )
  610. && ( ! NcFrameImpl_IsDwmBased() )
  611. )
  612. m_bNcFrameImpl_Resizing = m_bNcFrameImpl_Moving = true;
  613. if( m_bNcFrameImpl_Resizing || m_bNcFrameImpl_Moving )
  614. {
  615. if( NcFrameImpl_IsDwmBased() )
  616. m_bNcFrameImpl_Resizing = m_bNcFrameImpl_Moving = false;
  617. if( ::GetActiveWindow() != pWndFrameImpl->m_hWnd )
  618. pWndFrameImpl->SetActiveWindow();
  619. }
  620. m_nNcFrameImpl_ScTrackedButtonPressed = 0;
  621. CRect rcWnd;
  622. pWndFrameImpl->GetWindowRect( &rcWnd );
  623. CPoint pointWnd;
  624. ::GetCursorPos( &pointWnd );
  625. pointWnd -= rcWnd.TopLeft();
  626. if( m_rcNcFrameImpl_ScClose.PtInRect( pointWnd ) )
  627. m_nNcFrameImpl_ScTrackedButtonPressed = SC_CLOSE;
  628. else if( m_rcNcFrameImpl_ScMaximize.PtInRect( pointWnd ) )
  629. m_nNcFrameImpl_ScTrackedButtonPressed = SC_MAXIMIZE;
  630. else if( m_rcNcFrameImpl_ScMinimize.PtInRect( pointWnd ) )
  631. m_nNcFrameImpl_ScTrackedButtonPressed = SC_MINIMIZE;
  632. else if( m_rcNcFrameImpl_ScHelp.PtInRect( pointWnd ) )
  633. m_nNcFrameImpl_ScTrackedButtonPressed = SC_CONTEXTHELP;
  634. if( m_nNcFrameImpl_ScTrackedButtonPressed != 0 )
  635. {
  636. HWND hWnd = NULL;
  637. if( m_pNcFrameImplBridge != NULL
  638. && ( hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd() ) != NULL
  639. && (! m_rcNcFrameImpl_LastExternalNcHT.IsRectEmpty() )
  640. )
  641. ::InvalidateRect( hWnd, m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  642. pWndFrameImpl->SendMessage( WM_NCPAINT );
  643. if( m_nNcFrameImpl_ScTrackedButtonPressed != 0
  644. && CWnd::GetCapture() != pWndFrameImpl
  645. )
  646. pWndFrameImpl->SetCapture();
  647. } // if( m_nNcFrameImpl_ScTrackedButtonPressed != 0 )
  648. if( /*
  649. m_bNcFrameImpl_Moving
  650. &&*/
  651. wParam == HTSYSMENU
  652. )
  653. { // system menu tracking code
  654. lResult = 0;
  655. return false;
  656. } // system menu tracking code
  657. else if(
  658. m_bNcFrameImpl_Moving
  659. && wParam == HTCAPTION
  660. )
  661. { // track moving loop
  662. DWORD dwStyle = pWndFrameImpl->GetStyle();
  663. static const DWORD dwCheckMask = WS_MAXIMIZE|WS_VISIBLE|WS_DISABLED;
  664. DWORD dwCheckResult = dwStyle&dwCheckMask;
  665. if( dwCheckResult != WS_VISIBLE )
  666. {
  667. lResult = 0;
  668. return true;
  669. }
  670. m_bNcFrameImpl_MovingLoopTracking = true;
  671. HWND hWnd = pWndFrameImpl->GetSafeHwnd();
  672. ::SendMessage( hWnd, WM_ENTERSIZEMOVE, 0L, 0L );
  673. ::SetCapture( hWnd );
  674. CPoint ptStart( short(LOWORD(lParam)), short(HIWORD(lParam)) );
  675. CRect rcWndStart;
  676. ::GetWindowRect( hWnd, rcWndStart );
  677. HANDLE hCurrentThread = ::GetCurrentThread();
  678. int nOldCurrentThreadPriority = ::GetThreadPriority( hCurrentThread );
  679. ::SetThreadPriority( hCurrentThread, THREAD_PRIORITY_ABOVE_NORMAL );
  680. HANDLE hProcess = ::GetCurrentProcess();
  681. DWORD dwOldProcessPriorityClass = ::GetPriorityClass( hProcess );
  682. ::SetPriorityClass( hProcess, HIGH_PRIORITY_CLASS );
  683. bool bStop = false, bStartDetected = false;
  684. for( ; ! bStop ; )
  685. {
  686. ::WaitMessage();
  687. MSG msg;
  688. // Process all the messages in the message queue
  689. while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  690. {
  691. switch( msg.message )
  692. {
  693. case WM_ACTIVATEAPP:
  694. case WM_CANCELMODE:
  695. case WM_LBUTTONDOWN:
  696. case WM_LBUTTONUP:
  697. case WM_LBUTTONDBLCLK:
  698. case WM_MBUTTONDOWN:
  699. case WM_MBUTTONUP:
  700. case WM_MBUTTONDBLCLK:
  701. case WM_RBUTTONDOWN:
  702. case WM_RBUTTONUP:
  703. case WM_RBUTTONDBLCLK:
  704. case WM_NCLBUTTONDOWN:
  705. case WM_NCLBUTTONUP:
  706. case WM_NCLBUTTONDBLCLK:
  707. case WM_NCRBUTTONDOWN:
  708. case WM_NCRBUTTONUP:
  709. case WM_NCRBUTTONDBLCLK:
  710. case WM_NCMBUTTONDOWN:
  711. case WM_NCMBUTTONUP:
  712. case WM_NCMBUTTONDBLCLK:
  713. case WM_CONTEXTMENU:
  714. bStop = true;
  715. break;
  716. case WM_CAPTURECHANGED:
  717. if( hWnd != ((HWND)lParam) )
  718. bStop = true;
  719. break;
  720. case WM_SIZE:
  721. case WM_WINDOWPOSCHANGING:
  722. case WM_WINDOWPOSCHANGED:
  723. case WM_ERASEBKGND:
  724. case WM_NCHITTEST:
  725. case WM_NCMOUSEMOVE:
  726. if( ::IsWindow( hWnd ) )
  727. {
  728. ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
  729. continue;
  730. }
  731. bStop = true;
  732. break;
  733. case WM_MOUSEMOVE:
  734. ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
  735. if( msg.hwnd == hWnd )
  736. {
  737. // while( ::PeekMessage( &msg, hWnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE ) )
  738. // {
  739. // if( ::PeekMessage( &msg, hWnd, WM_NCLBUTTONUP, WM_NCLBUTTONUP, PM_NOREMOVE ) )
  740. // break;
  741. // }
  742. CPoint pt;
  743. if( ! ::GetCursorPos( &pt ) )
  744. {
  745. bStop = true;
  746. break;
  747. }
  748. if( ( ::__EXT_MFC_GetWindowLong(hWnd,GWL_STYLE) & WS_CHILD ) != 0 )
  749. {
  750. HWND hWndParent = ::GetParent( hWnd );
  751. ASSERT( hWndParent != NULL );
  752. CRect rcWndParent;
  753. ::GetWindowRect( hWndParent, &rcWndParent );
  754. pt.x = max( pt.x, rcWndParent.left );
  755. pt.x = min( pt.x, rcWndParent.right );
  756. pt.y = max( pt.y, rcWndParent.top );
  757. pt.y = min( pt.y, rcWndParent.bottom );
  758. }
  759. CPoint ptOffset(
  760. pt.x - ptStart.x,
  761. pt.y - ptStart.y
  762. );
  763. if( (! bStartDetected )
  764. && abs( ptOffset.x ) < 5
  765. && abs( ptOffset.y ) < 5
  766. )
  767. continue;
  768. bStartDetected = true;
  769. CRect rcWnd = rcWndStart;
  770. rcWnd.OffsetRect( ptOffset );
  771. CRect rcWndCurrent;
  772. ::GetWindowRect( hWnd, &rcWndCurrent );
  773. if( rcWndCurrent != rcWnd )
  774. {
  775. if( ( ::__EXT_MFC_GetWindowLong(hWnd,GWL_STYLE) & WS_CHILD ) != 0 )
  776. {
  777. HWND hWndParent = ::GetParent( hWnd );
  778. ASSERT( hWndParent != NULL );
  779. ::ScreenToClient( hWndParent, ((LPPOINT)&rcWnd) );
  780. ::ScreenToClient( hWndParent, ((LPPOINT)&rcWnd)+1 );
  781. }
  782. CRect rcWndAdjusted = rcWnd;
  783. if( ::SendMessage( hWnd, WM_MOVING, 0L, LPARAM(&rcWndAdjusted) ) != 0L )
  784. rcWnd = rcWndAdjusted;
  785. ::MoveWindow( hWnd, rcWnd.left, rcWnd.top, rcWnd.Width(), rcWnd.Height(), TRUE );
  786. SendMessage( hWnd, WM_NCPAINT, 0, 0 );
  787. CExtPaintManager::stat_PassPaintMessages();
  788. ::Sleep(1);
  789. } // if( rcWndCurrent != rcWnd )
  790. } // if( msg.hwnd == hWnd )
  791.   if( ::IsWindow( hWnd ) )
  792.   continue;
  793. bStop = true;
  794. break;
  795. default:
  796. if( WM_KEYFIRST <= msg.message
  797. && msg.message <= WM_KEYLAST
  798. )
  799. bStop = true;
  800. break;
  801. } // switch( msg.message )
  802. if( ! ::IsWindow( hWnd ) )
  803. bStop = true;
  804. if( bStop )
  805. break;
  806. CWinThread * pThread = AfxGetThread();
  807. if( pThread == NULL )
  808. ::DispatchMessage( &msg );
  809. else
  810. if( ! pThread->PumpMessage() )
  811. {
  812. PostQuitMessage(0);
  813. break; // Signal WM_QUIT received
  814. } // if( !AfxGetThread()->PumpMessage() )
  815. } // while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  816. if( bStop )
  817. break;
  818. for( LONG nIdleCounter = 0L;
  819. true; // ::AfxGetThread()->OnIdle(nIdleCounter);
  820. nIdleCounter ++
  821. )
  822. {
  823. CWinThread * pThread = AfxGetThread();
  824. if( pThread == NULL )
  825. break;
  826. if( ! pThread->OnIdle( nIdleCounter ) )
  827. break;
  828. }
  829. } // for( ; ! bStop ; )
  830. ::SetThreadPriority( hCurrentThread, nOldCurrentThreadPriority );
  831. ::CloseHandle( hCurrentThread );
  832. ::SetPriorityClass( hProcess, dwOldProcessPriorityClass );
  833. ::CloseHandle( hProcess );
  834. if( ::IsWindow( hWnd ) )
  835. {
  836. m_bNcFrameImpl_MovingLoopTracking = false;
  837. if( ::GetCapture() == hWnd )
  838. ::ReleaseCapture();
  839. }
  840. ::SendMessage( hWnd, WM_EXITSIZEMOVE, 0L, 0L );
  841. lResult = 0;
  842. return true;
  843. } // track moving loop
  844. else if(
  845. m_bNcFrameImpl_Resizing
  846. && ( wParam == HTLEFT
  847. || wParam == HTRIGHT
  848. || wParam == HTTOP
  849. || wParam == HTBOTTOM
  850. || wParam == HTTOPLEFT
  851. || wParam == HTBOTTOMLEFT
  852. || wParam == HTTOPRIGHT
  853. || wParam == HTBOTTOMRIGHT
  854. )
  855. )
  856. { // track resizing loop
  857. DWORD dwStyle = pWndFrameImpl->GetStyle();
  858. static const DWORD dwCheckMask = WS_MAXIMIZE|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED;
  859. DWORD dwCheckResult = dwStyle&dwCheckMask;
  860. if( dwCheckResult != WS_VISIBLE )
  861. {
  862. lResult = 0;
  863. return true;
  864. }
  865. WPARAM wParamSizingCode = 0L;
  866. switch( wParam )
  867. {
  868. case HTTOP:           wParamSizingCode = WMSZ_TOP;           break;
  869. case HTBOTTOM:        wParamSizingCode = WMSZ_BOTTOM;        break;
  870. case HTLEFT:          wParamSizingCode = WMSZ_LEFT;          break;
  871. case HTRIGHT:         wParamSizingCode = WMSZ_RIGHT;         break;
  872. case HTTOPLEFT:       wParamSizingCode = WMSZ_TOPLEFT;       break;
  873. case HTTOPRIGHT:      wParamSizingCode = WMSZ_TOPRIGHT;      break;
  874. case HTBOTTOMLEFT:    wParamSizingCode = WMSZ_BOTTOMLEFT;    break;
  875. case HTBOTTOMRIGHT:   wParamSizingCode = WMSZ_BOTTOMRIGHT;   break;
  876. } // switch( wParam )
  877. ASSERT( wParamSizingCode != 0L );
  878. HWND hWnd = pWndFrameImpl->GetSafeHwnd();
  879. ::SendMessage( hWnd, WM_ENTERSIZEMOVE, 0L, 0L );
  880. ::SetCapture( hWnd );
  881. CPoint ptStart( short(LOWORD(lParam)), short(HIWORD(lParam)) );
  882. CRect rcWndStart;
  883. ::GetWindowRect( hWnd, rcWndStart );
  884. HANDLE hCurrentThread = ::GetCurrentThread();
  885. int nOldCurrentThreadPriority = ::GetThreadPriority( hCurrentThread );
  886. ::SetThreadPriority( hCurrentThread, THREAD_PRIORITY_ABOVE_NORMAL );
  887. HANDLE hProcess = ::GetCurrentProcess();
  888. DWORD dwOldProcessPriorityClass = ::GetPriorityClass( hProcess );
  889. ::SetPriorityClass( hProcess, HIGH_PRIORITY_CLASS );
  890. m_bNcFrameImpl_ResizingLoopTracking = true;
  891. MINMAXINFO _mmi;
  892. // ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  893. // CExtPaintManager::monitor_parms_t _mp;
  894. // CExtPaintManager::stat_GetMonitorParms( _mp, (CWnd*)pWndFrameImpl );
  895. // _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  896. // _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  897. // _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  898. // _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  899. // _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  900. // _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  901. // _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  902. // _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  903. // pWndFrameImpl->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) );
  904. ::memcpy( &_mmi, &m_NcFrameImpl_MinMaxInfo_Cache, sizeof(MINMAXINFO) );
  905. NcFrameImpl_GetMinMaxInfo( &_mmi );
  906. bool bStop = false;
  907. for( ; ! bStop ; )
  908. {
  909. ::WaitMessage();
  910. MSG msg;
  911. // Process all the messages in the message queue
  912. while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  913. {
  914. switch( msg.message )
  915. {
  916. case WM_ACTIVATEAPP:
  917. case WM_CANCELMODE:
  918. case WM_LBUTTONDOWN:
  919. case WM_LBUTTONUP:
  920. case WM_LBUTTONDBLCLK:
  921. case WM_MBUTTONDOWN:
  922. case WM_MBUTTONUP:
  923. case WM_MBUTTONDBLCLK:
  924. case WM_RBUTTONDOWN:
  925. case WM_RBUTTONUP:
  926. case WM_RBUTTONDBLCLK:
  927. case WM_NCLBUTTONDOWN:
  928. case WM_NCLBUTTONUP:
  929. case WM_NCLBUTTONDBLCLK:
  930. case WM_NCRBUTTONDOWN:
  931. case WM_NCRBUTTONUP:
  932. case WM_NCRBUTTONDBLCLK:
  933. case WM_NCMBUTTONDOWN:
  934. case WM_NCMBUTTONUP:
  935. case WM_NCMBUTTONDBLCLK:
  936. case WM_CONTEXTMENU:
  937. bStop = true;
  938. break;
  939. case WM_CAPTURECHANGED:
  940. if( hWnd != ((HWND)lParam) )
  941. bStop = true;
  942. break;
  943. case WM_SIZE:
  944. case WM_WINDOWPOSCHANGING:
  945. case WM_WINDOWPOSCHANGED:
  946. case WM_ERASEBKGND:
  947. case WM_NCHITTEST:
  948. case WM_NCMOUSEMOVE:
  949. if( ::IsWindow( hWnd ) )
  950. {
  951. ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
  952. continue;
  953. }
  954. bStop = true;
  955. break;
  956. case WM_MOUSEMOVE:
  957. ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
  958. if( msg.hwnd == hWnd )
  959. {
  960. // while( ::PeekMessage( &msg, hWnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE ) )
  961. // {
  962. // if( ::PeekMessage( &msg, hWnd, WM_NCLBUTTONUP, WM_NCLBUTTONUP, PM_NOREMOVE ) )
  963. // break;
  964. // }
  965. CPoint pt;
  966. if( ! ::GetCursorPos( &pt ) )
  967. {
  968. bStop = true;
  969. break;
  970. }
  971. CRect rcWnd = rcWndStart;
  972. if( wParam == HTLEFT
  973. || wParam == HTTOPLEFT
  974. || wParam == HTBOTTOMLEFT
  975. )
  976. {
  977. rcWnd.left = rcWndStart.left + pt.x - ptStart.x;
  978. if( rcWnd.Width() < _mmi.ptMinTrackSize.x )
  979. rcWnd.left = rcWnd.right - _mmi.ptMinTrackSize.x;
  980. if( rcWnd.Width() > _mmi.ptMaxTrackSize.x )
  981. rcWnd.left = rcWnd.right - _mmi.ptMaxTrackSize.x;
  982. //if( rcWnd.left > rcWndStart.left )
  983. // rcWnd.left = rcWndStart.left;
  984. }
  985. if( wParam == HTRIGHT
  986. || wParam == HTTOPRIGHT
  987. || wParam == HTBOTTOMRIGHT
  988. )
  989. {
  990. rcWnd.right = rcWndStart.right + pt.x - ptStart.x;
  991. if( rcWnd.Width() < _mmi.ptMinTrackSize.x )
  992. rcWnd.right = rcWnd.left + _mmi.ptMinTrackSize.x;
  993. if( rcWnd.Width() > _mmi.ptMaxTrackSize.x )
  994. rcWnd.right = rcWnd.left + _mmi.ptMaxTrackSize.x;
  995. //if( rcWnd.right < rcWndStart.right )
  996. // rcWnd.right = rcWndStart.right;
  997. }
  998. if( wParam == HTTOP
  999. || wParam == HTTOPLEFT
  1000. || wParam == HTTOPRIGHT
  1001. )
  1002. {
  1003. rcWnd.top = rcWndStart.top + pt.y - ptStart.y;
  1004. if( rcWnd.Height() < _mmi.ptMinTrackSize.y )
  1005. rcWnd.top = rcWnd.bottom - _mmi.ptMinTrackSize.y;
  1006. if( rcWnd.Height() > _mmi.ptMaxTrackSize.y )
  1007. rcWnd.top = rcWnd.bottom - _mmi.ptMaxTrackSize.y;
  1008. //if( rcWnd.top > rcWndStart.top )
  1009. // rcWnd.top = rcWndStart.top;
  1010. }
  1011. if( wParam == HTBOTTOM
  1012. || wParam == HTBOTTOMLEFT
  1013. || wParam == HTBOTTOMRIGHT
  1014. )
  1015. {
  1016. rcWnd.bottom = rcWndStart.bottom + pt.y - ptStart.y;
  1017. if( rcWnd.Height() < _mmi.ptMinTrackSize.y )
  1018. rcWnd.bottom = rcWnd.top + _mmi.ptMinTrackSize.y;
  1019. if( rcWnd.Height() > _mmi.ptMaxTrackSize.y )
  1020. rcWnd.bottom = rcWnd.top + _mmi.ptMaxTrackSize.y;
  1021. //if( rcWnd.bottom < rcWndStart.bottom )
  1022. // rcWnd.bottom = rcWndStart.bottom;
  1023. }
  1024. CRect rcWndCurrent;
  1025. ::GetWindowRect( hWnd, &rcWndCurrent );
  1026. if( rcWndCurrent != rcWnd )
  1027. {
  1028. UINT nIDFirst = 0, nIDLast = 0xFFFF, nIDLeftOver = AFX_IDW_PANE_FIRST;
  1029. AFX_SIZEPARENTPARAMS layout = { NULL, { 0, 0, 0, 0 }, { 0, 0 }, FALSE };
  1030. HWND hWndLeftOver = NULL;
  1031. layout.bStretch = TRUE;
  1032. CRect rcClientCurrent;
  1033. ::GetClientRect( hWnd, &rcClientCurrent );
  1034. layout.rect.right = rcClientCurrent.right + rcWnd.Width() - rcWndCurrent.Width();
  1035. layout.rect.bottom = rcClientCurrent.bottom + rcWnd.Height() - rcWndCurrent.Height();
  1036. layout.hDWP = ::BeginDeferWindowPos( 8 );
  1037. HWND hWndChild = ::GetTopWindow( hWnd );
  1038. for( ; hWndChild != NULL; hWndChild = ::GetNextWindow( hWndChild, GW_HWNDNEXT ) )
  1039. {
  1040. UINT nIDC = _AfxGetDlgCtrlID( hWndChild );
  1041. if( nIDC == nIDLeftOver )
  1042. hWndLeftOver = hWndChild;
  1043. else
  1044. if( nIDC >= nIDFirst
  1045. && nIDC <= nIDLast
  1046. )
  1047. ::SendMessage( hWndChild, WM_SIZEPARENT, 0, (LPARAM)&layout );
  1048. }
  1049. if( nIDLeftOver != 0 && hWndLeftOver != NULL )
  1050. {
  1051. CWnd * pLeftOver = CWnd::FromHandle( hWndLeftOver );
  1052. pLeftOver->CalcWindowRect( &layout.rect );
  1053. ::AfxRepositionWindow( &layout, hWndLeftOver, &layout.rect );
  1054. }
  1055. if( layout.hDWP == NULL
  1056. || ( ! ::EndDeferWindowPos( layout.hDWP ) )
  1057. )
  1058. {
  1059. TRACE0("Warning: DeferWindowPos failed - low system resources.n");
  1060. }
  1061. if( ( ::__EXT_MFC_GetWindowLong(hWnd,GWL_STYLE) & WS_CHILD ) != 0 )
  1062. {
  1063. HWND hWndParent = ::GetParent( hWnd );
  1064. ASSERT( hWndParent != NULL );
  1065. ::ScreenToClient( hWndParent, ((LPPOINT)&rcWnd) );
  1066. ::ScreenToClient( hWndParent, ((LPPOINT)&rcWnd)+1 );
  1067. }
  1068. CRect rcWndAdjusted = rcWnd;
  1069. if( ::SendMessage( hWnd, WM_SIZING, wParamSizingCode, LPARAM(&rcWndAdjusted) ) != 0L )
  1070. rcWnd = rcWndAdjusted;
  1071. ::MoveWindow( hWnd, rcWnd.left, rcWnd.top, rcWnd.Width(), rcWnd.Height(), TRUE );
  1072. SendMessage( hWnd, WM_NCPAINT, 0, 0 );
  1073. CExtPaintManager::stat_PassPaintMessages();
  1074. ::Sleep(1);
  1075. } // if( rcWndCurrent != rcWnd )
  1076. } // if( msg.hwnd == hWnd )
  1077.   if( ::IsWindow( hWnd ) )
  1078.   continue;
  1079. bStop = true;
  1080. break;
  1081. default:
  1082. if( WM_KEYFIRST <= msg.message
  1083. && msg.message <= WM_KEYLAST
  1084. )
  1085. bStop = true;
  1086. break;
  1087. } // switch( msg.message )
  1088. if( ! ::IsWindow( hWnd ) )
  1089. bStop = true;
  1090. if( bStop )
  1091. break;
  1092. if( ! AfxGetThread()->PumpMessage() )
  1093. {
  1094. PostQuitMessage(0);
  1095. break; // Signal WM_QUIT received
  1096. } // if( !AfxGetThread()->PumpMessage() )
  1097. } // while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  1098. if( bStop )
  1099. break;
  1100. for( LONG nIdleCounter = 0L;
  1101. ::AfxGetThread()->OnIdle(nIdleCounter);
  1102. nIdleCounter ++
  1103. );
  1104. } // for( ; ! bStop ; )
  1105. ::SetThreadPriority( hCurrentThread, nOldCurrentThreadPriority );
  1106. ::CloseHandle( hCurrentThread );
  1107. ::SetPriorityClass( hProcess, dwOldProcessPriorityClass );
  1108. ::CloseHandle( hProcess );
  1109. if( ::IsWindow( hWnd ) )
  1110. {
  1111. m_bNcFrameImpl_ResizingLoopTracking = false;
  1112. if( ::GetCapture() == hWnd )
  1113. ::ReleaseCapture();
  1114. }
  1115. ::SendMessage( hWnd, WM_EXITSIZEMOVE, 0L, 0L );
  1116. lResult = 0;
  1117. return true;
  1118. } // track resizing loop
  1119. DWORD dw = 0 ;
  1120. if( dw != 0 )
  1121. pWndFrameImpl->ModifyStyle( WS_CAPTION, 0 );
  1122. struct friendly_wnd_t : public CWnd { friend class CExtNcFrameImpl; };
  1123. lResult = ((friendly_wnd_t*)pWndFrameImpl)->DefWindowProc( message, wParam, lParam );
  1124. if( dw != 0 )
  1125. pWndFrameImpl->ModifyStyle( 0, dw );
  1126. return true;
  1127. }
  1128. break;
  1129. case WM_LBUTTONDOWN:
  1130. {
  1131. if( NcFrameImpl_IsForceEmpty() )
  1132. break;
  1133. if( pWndFrameImpl->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) )
  1134. pWndFrameImpl->GetParent()->SendMessage( WM_MDIACTIVATE, (WPARAM)pWndFrameImpl->m_hWnd );
  1135. m_nNcFrameImpl_ScTrackedButtonPressed = 0;
  1136. CRect rcWnd;
  1137. pWndFrameImpl->GetWindowRect( &rcWnd );
  1138. CPoint pointWnd;
  1139. ::GetCursorPos( &pointWnd );
  1140. pointWnd -= rcWnd.TopLeft();
  1141. m_rcNcFrameImpl_ScClose    = NcFrameImpl_GetNcScRect( SC_CLOSE );
  1142. m_rcNcFrameImpl_ScMaximize = NcFrameImpl_GetNcScRect( SC_MAXIMIZE );
  1143. m_rcNcFrameImpl_ScMinimize = NcFrameImpl_GetNcScRect( SC_MINIMIZE );
  1144. m_rcNcFrameImpl_ScHelp     = NcFrameImpl_GetNcScRect( SC_CONTEXTHELP );
  1145. if( m_rcNcFrameImpl_ScClose.PtInRect( pointWnd ) )
  1146. m_nNcFrameImpl_ScTrackedButtonPressed = SC_CLOSE;
  1147. else if( m_rcNcFrameImpl_ScMaximize.PtInRect( pointWnd ) )
  1148. m_nNcFrameImpl_ScTrackedButtonPressed = SC_MAXIMIZE;
  1149. else if( m_rcNcFrameImpl_ScMinimize.PtInRect( pointWnd ) )
  1150. m_nNcFrameImpl_ScTrackedButtonPressed = SC_MINIMIZE;
  1151. else if( m_rcNcFrameImpl_ScHelp.PtInRect( pointWnd ) )
  1152. m_nNcFrameImpl_ScTrackedButtonPressed = SC_CONTEXTHELP;
  1153. if( m_nNcFrameImpl_ScTrackedButtonPressed != 0 )
  1154. {
  1155. if( ::GetActiveWindow() != pWndFrameImpl->m_hWnd )
  1156. pWndFrameImpl->SetActiveWindow();
  1157. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1158. HWND hWnd = NULL;
  1159. if( m_pNcFrameImplBridge != NULL
  1160. && ( hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd() ) != NULL
  1161. && (! m_rcNcFrameImpl_LastExternalNcHT.IsRectEmpty() )
  1162. )
  1163. ::InvalidateRect( hWnd, m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  1164. if( m_nNcFrameImpl_ScTrackedButtonPressed != 0
  1165. && CWnd::GetCapture() != pWndFrameImpl
  1166. )
  1167. pWndFrameImpl->SetCapture();
  1168. } // if( m_nNcFrameImpl_ScTrackedButtonPressed != 0 )
  1169. }
  1170. break;
  1171. case WM_LBUTTONUP:
  1172. {
  1173. HWND hWnd = NULL;
  1174. if( m_pNcFrameImplBridge != NULL
  1175. && ( hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd() ) != NULL
  1176. && (! m_rcNcFrameImpl_LastExternalNcHT.IsRectEmpty() )
  1177. )
  1178. {
  1179. m_nNcFrameImpl_LastExternalNcHT = UINT(-1);
  1180. ::InvalidateRect( hWnd, m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  1181. //::UpdateWindow( hWnd );
  1182. m_rcNcFrameImpl_LastExternalNcHT.SetRect( -1, -1, -1, -1 );
  1183. }
  1184. if( NcFrameImpl_IsForceEmpty() )
  1185. break;
  1186. if( m_nNcFrameImpl_ScTrackedButtonPressed == 0 )
  1187. break;
  1188. UINT nSC = m_nNcFrameImpl_ScTrackedButtonPressed;
  1189. if( nSC == SC_MAXIMIZE && pWndFrameImpl->IsZoomed() )
  1190. nSC = SC_RESTORE;
  1191. else if( nSC == SC_MINIMIZE && pWndFrameImpl->IsIconic() )
  1192. nSC = SC_RESTORE;
  1193. m_nNcFrameImpl_ScTrackedButtonHover = m_nNcFrameImpl_ScTrackedButtonPressed = 0;
  1194. m_wndNcFrameImpl_Tip.Hide();
  1195. if( CWnd::GetCapture() == pWndFrameImpl )
  1196. ::ReleaseCapture();
  1197. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1198. CRect rcButton = NcFrameImpl_GetNcScRect( nSC );
  1199. CRect rcWnd;
  1200. pWndFrameImpl->GetWindowRect( &rcWnd );
  1201. CPoint pointWnd;
  1202. ::GetCursorPos( &pointWnd );
  1203. pointWnd -= rcWnd.TopLeft();
  1204. if( rcButton.PtInRect(pointWnd) )
  1205. {
  1206. HWND hWndOwn = pWndFrameImpl->GetSafeHwnd();
  1207. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  1208. bool bEnabled = NcFrameImpl_OnQuerySystemCommandEnabled( nSC );
  1209. if( ! bEnabled )
  1210. {
  1211. if( nSC == SC_MAXIMIZE )
  1212. bEnabled = NcFrameImpl_OnQuerySystemCommandEnabled( SC_RESTORE );
  1213. else if( nSC == SC_RESTORE )
  1214. bEnabled = NcFrameImpl_OnQuerySystemCommandEnabled( SC_MAXIMIZE );
  1215. }
  1216. if( bEnabled )
  1217. {
  1218. pWndFrameImpl->SendMessage( WM_SYSCOMMAND, nSC );
  1219. if( ::IsWindow( hWndOwn ) )
  1220. {
  1221. if( nSC == SC_CLOSE )
  1222. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1223. } // if( ::IsWindow( hWndOwn ) )
  1224. }
  1225. } // if( rcButton.PtInRect(pointWnd) )
  1226. }
  1227. lResult = 0;
  1228. return true;
  1229. case WM_MOUSEMOVE:
  1230. {
  1231. HWND hWnd = NULL;
  1232. if( m_pNcFrameImplBridge != NULL
  1233. && ( hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd() ) != NULL
  1234. && (! m_rcNcFrameImpl_LastExternalNcHT.IsRectEmpty() )
  1235. )
  1236. ::InvalidateRect( hWnd, m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  1237. if( NcFrameImpl_IsForceEmpty() )
  1238. break;
  1239. if( m_nNcFrameImpl_ScTrackedButtonHover == 0 )
  1240. break;
  1241. CRect rcWnd;
  1242. pWndFrameImpl->GetWindowRect( &rcWnd );
  1243. CPoint pointWnd;
  1244. if( ::GetCursorPos( &pointWnd ) )
  1245. {
  1246. pWndFrameImpl->PostMessage( WM_NCHITTEST, 0, MAKELPARAM( pointWnd.x, pointWnd.y ) );
  1247. pointWnd -= rcWnd.TopLeft();
  1248. }
  1249. else
  1250. pointWnd.x = pointWnd.y = -32767;
  1251. UINT nScTrackedButtonHover = 0;
  1252. if( m_rcNcFrameImpl_ScClose.PtInRect( pointWnd ) )
  1253. nScTrackedButtonHover = SC_CLOSE;
  1254. else if( m_rcNcFrameImpl_ScMaximize.PtInRect( pointWnd ) )
  1255. nScTrackedButtonHover = SC_MAXIMIZE;
  1256. else if( m_rcNcFrameImpl_ScMinimize.PtInRect( pointWnd ) )
  1257. nScTrackedButtonHover = SC_MINIMIZE;
  1258. else if( m_rcNcFrameImpl_ScHelp.PtInRect( pointWnd ) )
  1259. nScTrackedButtonHover = SC_CONTEXTHELP;
  1260. if( m_nNcFrameImpl_ScTrackedButtonHover != nScTrackedButtonHover )
  1261. {
  1262. m_nNcFrameImpl_ScTrackedButtonHover = nScTrackedButtonHover;
  1263. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1264. if( m_nNcFrameImpl_ScTrackedButtonHover == 0
  1265. && m_nNcFrameImpl_ScTrackedButtonPressed == 0
  1266. )
  1267. {
  1268. if( CWnd::GetCapture() == pWndFrameImpl )
  1269. ::ReleaseCapture();
  1270. m_wndNcFrameImpl_Tip.Hide();
  1271. }
  1272. else
  1273. {
  1274. LPCTSTR strTipText = NcFrameImpl_GetScTipText( m_nNcFrameImpl_ScTrackedButtonHover );
  1275. if( strTipText == NULL || _tcslen(strTipText) == 0 )
  1276. m_wndNcFrameImpl_Tip.Hide();
  1277. else
  1278. {
  1279. CRect rcItem = NcFrameImpl_GetNcScRect( m_nNcFrameImpl_ScTrackedButtonHover );
  1280. rcItem.OffsetRect( rcWnd.TopLeft() );
  1281. m_wndNcFrameImpl_Tip.SetText( strTipText );
  1282. m_wndNcFrameImpl_Tip.Show( pWndFrameImpl, rcItem );
  1283. }
  1284. }
  1285. lResult = 0;
  1286. return true;
  1287. } // if( m_nNcFrameImpl_ScTrackedButtonHover != nScTrackedButtonHover )
  1288. }
  1289. lResult = 0;
  1290. return true;
  1291. case WM_NCMOUSEMOVE:
  1292. if( ! NcFrameImpl_IsSupported() )
  1293. break;
  1294. else
  1295. {
  1296. HWND hWnd = NULL;
  1297. if( m_pNcFrameImplBridge != NULL
  1298. && ( hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd() ) != NULL
  1299. && (! m_rcNcFrameImpl_LastExternalNcHT.IsRectEmpty() )
  1300. )
  1301. ::InvalidateRect( hWnd, m_rcNcFrameImpl_LastExternalNcHT, TRUE );
  1302. if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  1303. {
  1304. if( wParam == HTCAPTION || wParam == HTSYSMENU )
  1305. {
  1306. hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1307. if( hWnd != NULL && ::IsWindow( hWnd ) )
  1308. {
  1309. CPoint ptCursor;
  1310. ::GetCursorPos( &ptCursor );
  1311. ::ScreenToClient( hWnd, &ptCursor );
  1312. CExtControlBar * pBar = DYNAMIC_DOWNCAST( CExtControlBar, CWnd::FromHandlePermanent( hWnd ) );
  1313. if( pBar != NULL )
  1314. {
  1315. if( pBar->_OnMouseMoveMsg( 0, ptCursor ) )
  1316. {
  1317. lResult = 0L;
  1318. return true;
  1319. }
  1320. }
  1321. else
  1322. {
  1323. lResult = ::SendMessage( hWnd, WM_MOUSEMOVE, 0, MAKELPARAM( ptCursor.x, ptCursor.y ) );
  1324. return true;
  1325. }
  1326. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  1327. } // if( wParam == HTCAPTION || wParam == HTSYSMENU )
  1328. break;
  1329. } // if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  1330. if( NcFrameImpl_IsForceEmpty() )
  1331. break;
  1332. if( m_rcNcFrameImpl_ScClose.IsRectEmpty() )
  1333. NcFrameImpl_ReCacheScButtonRects();
  1334. CRect rcWnd;
  1335. pWndFrameImpl->GetWindowRect( &rcWnd );
  1336. CPoint pointWnd;
  1337. if( ::GetCursorPos( &pointWnd ) )
  1338. {
  1339. pWndFrameImpl->PostMessage( WM_NCHITTEST, 0, MAKELPARAM( pointWnd.x, pointWnd.y ) );
  1340. pointWnd -= rcWnd.TopLeft();
  1341. }
  1342. else
  1343. pointWnd.x = pointWnd.y = -32767;
  1344. UINT nScTrackedButtonHover = 0;
  1345. if( m_rcNcFrameImpl_ScClose.PtInRect( pointWnd ) )
  1346. nScTrackedButtonHover = SC_CLOSE;
  1347. else if( m_rcNcFrameImpl_ScMaximize.PtInRect( pointWnd ) )
  1348. nScTrackedButtonHover = SC_MAXIMIZE;
  1349. else if( m_rcNcFrameImpl_ScMinimize.PtInRect( pointWnd ) )
  1350. nScTrackedButtonHover = SC_MINIMIZE;
  1351. else if( m_rcNcFrameImpl_ScHelp.PtInRect( pointWnd ) )
  1352. nScTrackedButtonHover = SC_CONTEXTHELP;
  1353. if( m_nNcFrameImpl_ScTrackedButtonHover != nScTrackedButtonHover )
  1354. {
  1355. m_nNcFrameImpl_ScTrackedButtonHover = nScTrackedButtonHover;
  1356. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1357. if( m_nNcFrameImpl_ScTrackedButtonHover != 0 )
  1358. {
  1359. if( CWnd::GetCapture() != pWndFrameImpl )
  1360. pWndFrameImpl->SetCapture();
  1361. LPCTSTR strTipText = NcFrameImpl_GetScTipText( m_nNcFrameImpl_ScTrackedButtonHover );
  1362. if( strTipText == NULL || _tcslen(strTipText) == 0 )
  1363. m_wndNcFrameImpl_Tip.Hide();
  1364. else
  1365. {
  1366. CRect rcItem = NcFrameImpl_GetNcScRect( m_nNcFrameImpl_ScTrackedButtonHover );
  1367. rcItem.OffsetRect( rcWnd.TopLeft() );
  1368. m_wndNcFrameImpl_Tip.SetText( strTipText );
  1369. m_wndNcFrameImpl_Tip.Show( pWndFrameImpl, rcItem );
  1370. }
  1371. }
  1372. else
  1373. m_wndNcFrameImpl_Tip.Hide();
  1374. } // if( m_nNcFrameImpl_ScTrackedButtonHover != nScTrackedButtonHover )
  1375. }
  1376. lResult = 0;
  1377. return true;
  1378. case WM_SYSCOMMAND:
  1379. {
  1380. if( ! NcFrameImpl_IsSupported() )
  1381. break;
  1382. if( NcFrameImpl_IsDwmBased() )
  1383. break;
  1384. CExtPopupMenuWnd::CancelMenuTracking();
  1385. CWnd::CancelToolTips();
  1386. CExtPopupMenuSite::g_DefPopupMenuSite.GetTip().Hide();
  1387. m_wndNcFrameImpl_Tip.Hide();
  1388. if( m_wndNcFrameImpl_Tip.GetSafeHwnd() != NULL )
  1389. m_wndNcFrameImpl_Tip.DestroyWindow();
  1390. UINT nSC = UINT( wParam );
  1391. if( nSC == SC_SIZE || nSC == SC_NEXTWINDOW || nSC == SC_PREVWINDOW )
  1392. break;
  1393. if( ! NcFrameImpl_OnQuerySystemCommandEnabled( nSC ) )
  1394. {
  1395. lResult = 0;
  1396. return true;
  1397. }
  1398. pWndFrameImpl->ModifyStyle( 0, WS_CAPTION|WS_BORDER, 0 );
  1399. if( NcFrameImpl_OnQueryQuickWindowPlacement() )
  1400. {
  1401. if( nSC == SC_MAXIMIZE
  1402. || nSC == SC_MINIMIZE
  1403. || nSC == SC_RESTORE
  1404. )
  1405. {
  1406. WINDOWPLACEMENT _wp;
  1407. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1408. if( GetWindowPlacement( &_wp ) )
  1409. {
  1410. switch( nSC )
  1411. {
  1412. case SC_MAXIMIZE:
  1413. _wp.showCmd = SW_SHOWMAXIMIZED;
  1414. break;
  1415. case SC_MINIMIZE:
  1416. m_nNcFrameImpl_LastShowCmd = _wp.showCmd;
  1417. _wp.showCmd = SW_SHOWMINIMIZED;
  1418. break;
  1419. case SC_RESTORE:
  1420. _wp.showCmd =
  1421. ( m_nNcFrameImpl_LastShowCmd != SW_HIDE )
  1422. ? m_nNcFrameImpl_LastShowCmd
  1423. : SW_RESTORE // SW_SHOWNORMAL
  1424. ;
  1425. m_nNcFrameImpl_LastShowCmd = SW_HIDE;
  1426. if( _wp.showCmd == SW_SHOWMAXIMIZED && pWndFrameImpl->IsZoomed() )
  1427. _wp.showCmd = SW_RESTORE;
  1428. break;
  1429. #ifdef _DEBUG
  1430. default:
  1431. ASSERT( FALSE );
  1432. break;
  1433. #endif // _DEBUG
  1434. } // switch( nSC )
  1435. SetWindowPlacement( &_wp );
  1436. } // if( GetWindowPlacement( hWndOwn, &_wp ) )
  1437. lResult = 0;
  1438. return true;
  1439. }
  1440. } // if( NcFrameImpl_OnQueryQuickWindowPlacement() )
  1441. if( message == WM_SYSCOMMAND && nSC == SC_MINIMIZE && pWndFrameImpl->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) )
  1442. { // fix for minimizing of maximized MDI child frame
  1443. HWND hWndMdiClient = ::GetParent( pWndFrameImpl->m_hWnd );
  1444. BOOL bMax = FALSE;
  1445. HWND hWndActiveMdiChildFrame = (HWND) ::SendMessage( hWndMdiClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMax );
  1446. if( hWndActiveMdiChildFrame != NULL && bMax )
  1447. {
  1448. bool bNextAvailable = false;
  1449. HWND hWnd = ::GetWindow( hWndActiveMdiChildFrame, GW_HWNDNEXT );
  1450. for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDNEXT ) )
  1451. {
  1452. __EXT_MFC_LONG_PTR dwWndStyle = ::__EXT_MFC_GetWindowLong( hWnd, GWL_STYLE );
  1453. if( ( dwWndStyle & WS_VISIBLE ) == 0 )
  1454. continue;
  1455. if( IsIconic( hWnd ) )
  1456. continue;
  1457. bNextAvailable = true;
  1458. break;
  1459. }
  1460. if( ! bNextAvailable )
  1461. {
  1462. hWnd = ::GetWindow( hWndActiveMdiChildFrame, GW_HWNDPREV );
  1463. for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDPREV ) )
  1464. {
  1465. __EXT_MFC_LONG_PTR dwWndStyle = ::__EXT_MFC_GetWindowLong( hWnd, GWL_STYLE );
  1466. if( ( dwWndStyle & WS_VISIBLE ) == 0 )
  1467. continue;
  1468. if( IsIconic( hWnd ) )
  1469. continue;
  1470. bNextAvailable = true;
  1471. break;
  1472. }
  1473. }
  1474. if( bNextAvailable )
  1475. {
  1476. CRect rcSurface;
  1477. ::GetClientRect( hWndMdiClient, &rcSurface );
  1478. HWND hWndSurface =
  1479. ::CreateWindowEx(
  1480. 0, _T("Static"), _T(""), WS_CHILD, rcSurface.left, rcSurface.top, rcSurface.Width(), rcSurface.Height(),
  1481. hWndMdiClient, (HMENU)NULL, ::AfxGetInstanceHandle(), NULL
  1482. );
  1483. if( hWndSurface != NULL )
  1484. {
  1485. ::EnableWindow( hWndSurface, FALSE );
  1486. ::ShowWindow( hWndSurface, SW_SHOWNOACTIVATE );
  1487. }
  1488. ::SendMessage( hWndMdiClient, WM_MDINEXT, WPARAM(pWndFrameImpl->m_hWnd), 0L );
  1489. struct friendly_wnd_t : public CWnd { friend class CExtNcFrameImpl; };
  1490. lResult = ((friendly_wnd_t*)pWndFrameImpl)->DefWindowProc( message, wParam, lParam );
  1491. hWndActiveMdiChildFrame = (HWND) ::SendMessage( hWndMdiClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMax );
  1492. if( hWndActiveMdiChildFrame != NULL )
  1493. {
  1494. ::SendMessage( hWndMdiClient, WM_MDIMAXIMIZE, WPARAM(hWndActiveMdiChildFrame), 0L );
  1495. ::SendMessage( hWndMdiClient, WM_MDIACTIVATE, WPARAM(hWndActiveMdiChildFrame), 0L );
  1496. }
  1497. ::DestroyWindow( hWndSurface );
  1498. return true;
  1499. } // if( bNextAvailable )
  1500. } // if( hWndActiveMdiChildFrame != NULL && bMax )
  1501. } // fix for minimizing of maximized MDI child frame
  1502. if( m_bNcFrameImpl_IsEnabled
  1503. && ( ! m_bNcFrameImpl_RestoreEnabledState )
  1504. && nSC != SC_MOVE
  1505. && nSC != SC_SIZE
  1506. && pWndFrameImpl->IsKindOf( RUNTIME_CLASS( CMDIChildWnd ) )
  1507. )
  1508. m_bNcFrameImpl_RestoreEnabledState = true;
  1509. if( nSC != SC_CLOSE )
  1510. NcFrameImpl_NcLock( true );
  1511. }
  1512. break;
  1513. case WM_DESTROY:
  1514. case WM_NCDESTROY:
  1515. m_bNcFrameImpl_DwmSurfaceInitializationComplete = false;
  1516. m_bNcFrameImpl_CreatePassed = false;
  1517. case WM_SETTINGCHANGE:
  1518. NcFrameImpl_MapHtRects_Clean();
  1519. if( ! NcFrameImpl_IsSupported() )
  1520. break;
  1521. if( NcFrameImpl_IsDwmBased() )
  1522. break;
  1523. if( wParam == SPI_SETWORKAREA )
  1524. {
  1525. WINDOWPLACEMENT _wp;
  1526. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1527. _wp.length = sizeof(WINDOWPLACEMENT);
  1528. if( GetWindowPlacement( _wp ) && _wp.showCmd == SW_SHOWMAXIMIZED )
  1529. {
  1530. CExtPaintManager::monitor_parms_t _mp;
  1531. CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );
  1532. WINDOWPLACEMENT _wpAdjust;
  1533. ::memcpy( &_wpAdjust, &_wp, sizeof(WINDOWPLACEMENT) );
  1534. _wpAdjust.showCmd = SW_SHOWNORMAL; // SW_RESTORE;
  1535. // pWndFrameImpl->GetWindowRect( &_wpAdjust.rcNormalPosition );
  1536. ::CopyRect( &_wpAdjust.rcNormalPosition, &_mp.m_rcWorkArea );
  1537. _wpAdjust.ptMaxPosition.x = _wpAdjust.ptMaxPosition.x = _wpAdjust.rcNormalPosition.left;
  1538. _wpAdjust.ptMaxPosition.y = _wpAdjust.ptMaxPosition.y = _wpAdjust.rcNormalPosition.top;
  1539. SetWindowPlacement( _wpAdjust );
  1540. SetWindowPlacement( _wp );
  1541. //NcFrameImpl_RecalcNcFrame();
  1542. }
  1543. }
  1544. break;
  1545. case WM_DISPLAYCHANGE:
  1546. NcFrameImpl_MapHtRects_Clean();
  1547. break;
  1548. case WM_GETMINMAXINFO:
  1549. if( m_bNcFrameImpl_ResizingLoopTracking || m_bNcFrameImpl_MovingLoopTracking )
  1550.  break;
  1551. if( NcFrameImpl_IsSupported() )
  1552. {
  1553. LPMINMAXINFO pMMI = (LPMINMAXINFO)lParam;
  1554. ASSERT( pMMI != NULL );
  1555. struct friendly_wnd_t : public CWnd { friend class CExtNcFrameImpl; };
  1556. ((friendly_wnd_t*)pWndFrameImpl)->DefWindowProc( message, wParam, lParam );
  1557. bool bOK = NcFrameImpl_GetMinMaxInfo( pMMI );
  1558. ::memcpy( &m_NcFrameImpl_MinMaxInfo_Cache, pMMI, sizeof(MINMAXINFO) );
  1559. if( bOK )
  1560. return true;
  1561. } // if( NcFrameImpl_IsSupported() )
  1562. break;
  1563. } // switch( message )
  1564. return false;
  1565. }
  1566. bool CExtNcFrameImpl::NcFrameImpl_OnQuerySystemCommandEnabled(
  1567. UINT nSystemCommandID
  1568. )
  1569. {
  1570. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1571. if( pWndFrameImpl == NULL )
  1572. return false;
  1573. if( nSystemCommandID == SC_CLOSE )
  1574. {
  1575. CMenu * pSysMenu = pWndFrameImpl->GetSystemMenu( FALSE );
  1576. if( pSysMenu == NULL )
  1577. return false;
  1578. UINT _nSystemCommandID = nSystemCommandID;
  1579. UINT nMenuItemState =
  1580. pSysMenu->GetMenuState( _nSystemCommandID, MF_BYCOMMAND );
  1581. if( nMenuItemState == 0xFFFFFFFF )
  1582. return false;
  1583. if( (nMenuItemState&(MF_DISABLED|MF_GRAYED)) != 0 )
  1584. return false;
  1585. }
  1586. DWORD dwStyle = pWndFrameImpl->GetStyle();
  1587. if( nSystemCommandID == SC_MINIMIZE )
  1588. {
  1589. if( (dwStyle&WS_MINIMIZEBOX) == 0 )
  1590. return false;
  1591. }
  1592. if( nSystemCommandID == SC_MAXIMIZE )
  1593. {
  1594. if( (dwStyle&WS_MAXIMIZEBOX) == 0 )
  1595. return false;
  1596. }
  1597. if( nSystemCommandID == SC_RESTORE || nSystemCommandID == SC_MAXIMIZE )
  1598. {
  1599. MINMAXINFO _mmi;
  1600. // ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  1601. // CExtPaintManager::monitor_parms_t _mp;
  1602. // CExtPaintManager::stat_GetMonitorParms( _mp, pWndFrameImpl );
  1603. // _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  1604. // _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  1605. // _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  1606. // _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  1607. // _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  1608. // _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  1609. // _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  1610. // _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  1611. // if( pWndFrameImpl->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  1612. ::memcpy( &_mmi, &m_NcFrameImpl_MinMaxInfo_Cache, sizeof(MINMAXINFO) );
  1613. NcFrameImpl_GetMinMaxInfo( &_mmi );
  1614. {
  1615. if( nSystemCommandID == SC_RESTORE )
  1616. {
  1617. WINDOWPLACEMENT _wp;
  1618. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1619. _wp.length = sizeof(WINDOWPLACEMENT);
  1620. GetWindowPlacement( &_wp );
  1621. if( _wp.showCmd == SW_SHOWMINIMIZED
  1622. || _wp.showCmd == SW_SHOWMINNOACTIVE
  1623. || _wp.showCmd == SW_RESTORE
  1624. || _wp.showCmd == SW_SHOWMAXIMIZED
  1625. )
  1626. return true;
  1627. }
  1628. if( _mmi.ptMinTrackSize.x >= _mmi.ptMaxTrackSize.x
  1629. || _mmi.ptMinTrackSize.y >= _mmi.ptMaxTrackSize.y
  1630. )
  1631. return false;
  1632. }
  1633. }
  1634. return true;
  1635. }
  1636. CExtPaintManager * CExtNcFrameImpl::NcFrameImpl_GetPM()
  1637. {
  1638. return m_BridgeNC.PmBridge_GetPM();
  1639. }
  1640. CExtPaintManager * CExtNcFrameImpl::NcFrameImpl_GetPM() const
  1641. {
  1642. return
  1643. ( const_cast < CExtNcFrameImpl * > ( this ) )
  1644. -> NcFrameImpl_GetPM();
  1645. }
  1646. CExtNcFrameImpl * CExtNcFrameImpl::NcFrameImpl_FindInstance(
  1647. HWND hWnd,
  1648. IExtNcFrameImplBridge * pNcFrameImplBridge // = NULL
  1649. )
  1650. {
  1651. for( ; hWnd != NULL && ::IsWindow( hWnd ); hWnd = ::GetParent( hWnd ) )
  1652. {
  1653. if( ( ::__EXT_MFC_GetWindowLong( hWnd, GWL_STYLE ) & WS_CHILD ) != 0 )
  1654. continue;
  1655. CExtNcFrameImpl * pExtNcFrameImpl = NULL;
  1656. ::SendMessage(
  1657. hWnd,
  1658. g_nMsgFindExtNcFrameImpl,
  1659. WPARAM(&pExtNcFrameImpl),
  1660. LPARAM(pNcFrameImplBridge)
  1661. );
  1662. if( pExtNcFrameImpl != NULL )
  1663. return pExtNcFrameImpl;
  1664. } // for( ; hWnd != NULL && ::IsWindow( hWnd ); hWnd = ::GetParent( hWnd ) )
  1665. return NULL;
  1666. }
  1667. void CExtNcFrameImpl::NcFrameImpl_CheckCursor(
  1668. CPoint pointScreen,
  1669. LPARAM nHT,
  1670. bool bCheckWindowFromPoint // = true
  1671. )
  1672. {
  1673. if( (! NcFrameImpl_IsSupported() )
  1674. || NcFrameImpl_IsDwmBased()
  1675. || (! ::GetCursorPos(&pointScreen) ) // reset
  1676. )
  1677. {
  1678. m_nNcFrameImpl_LastCheckCursorHT = HTNOWHERE;
  1679. m_ptNcFrameImpl_LastCheckCursor.x = m_ptNcFrameImpl_LastCheckCursor.y = -32767;
  1680. return;
  1681. }
  1682. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  1683. if( hWndOwn == NULL
  1684. || ( bCheckWindowFromPoint
  1685. && ::WindowFromPoint( pointScreen ) != hWndOwn
  1686. )
  1687. )
  1688. {
  1689. m_nNcFrameImpl_LastCheckCursorHT = HTNOWHERE;
  1690. m_ptNcFrameImpl_LastCheckCursor.x = m_ptNcFrameImpl_LastCheckCursor.y = -32767;
  1691. return;
  1692. }
  1693. if( m_ptNcFrameImpl_LastCheckCursor == pointScreen
  1694. && m_nNcFrameImpl_LastCheckCursorHT == nHT
  1695. )
  1696. return;
  1697. m_ptNcFrameImpl_LastCheckCursor = pointScreen;
  1698. m_nNcFrameImpl_LastCheckCursorHT = nHT;
  1699. ::SendMessage( hWndOwn, WM_SETCURSOR, WPARAM(hWndOwn), nHT );
  1700. }
  1701. void CExtNcFrameImpl::NcFrameImpl_PostWindowProc( LRESULT & lResult, UINT message, WPARAM wParam, LPARAM lParam )
  1702. {
  1703. lResult;
  1704. switch( message )
  1705. {
  1706. case WM_CAPTURECHANGED:
  1707. {
  1708. if( ! NcFrameImpl_IsSupported() )
  1709. break;
  1710. if( NcFrameImpl_IsDwmBased() )
  1711. break;
  1712.   CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1713. if( ((HWND)lParam) != pWndFrameImpl->m_hWnd )
  1714. pWndFrameImpl->ModifyStyle( 0, WS_CAPTION|WS_BORDER, 0 );
  1715. }
  1716. break;
  1717.   case WM_NCPAINT:
  1718. if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  1719. {
  1720. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1721. if( hWnd != NULL && ::IsWindow( hWnd ) )
  1722. {
  1723.   CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1724.   ASSERT_VALID( pWndFrameImpl );
  1725.   CWindowDC dcWnd( pWndFrameImpl );
  1726. CRect rcWnd, rcClient;
  1727. pWndFrameImpl->GetWindowRect( &rcWnd );
  1728. pWndFrameImpl->GetClientRect( &rcClient );
  1729. pWndFrameImpl->ClientToScreen( &rcClient );
  1730. rcClient.OffsetRect( -rcWnd.TopLeft() );
  1731. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  1732. dcWnd.ExcludeClipRect( &rcClient );
  1733. CExtMemoryDC dc( &dcWnd, &rcWnd );
  1734. dc.FillSolidRect( &rcWnd, RGB(0,0,0) );
  1735. CPoint ptViewPortOffset(
  1736. ::GetSystemMetrics( SM_CXSIZEFRAME ),
  1737. ::GetSystemMetrics( SM_CYCAPTION )
  1738. - NcFrameImpl_GetPM()->NcFrame_GetCaptionHeight( true, pWndFrameImpl )
  1739. + ::GetSystemMetrics( SM_CYSIZEFRAME )
  1740. );
  1741. dc.OffsetViewportOrg( ptViewPortOffset.x, ptViewPortOffset.y );
  1742. ::SendMessage( hWnd, WM_PRINTCLIENT, WPARAM(dc.m_hDC), PRF_CLIENT );
  1743. dc.OffsetViewportOrg( -ptViewPortOffset.x, -ptViewPortOffset.y );
  1744. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  1745. } // if( NcFrameImpl_IsDwmCaptionReplacement() && m_pNcFrameImplBridge != NULL )
  1746.   break;
  1747. case 0x031E: // WM_DWMCOMPOSITIONCHANGED
  1748. {
  1749. CExtPaintManager * pPM = NcFrameImpl_GetPM();
  1750. ASSERT_VALID( pPM );
  1751. m_BridgeNC.PmBridge_OnPaintManagerChanged( pPM );
  1752. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1753. if( pWndFrameImpl->GetSafeHwnd() != NULL )
  1754. {
  1755. if( pWndFrameImpl->IsKindOf( RUNTIME_CLASS(CFrameWnd) ) )
  1756. ((CFrameWnd*)pWndFrameImpl)->RecalcLayout();
  1757. BOOL bDwmIsCompositionEnabled = FALSE;
  1758. if( m_pNcFrameImplBridge != NULL
  1759. && m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd() != NULL
  1760. && ( ! pWndFrameImpl->IsZoomed() )
  1761. && g_PaintManager.m_DWM.DwmIsCompositionEnabled( & bDwmIsCompositionEnabled ) == S_OK
  1762. && ( ! bDwmIsCompositionEnabled )
  1763. )
  1764. CWnd::GetDesktopWindow()->RedrawWindow(
  1765. NULL, NULL,
  1766. RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN
  1767. );
  1768. }
  1769. }
  1770. break;
  1771. case WM_CREATE:
  1772. m_bNcFrameImpl_CreatePassed = true;
  1773. break;
  1774. case WM_PRINT:
  1775. case WM_PRINTCLIENT:
  1776. {
  1777. CWnd * pWndFrameImpl = (CWnd *)NcFrameImpl_GetFrameWindow();
  1778. ASSERT_VALID( pWndFrameImpl );
  1779. CDC dc;
  1780. dc.Attach( (HDC)wParam );
  1781. CRect rcRgnWnd, rcRgnClient;
  1782. pWndFrameImpl->GetWindowRect( &rcRgnWnd );
  1783. pWndFrameImpl->GetClientRect( &rcRgnClient );
  1784. if( (lParam&PRF_NONCLIENT) != 0
  1785. && NcFrameImpl_IsSupported()
  1786. && ( ! NcFrameImpl_IsDwmBased() )
  1787. )
  1788. {
  1789. CRect rcWnd = rcRgnWnd, rcClient = rcRgnClient;
  1790. pWndFrameImpl->ClientToScreen( &rcClient );
  1791. rcClient.OffsetRect( -rcWnd.TopLeft() );
  1792. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  1793. CRgn rgnWnd;
  1794. if( rgnWnd.CreateRectRgnIndirect(&rcWnd) )
  1795. dc.SelectClipRgn( &rgnWnd );
  1796. dc.ExcludeClipRect( &rcClient );
  1797. NcFrameImpl_OnNcPaint( dc );
  1798. dc.SelectClipRgn( NULL );
  1799. }
  1800. if( (lParam&PRF_CHILDREN) != 0 )
  1801. CExtPaintManager::stat_PrintChildren(
  1802. pWndFrameImpl->m_hWnd,
  1803. message,
  1804. dc.GetSafeHdc(),
  1805. lParam,
  1806. false
  1807. );
  1808. dc.Detach();
  1809. } // if( NcFrameImpl_IsSupported() && ( ! NcFrameImpl_IsDwmBased() ) )
  1810. break;
  1811. case WM_NCLBUTTONDBLCLK:
  1812. if( NcFrameImpl_IsDwmBased() )
  1813. break;
  1814. m_bNcFrameImpl_RestoreBorder = false;
  1815. break;
  1816. case WM_SIZE:
  1817. if( ! NcFrameImpl_IsSupported() )
  1818. break;
  1819. m_nNcFrameImpl_ScTrackedButtonPressed = 0;
  1820. m_nNcFrameImpl_ScTrackedButtonHover = 0;
  1821. NcFrameImpl_MapHtRects_Clean();
  1822. if( ! NcFrameImpl_IsDwmBased() )
  1823. {
  1824. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1825. if( (pWndFrameImpl->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  1826. {
  1827. m_bNcFrameImpl_DelatayedFrameRecalc = false;
  1828. NcFrameImpl_SetupRgn( NULL );
  1829. }
  1830. }
  1831. break;
  1832. case WM_WINDOWPOSCHANGING:
  1833. if( ! NcFrameImpl_IsSupported() )
  1834. break;
  1835. if( NcFrameImpl_IsDwmBased() )
  1836. break;
  1837. if( ! NcFrameImpl_IsForceEmpty() )
  1838. {
  1839. if( m_bNcFrameImpl_AssigningRGN )
  1840. break;
  1841. LPWINDOWPOS lpWindowPos = 
  1842. reinterpret_cast < LPWINDOWPOS > (lParam);
  1843. ASSERT( lpWindowPos != NULL );
  1844. //lpWindowPos->flags |= SWP_FRAMECHANGED;
  1845. m_bNcFrameImpl_DelatayedFrameRecalc =
  1846. ( ( lpWindowPos->flags & SWP_FRAMECHANGED ) == 0 )
  1847. ? true : false;
  1848. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1849. if( pWndFrameImpl->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) )
  1850. && (pWndFrameImpl->GetStyle()&WS_MAXIMIZE) != 0
  1851. )
  1852. {
  1853. m_bNcFrameImpl_AssigningRGN = true;
  1854. pWndFrameImpl->SetWindowRgn( NULL, FALSE );
  1855. m_bNcFrameImpl_AssigningRGN = false;
  1856. }
  1857. else
  1858. NcFrameImpl_SetupRgn( (WINDOWPOS *)lParam );
  1859. }
  1860. break;
  1861. case WM_WINDOWPOSCHANGED:
  1862. {
  1863. if( ! NcFrameImpl_IsSupported() )
  1864. break;
  1865. if( NcFrameImpl_IsDwmBased() )
  1866. break;
  1867. m_bNcFrameImpl_DelatayedFrameRecalc = false;
  1868. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1869. if( pWndFrameImpl->IsKindOf(RUNTIME_CLASS(CMDIChildWnd))
  1870. && pWndFrameImpl->IsZoomed()
  1871. )
  1872. {
  1873. HWND hWndMdiClient = ::GetParent( pWndFrameImpl->m_hWnd );
  1874. CRect rcClient;
  1875. ::GetClientRect( hWndMdiClient, &rcClient );
  1876. ::SendMessage( hWndMdiClient, WM_SIZE, SIZE_RESTORED, MAKELPARAM( rcClient.Width(), rcClient.Height() ) );
  1877. //NcFrameImpl_SetupRgn();
  1878. }
  1879. if( ! m_bNcFrameImpl_RestoreEnabledState )
  1880. break;
  1881. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1882. if( m_pNcFrameImplBridge != NULL )
  1883. {
  1884. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1885. if( hWnd != NULL )
  1886. {
  1887. ::InvalidateRect( hWnd, NULL, TRUE );
  1888. ::UpdateWindow( hWnd );
  1889. }
  1890. }
  1891. }
  1892. // continuing switch ...
  1893. case WM_SYSCOMMAND:
  1894. {
  1895. if( ! NcFrameImpl_IsSupported() )
  1896. break;
  1897. if( NcFrameImpl_IsDwmBased() )
  1898. break;
  1899. UINT nSC = UINT( wParam );
  1900. if( nSC == SC_SIZE || nSC == SC_NEXTWINDOW || nSC == SC_PREVWINDOW )
  1901. break;
  1902. CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1903. if( pWndFrameImpl->GetSafeHwnd() != NULL
  1904. && m_bNcFrameImpl_RestoreEnabledState
  1905. )
  1906. m_bNcFrameImpl_IsEnabled = true;
  1907. m_bNcFrameImpl_RestoreEnabledState = false;
  1908. if( message == WM_SYSCOMMAND && nSC != SC_CLOSE )
  1909. NcFrameImpl_NcLock( false );
  1910. if( pWndFrameImpl->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) )
  1911. && (pWndFrameImpl->GetStyle()&WS_MAXIMIZE) != 0
  1912. )
  1913. {
  1914. m_bNcFrameImpl_AssigningRGN = true;
  1915. pWndFrameImpl->SetWindowRgn( NULL, TRUE );
  1916. m_bNcFrameImpl_AssigningRGN = false;
  1917. ((CMDIChildWnd*)pWndFrameImpl)->RecalcLayout();
  1918. pWndFrameImpl->GetParent()->PostMessage( WM_MDIREFRESHMENU );
  1919. }
  1920. else
  1921. NcFrameImpl_SetupRgn();
  1922. if( pWndFrameImpl->IsWindowVisible() )
  1923. {
  1924. if( message == WM_SYSCOMMAND && ( nSC == SC_MAXIMIZE || nSC == SC_RESTORE ) )
  1925. {
  1926. if( nSC == SC_MAXIMIZE )
  1927. {
  1928. CMDIChildWnd * pWndMdiChild = DYNAMIC_DOWNCAST( CMDIChildWnd, pWndFrameImpl );
  1929. if( pWndMdiChild != NULL )
  1930. {
  1931. CRect rcWnd;
  1932. pWndMdiChild->GetWindowRect( &rcWnd );
  1933. pWndMdiChild->SendMessage( WM_NCHITTEST, MAKELPARAM( rcWnd.left, rcWnd.top ) );
  1934. CWnd * pWndMC = pWndFrameImpl->GetParent();
  1935. CRect rcMC;
  1936. pWndMC->GetWindowRect( &rcMC );
  1937. pWndMC->SendMessage( WM_SIZE, SIZE_RESTORED, MAKELPARAM(rcMC.Width(),rcMC.Height()) );
  1938. pWndMC->SendMessage( WM_MDIACTIVATE, (WPARAM)pWndFrameImpl->m_hWnd );
  1939. }
  1940. }
  1941. pWndFrameImpl->RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_FRAME|RDW_ALLCHILDREN );
  1942. }
  1943. else
  1944. pWndFrameImpl->SendMessage( WM_NCPAINT );
  1945. }
  1946. if( message == WM_SYSCOMMAND
  1947. && nSC == SC_RESTORE
  1948. && m_pNcFrameImplBridge != NULL
  1949. )
  1950. {
  1951. HWND hWnd = m_pNcFrameImplBridge->NcFrameImplBridge_GetSafeHwnd();
  1952. if( hWnd != NULL )
  1953. {
  1954. CWnd * pWndPermanent = CWnd::FromHandlePermanent( hWnd );
  1955. if( pWndPermanent != NULL )
  1956. {
  1957. CExtToolControlBar * pBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pWndPermanent );
  1958. if( pBar != NULL )
  1959. {
  1960. pBar->_RibbonPageRslaResetStateData();
  1961. pBar->_RecalcLayoutImpl();
  1962. }
  1963. }
  1964. }
  1965. }
  1966. } // case WM_SYSCOMMAND
  1967. break;
  1968. } // switch( message )
  1969. }
  1970. bool CExtNcFrameImpl::NcFrameImpl_OnQueryQuickWindowPlacement() const
  1971. {
  1972. if( ! NcFrameImpl_IsSupported() )
  1973. return false;
  1974. if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  1975. return false;
  1976. if( m_bNcFrameImpl_QuickWindowPlacement )
  1977. return true;
  1978. const CWnd * pWndFrameImpl = NcFrameImpl_GetFrameWindow();
  1979. if( pWndFrameImpl != NULL && pWndFrameImpl->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) ) )
  1980. return true;
  1981. return false;
  1982. }
  1983. bool CExtNcFrameImpl::NcFrameImpl_RecalcNcFrame()
  1984. {
  1985. if( NcFrameImpl_IsNcLocked() )
  1986. return false;
  1987. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  1988. if( hWndOwn == NULL )
  1989. return false;
  1990. ASSERT( ::IsWindow( hWndOwn ) );
  1991. ::SetWindowPos(
  1992. hWndOwn, NULL, 0, 0, 0, 0,
  1993. SWP_FRAMECHANGED
  1994. |SWP_NOACTIVATE
  1995. |SWP_NOZORDER
  1996. |SWP_NOOWNERZORDER
  1997. |SWP_NOMOVE
  1998. |SWP_NOSIZE
  1999. );
  2000. return true;
  2001. }
  2002. void CExtNcFrameImpl::PreSubclassWindow()
  2003. {
  2004. ::memset( &m_NcFrameImpl_MinMaxInfo_Cache, 0, sizeof(MINMAXINFO) );
  2005. HWND hWndOwn = NcFrameImpl_OnQueryHWND();
  2006. ASSERT( hWndOwn != NULL && ::IsWindow( hWndOwn ) );
  2007. m_dwNcFrameImpl_StyleInitial = ::__EXT_MFC_GetWindowLong( hWndOwn, GWL_STYLE );
  2008. m_dwNcFrameImpl_StyleExInitial = ::__EXT_MFC_GetWindowLong( hWndOwn, GWL_EXSTYLE );
  2009. if( m_bNcFrameImpl_IsDwmBased && (m_dwNcFrameImpl_StyleInitial&WS_CHILD) != 0 )
  2010. m_bNcFrameImpl_IsDwmBased = false;
  2011. if( m_bNcFrameImpl_IsDwmBased )
  2012. m_bNcFrameImpl_Moving = m_bNcFrameImpl_Resizing = false;
  2013. if( (m_dwNcFrameImpl_StyleInitial&(WS_BORDER|WS_CAPTION)) != 0
  2014. && NcFrameImpl_IsSupported()
  2015. )
  2016. NcFrameImpl_DelayRgnAdjustment();
  2017. NcFrameImpl_MapHtRects_Clean();
  2018. NcFrameImpl_RecalcNcFrame();
  2019. { // BLOCK: adjust MDI client area styles
  2020. HWND hWndMdiClient = CExtControlBar::stat_FindMdiClientHWND( hWndOwn );
  2021. if( hWndMdiClient != NULL )
  2022. {
  2023. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWndMdiClient, GWL_STYLE );
  2024. if( (dwStyle&WS_BORDER) != 0 )
  2025. ::__EXT_MFC_SetWindowLong( hWndMdiClient, GWL_STYLE, dwStyle&(~(WS_BORDER)) );
  2026. __EXT_MFC_LONG_PTR dwStyleEx = ::__EXT_MFC_GetWindowLong( hWndMdiClient, GWL_EXSTYLE );
  2027. if( (dwStyleEx&(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) != 0 )
  2028. ::__EXT_MFC_SetWindowLong( hWndMdiClient, GWL_EXSTYLE, (dwStyleEx&(~(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)))|WS_EX_CLIENTEDGE );
  2029. }
  2030. } // BLOCK: adjust MDI client area styles
  2031. m_bNcFrameImpl_ResizingLoopTracking = m_bNcFrameImpl_MovingLoopTracking = false;
  2032. }
  2033. void CExtNcFrameImpl::PostNcDestroy()
  2034. {
  2035. ::memset( &m_NcFrameImpl_MinMaxInfo_Cache, 0, sizeof(MINMAXINFO) );
  2036. m_pNcFrameImplBridge = NULL;
  2037. NcFrameImpl_DelayRgnAdjustment();
  2038. m_nNcFrameImpl_LastCheckCursorHT = HTNOWHERE;
  2039. m_ptNcFrameImpl_LastCheckCursor.x = m_ptNcFrameImpl_LastCheckCursor.y = -32767;
  2040. m_iconNcFrameImpl_QueryCache.Empty();
  2041. m_bNcFrameImpl_NcInitPassed = false;
  2042. m_bNcFrameImpl_ResizingLoopTracking = m_bNcFrameImpl_MovingLoopTracking = false;
  2043. }
  2044. IMPLEMENT_CExtPmBridge_MEMBERS( CExtNcFrameWatchMDIMF );
  2045. UINT CExtNcFrameWatchMDIMF::g_nMsgSurface =
  2046. ::RegisterWindowMessage( _T("CExtNcFrameWatchMDIMF::g_nMsgSurface") );
  2047. CExtNcFrameWatchMDIMF::CExtNcFrameWatchMDIMF()
  2048. : m_pNcFrameImpl( NULL )
  2049. , m_hWndSurface( NULL )
  2050. {
  2051. PmBridge_Install();
  2052. }
  2053. CExtNcFrameWatchMDIMF::~CExtNcFrameWatchMDIMF()
  2054. {
  2055. PmBridge_Uninstall();
  2056. if( m_hWndSurface != NULL )
  2057. ::DestroyWindow( m_hWndSurface );
  2058. }
  2059. void CExtNcFrameWatchMDIMF::_Surface( bool bForward )
  2060. {
  2061. CWnd * pWndFrameImpl = m_pNcFrameImpl->NcFrameImpl_GetFrameWindow();
  2062. if( bForward )
  2063. {
  2064. if( pWndFrameImpl->GetSafeHwnd() == NULL )
  2065. return;
  2066. if( m_hWndSurface == NULL )
  2067. {
  2068. HWND hWndParent = pWndFrameImpl->GetSafeHwnd();
  2069. ASSERT( hWndParent != NULL );
  2070. hWndParent = CExtControlBar::stat_FindMdiClientHWND( hWndParent );
  2071. ASSERT( hWndParent != NULL );
  2072. CRect rcSurface;
  2073. ::GetClientRect( hWndParent, &rcSurface );
  2074. m_hWndSurface =
  2075. ::CreateWindowEx(
  2076. 0, _T("Static"), _T(""), WS_CHILD, rcSurface.left, rcSurface.top, rcSurface.Width(), rcSurface.Height(),
  2077. hWndParent, (HMENU)NULL, ::AfxGetInstanceHandle(), NULL
  2078. );
  2079. if( m_hWndSurface != NULL )
  2080. {
  2081. ::EnableWindow( m_hWndSurface, FALSE );
  2082. ::ShowWindow( m_hWndSurface, SW_SHOWNOACTIVATE );
  2083. } // if( m_hWndSurface != NULL )
  2084. } // if( m_hWndSurface == NULL )
  2085. } // if( bForward )
  2086. else
  2087. {
  2088. if( m_hWndSurface != NULL )
  2089. {
  2090. ::DestroyWindow( m_hWndSurface );
  2091. m_hWndSurface = NULL;
  2092. } // if( m_hWndSurface != NULL )
  2093. } // else from if( bForward )
  2094. }
  2095. static CWnd * stat_pWndInit = NULL;
  2096. bool CExtNcFrameWatchMDIMF::OnHookWndMsg(
  2097. LRESULT & lResult,
  2098. HWND hWndHooked,
  2099. UINT nMessage,
  2100. WPARAM & wParam,
  2101. LPARAM & lParam
  2102. )
  2103. {
  2104. if( m_pNcFrameImpl != NULL )
  2105. {
  2106. switch( nMessage )
  2107. {
  2108. case WM_MDIDESTROY:
  2109. case WM_MDINEXT:
  2110. case WM_MDIICONARRANGE:
  2111. case WM_MDITILE:
  2112. case WM_MDICASCADE:
  2113. case WM_MDIACTIVATE:
  2114. //case WM_MDICREATE:
  2115. {
  2116. _Surface( true );
  2117. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWndHooked, GWL_STYLE );
  2118. if( (dwStyle&WS_CLIPCHILDREN|WS_CLIPCHILDREN) == 0 )
  2119. ::__EXT_MFC_SetWindowLong( hWndHooked, GWL_STYLE, dwStyle|WS_CLIPCHILDREN||WS_CLIPCHILDREN );
  2120. { // BLOCK: adjust MDI client area styles
  2121. HWND hWndMdiClient = CExtControlBar::stat_FindMdiClientHWND( hWndHooked );
  2122. if( hWndMdiClient != NULL )
  2123. {
  2124. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWndMdiClient, GWL_STYLE );
  2125. if( (dwStyle&WS_BORDER) != 0 )
  2126. ::__EXT_MFC_SetWindowLong( hWndMdiClient, GWL_STYLE, dwStyle&(~(WS_BORDER)) );
  2127. __EXT_MFC_LONG_PTR dwStyleEx = ::__EXT_MFC_GetWindowLong( hWndMdiClient, GWL_EXSTYLE );
  2128. if( (dwStyleEx&(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) != 0 )
  2129. ::__EXT_MFC_SetWindowLong( hWndMdiClient, GWL_EXSTYLE, (dwStyleEx&(~(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)))|WS_EX_CLIENTEDGE );
  2130. }
  2131. } // BLOCK: adjust MDI client area styles
  2132. if( nMessage == WM_MDICASCADE || nMessage == WM_MDITILE )
  2133. {
  2134. BOOL bMax = FALSE;
  2135. HWND hWndActiveMdiChildFrame = (HWND)
  2136. ::SendMessage(
  2137. hWndHooked,
  2138. WM_MDIGETACTIVE,
  2139. 0,
  2140. (LPARAM)&bMax
  2141. );
  2142. if( hWndActiveMdiChildFrame != NULL && bMax )
  2143. ::SendMessage(
  2144. hWndHooked,
  2145. WM_MDIRESTORE,
  2146. (WPARAM)hWndActiveMdiChildFrame,
  2147. 0
  2148. );
  2149. } // if( nMessage == WM_MDICASCADE || nMessage == WM_MDITILE )
  2150. switch( nMessage )
  2151. {
  2152. case WM_MDIICONARRANGE:
  2153. {
  2154. CList < HWND, HWND > _listWindowsToSkip;
  2155. if( m_hWndSurface != NULL )
  2156. _listWindowsToSkip.AddTail( m_hWndSurface );
  2157. CExtNcFrameImpl::stat_MDI_ArrangeIconic( hWndHooked, _listWindowsToSkip );
  2158. _Surface( false );
  2159. lResult = TRUE;
  2160. }
  2161. return true;
  2162. case WM_MDITILE:
  2163. {
  2164. CList < HWND, HWND > _listWindowsToSkip;
  2165. if( m_hWndSurface != NULL )
  2166. _listWindowsToSkip.AddTail( m_hWndSurface );
  2167. CExtNcFrameImpl::stat_MDI_Tile( hWndHooked, _listWindowsToSkip, wParam );
  2168. _Surface( false );
  2169. lResult = TRUE;
  2170. }
  2171. return true;
  2172. case WM_MDICASCADE:
  2173. {
  2174. CList < HWND, HWND > _listWindowsToSkip;
  2175. if( m_hWndSurface != NULL )
  2176. _listWindowsToSkip.AddTail( m_hWndSurface );
  2177. CExtNcFrameImpl::stat_MDI_Cascade( hWndHooked, _listWindowsToSkip, wParam );
  2178. _Surface( false );
  2179. lResult = TRUE;
  2180. }
  2181. return true;
  2182. } // switch( nMessage )
  2183. }
  2184. break;
  2185. default:
  2186. if( nMessage == CExtNcFrameWatchMDIMF::g_nMsgSurface )
  2187. {
  2188. _Surface( wParam ? true : false );
  2189. lResult = 1L;
  2190. return true;
  2191. }
  2192. break;
  2193. } // switch( nMessage )
  2194. } // if( m_pNcFrameImpl != NULL )
  2195. return
  2196. CExtHookSink::OnHookWndMsg(
  2197. lResult,
  2198. hWndHooked,
  2199. nMessage,
  2200. wParam,
  2201. lParam
  2202. );
  2203. }
  2204. void CExtNcFrameWatchMDIMF::OnPostHookWndMsg(
  2205. LRESULT lResult,
  2206. HWND hWndHooked,
  2207. UINT nMessage,
  2208. WPARAM wParam,
  2209. LPARAM lParam
  2210. )
  2211. {
  2212. if( m_pNcFrameImpl != NULL )
  2213. {
  2214. switch( nMessage )
  2215. {
  2216. case WM_MDIDESTROY:
  2217. case WM_MDINEXT:
  2218. case WM_MDIICONARRANGE:
  2219. case WM_MDITILE:
  2220. case WM_MDICASCADE:
  2221. case WM_MDIACTIVATE:
  2222. //case WM_MDICREATE:
  2223. {
  2224. CRect rcMC;
  2225. ::GetWindowRect( hWndHooked, &rcMC );
  2226. ::SendMessage( hWndHooked, WM_SIZE, SIZE_RESTORED, MAKELPARAM(rcMC.Width(),rcMC.Height()) );
  2227. _Surface( false );
  2228. ::RedrawWindow( hWndHooked, NULL, NULL,
  2229. RDW_INVALIDATE|RDW_ERASE|RDW_FRAME|RDW_ALLCHILDREN
  2230. );
  2231. }
  2232. break;
  2233. } // switch( nMessage )
  2234. } // if( m_pNcFrameImpl != NULL )
  2235. CExtHookSink::OnPostHookWndMsg(
  2236. lResult,
  2237. hWndHooked,
  2238. nMessage,
  2239. wParam,
  2240. lParam
  2241. );
  2242. }
  2243. #endif // (!defined __EXT_MFC_NO_NC_FRAME )