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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #if( !defined __EXTMINIDOCKFRAMEWND_H)
  23. #include "ExtMiniDockFrameWnd.h"
  24. #endif
  25. #if (!defined __EXTDOCKBAR_H)
  26. #include "ExtDockBar.h"
  27. #endif
  28. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  29. #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H)
  30. #include "ExtControlBarTabbedFeatures.h"
  31. #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H
  32. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  33. #if (!defined __EXT_MEMORY_DC_H)
  34. #include <../Src/ExtMemoryDC.h>
  35. #endif
  36. #if _MFC_VER < 0x700
  37. #include <../src/AfxImpl.h>
  38. #else
  39. #ifndef __AFXSTATE_H__
  40. #include <../src/mfc/afxstat_.h>
  41. #endif
  42. #include <../src/mfc/AfxImpl.h>
  43. #endif
  44. #ifdef _DEBUG
  45. #define new DEBUG_NEW
  46. #undef THIS_FILE
  47. static char THIS_FILE[] = __FILE__;
  48. #endif
  49. #define __REMOVED_NONFIXMODE_STYLES 
  50. FWS_SNAPTOBARS
  51. #define __REMOVED_STYLES_NORMAL 
  52. (MFS_4THICKFRAME|WS_THICKFRAME|WS_CAPTION|WS_BORDER|WS_DLGFRAME)
  53. //|WS_SYSMENU
  54. #define __REMOVED_STYLES_EXTENDED 
  55. (WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME)
  56. // (WS_EX_TOOLWINDOW|WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME)
  57. #define __SWP_FOR_REMOVED_STYLES 
  58. (SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOSENDCHANGING|SWP_NOREDRAW)
  59. #define __cSM_CMONITORS            80
  60. #define __cSM_CXVIRTUALSCREEN      78
  61. #define __cSM_CYVIRTUALSCREEN      79
  62. #define __cSM_XVIRTUALSCREEN       76
  63. #define __cSM_YVIRTUALSCREEN       77
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CExtMiniDockFrameWnd
  66. bool CExtMiniDockFrameWnd::g_bOnWndPosChgProcessing = false;
  67. bool CExtMiniDockFrameWnd::g_bAutoMakeTopmostOnMouseEvent = false;
  68. IMPLEMENT_DYNCREATE( CExtMiniDockFrameWnd, CMiniDockFrameWnd );
  69. IMPLEMENT_CExtPmBridge_MEMBERS( CExtMiniDockFrameWnd );
  70. CExtMiniDockFrameWnd::CExtMiniDockFrameWnd()
  71. : m_bMovingLargeBar( false )
  72. , m_bHelperNcActive( false )
  73. {
  74. m_rcBtnHideBar.SetRectEmpty();
  75. m_rcFrameCaption.SetRectEmpty();
  76. m_bBtnHideBar = false;
  77. m_nResizingMode = HTNOWHERE;
  78. m_ptLastResizing.x = m_ptLastResizing.y = -32767;
  79. m_ptResizingShift.x = m_ptResizingShift.y = 0;
  80. RegisterMiniDockFrameWndClass();
  81. PmBridge_Install();
  82. }
  83. CExtMiniDockFrameWnd::~CExtMiniDockFrameWnd()
  84. {
  85. PmBridge_Uninstall();
  86. }
  87. void CExtMiniDockFrameWnd::PmBridge_OnPaintManagerChanged(
  88. CExtPaintManager * pGlobalPM
  89. )
  90. {
  91. CExtPmBridge::PmBridge_OnPaintManagerChanged( pGlobalPM );
  92. if( GetSafeHwnd() == NULL )
  93. return;
  94. ::SetWindowPos(
  95. m_hWnd, NULL, 0, 0, 0, 0,
  96. SWP_FRAMECHANGED
  97. |SWP_NOACTIVATE
  98. |SWP_NOZORDER
  99. |SWP_NOOWNERZORDER
  100. |SWP_NOMOVE
  101. |SWP_NOSIZE
  102. );
  103. ::RedrawWindow(
  104. m_hWnd, NULL, NULL,
  105. RDW_INVALIDATE|RDW_ERASE|RDW_FRAME|RDW_ALLCHILDREN
  106. );
  107. }
  108. BEGIN_MESSAGE_MAP(CExtMiniDockFrameWnd, CMiniDockFrameWnd)
  109.     //{{AFX_MSG_MAP(CExtMiniDockFrameWnd)
  110. ON_WM_NCMOUSEMOVE()
  111. ON_WM_TIMER()
  112. ON_WM_CLOSE()
  113. ON_WM_NCPAINT()
  114. ON_WM_NCACTIVATE()
  115. ON_WM_NCLBUTTONDOWN()
  116. ON_WM_NCLBUTTONUP()
  117. ON_WM_NCRBUTTONDOWN()
  118.     ON_WM_GETMINMAXINFO()
  119. ON_WM_WINDOWPOSCHANGING()
  120. ON_WM_WINDOWPOSCHANGED()
  121. ON_WM_SIZE()
  122. ON_WM_MOUSEMOVE()
  123. ON_WM_CAPTURECHANGED()
  124. ON_WM_LBUTTONUP()
  125. ON_WM_RBUTTONDOWN()
  126. ON_WM_ERASEBKGND()
  127. ON_WM_NCLBUTTONDBLCLK()
  128. ON_WM_CANCELMODE()
  129. ON_WM_PAINT()
  130. ON_WM_NCCALCSIZE()
  131. //}}AFX_MSG_MAP
  132. __EXT_MFC_ON_WM_NCHITTEST()
  133. ON_WM_SYSCOLORCHANGE()
  134. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  135. ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
  136. ON_MESSAGE(__ExtMfc_WM_THEMECHANGED, OnThemeChanged)
  137. END_MESSAGE_MAP()
  138. void CExtMiniDockFrameWnd::OnSysColorChange() 
  139. {
  140. ASSERT_VALID( this );
  141. CMiniDockFrameWnd::OnSysColorChange();
  142. //CExtPaintManager * pPM = PmBridge_GetPM();
  143. // g_PaintManager.OnSysColorChange( this );
  144. // g_CmdManager.OnSysColorChange( pPM, this );
  145. Invalidate();
  146. }
  147. LRESULT CExtMiniDockFrameWnd::OnDisplayChange( WPARAM wParam, LPARAM lParam )
  148. {
  149. LRESULT lResult = CMiniDockFrameWnd::OnDisplayChange( wParam, lParam );
  150. //CExtPaintManager * pPM = PmBridge_GetPM();
  151. // g_PaintManager.OnDisplayChange( this, (INT)wParam, CPoint(lParam) );
  152. // g_CmdManager.OnDisplayChange( pPM, this, (INT)wParam, CPoint(lParam) );
  153. Invalidate();
  154. return lResult;
  155. }
  156. LRESULT CExtMiniDockFrameWnd::OnThemeChanged( WPARAM wParam, LPARAM lParam )
  157. {
  158. LRESULT lResult = Default();
  159. CExtPaintManager * pPM = PmBridge_GetPM();
  160. g_PaintManager.OnThemeChanged( this, wParam, lParam );
  161. g_CmdManager.OnThemeChanged( pPM, this, wParam, lParam );
  162. ::SetWindowPos(
  163. m_hWnd, NULL, 0, 0, 0, 0,
  164. SWP_FRAMECHANGED
  165. |SWP_NOACTIVATE
  166. |SWP_NOZORDER
  167. |SWP_NOOWNERZORDER
  168. |SWP_NOMOVE
  169. |SWP_NOSIZE
  170. );
  171. RecalcLayout();
  172. CExtControlBar * pExtBar = GetControlBarExt();
  173. if( pExtBar != NULL )
  174. {
  175. VERIFY(
  176. PmBridge_GetPM()->Bar_MiniDockFrameCaptionCalcRect(
  177. m_rcFrameCaption,
  178. this,
  179. pExtBar
  180. );
  181. SetTimer( 1, 1, NULL );
  182. } // if( pExtBar != NULL )
  183. return lResult;
  184. }
  185. void CExtMiniDockFrameWnd::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  186. {
  187. ASSERT_VALID( this );
  188. CMiniDockFrameWnd::OnSettingChange(uFlags, lpszSection);
  189. //CExtPaintManager * pPM = PmBridge_GetPM();
  190. // g_PaintManager.OnSettingChange( this, uFlags, lpszSection );
  191. // g_CmdManager.OnSettingChange( pPM, this, uFlags, lpszSection );
  192. ::SetWindowPos(
  193. m_hWnd, NULL, 0, 0, 0, 0,
  194. SWP_FRAMECHANGED
  195. |SWP_NOACTIVATE
  196. |SWP_NOZORDER
  197. |SWP_NOOWNERZORDER
  198. |SWP_NOMOVE
  199. |SWP_NOSIZE
  200. );
  201. RecalcLayout();
  202. CExtControlBar * pExtBar = GetControlBarExt();
  203. if( pExtBar != NULL )
  204. {
  205. VERIFY(
  206. PmBridge_GetPM()->Bar_MiniDockFrameCaptionCalcRect(
  207. m_rcFrameCaption,
  208. this,
  209. pExtBar
  210. );
  211. SetTimer( 1, 1, NULL );
  212. } // if( pExtBar != NULL )
  213. }
  214. BOOL CExtMiniDockFrameWnd::Create(CWnd* pParent, DWORD dwBarStyle)
  215. {
  216. // if(!MDFW_Create(pParent, dwBarStyle))
  217. // return FALSE;
  218. if( ! CMiniDockFrameWnd::Create(
  219. pParent,
  220. dwBarStyle
  221. )
  222. )
  223. return FALSE;
  224. ModifyStyle( 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS );
  225. m_wndDockBar.ModifyStyle( 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS );
  226. if( ( (m_wndDockBar.GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  227. {
  228. m_wndDockBar.ModifyStyleEx(
  229. WS_EX_LAYOUTRTL|WS_EX_RTLREADING,
  230. 0,
  231. SWP_FRAMECHANGED
  232. );
  233. ASSERT( (m_wndDockBar.GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) == 0 );
  234. } // if( ( (m_wndDockBar.GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  235. if( GetStyle() & __REMOVED_STYLES_NORMAL )
  236. ModifyStyle( __REMOVED_STYLES_NORMAL, 0, __SWP_FOR_REMOVED_STYLES );
  237. if( GetExStyle() & __REMOVED_STYLES_EXTENDED )
  238. ModifyStyleEx( __REMOVED_STYLES_EXTENDED, 0, __SWP_FOR_REMOVED_STYLES );
  239. if( ( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  240. {
  241. CWnd::ModifyStyleEx(
  242. WS_EX_LAYOUTRTL|WS_EX_RTLREADING,
  243. 0,
  244. SWP_FRAMECHANGED
  245. );
  246. ASSERT( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) == 0 );
  247. } // if( ( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  248. SetTimer( 1, 1, NULL );
  249. EnableToolTips();
  250. m_wndToolTip.Create( this );
  251. m_wndToolTip.Activate( TRUE );
  252. return TRUE;
  253. }
  254. void CExtMiniDockFrameWnd::OnNcLButtonUp(UINT nHitTest, CPoint point)
  255. {
  256. if( _ResizingIsInProgress() )
  257. {
  258. _ResizingEnd();
  259. return;
  260. }
  261. if( CExtControlBar::_DraggingGetBar() != NULL )
  262. return;
  263. CRect rcBarWnd;
  264. GetWindowRect( &rcBarWnd );
  265. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  266. CPoint ptWnd( point + ptDevOffset );
  267. CExtControlBar * pExtBar = GetControlBarExt();
  268. if( pExtBar != NULL && pExtBar->m_bNcAreaBtnTracking )
  269. {
  270. INT nCountOfNcButtons = pExtBar->NcButtons_GetCount();
  271. for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  272. {
  273. CExtBarNcAreaButton * pBtn =
  274. pExtBar->NcButtons_GetAt( nBtn );
  275. if( !pBtn->OnQueryVisibility() )
  276. continue;
  277. if( pBtn->OnNcAreaClicked( ptWnd ) )
  278. return;
  279. } // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  280. return;
  281. } // if( pExtBar != NULL && pExtBar->m_bNcAreaBtnTracking )
  282. CMiniDockFrameWnd::OnNcLButtonUp(nHitTest, point);
  283. }
  284. void CExtMiniDockFrameWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
  285. {
  286. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  287. CExtCustomizeSite * pSite =
  288. CExtCustomizeSite::GetCustomizeSite( m_hWnd );
  289. if( pSite != NULL
  290. && pSite->IsCustomizeMode()
  291. )
  292. pSite->DropTargetPopupCancel();
  293. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  294. CExtControlBar * pExtBar = GetControlBarExt();
  295. CPoint p(point);
  296. CRect rcWnd;
  297. GetWindowRect( &rcWnd );
  298. p.Offset( -rcWnd.left, -rcWnd.top );
  299. if( m_rcBtnHideBar.PtInRect( p ) )
  300. return;
  301. if( nHitTest == HTCAPTION )
  302. {
  303. ActivateTopParent();
  304. if( pExtBar != NULL
  305. && (! pExtBar->_IsDockSiteCustomizeMode() )
  306. )
  307. BringWindowToTop();
  308. if( (m_wndDockBar.m_dwStyle & CBRS_FLOAT_MULTI) == 0 )
  309. {
  310. int nPos = 1;
  311. CControlBar* pBar = NULL;
  312. while(
  313. pBar == NULL
  314. && nPos < m_wndDockBar.m_arrBars.GetSize()
  315. )
  316. pBar =
  317. reinterpret_cast < CExtDockBar & >
  318. (m_wndDockBar). GetDockedControlBar(nPos++);
  319. ASSERT( pBar != NULL );
  320. ASSERT_KINDOF( CControlBar, pBar );
  321. ASSERT( pBar->m_pDockContext != NULL );
  322. if( pExtBar == NULL
  323. || ( pExtBar != NULL
  324. && pExtBar->IsFixedMode()
  325. && !pExtBar->_IsShowContentWhenDragging()
  326. )
  327. )
  328. {
  329. pBar->m_pDockContext->StartDrag(point);
  330. return;
  331. }
  332. CRect rcGrip = pExtBar->_RectGripGet();
  333. int nCyGripper = min( rcGrip.Width(), rcGrip.Height() );
  334. pExtBar->_DraggingStart(
  335. point,
  336. point
  337. - rcWnd.TopLeft()
  338. - CPoint( nCyGripper, nCyGripper/2 )
  339. );
  340. return;
  341. }
  342. }
  343. else if( nHitTest >= HTSIZEFIRST && nHitTest <= HTSIZELAST )
  344. {
  345. ActivateTopParent();
  346. int nPos = 1;
  347. CControlBar * pBar = NULL;
  348. while(
  349. pBar == NULL
  350. && nPos < m_wndDockBar.m_arrBars.GetSize()
  351. )
  352. pBar =
  353. reinterpret_cast < CExtDockBar & >
  354. (m_wndDockBar).GetDockedControlBar(nPos++);
  355. ASSERT( pBar != NULL );
  356. ASSERT_KINDOF( CControlBar, pBar );
  357. ASSERT( pBar->m_pDockContext != NULL );
  358. ASSERT( (m_wndDockBar.m_dwStyle & CBRS_FLOAT_MULTI) == 0 );
  359. if( ! pBar->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) )
  360. CMiniDockFrameWnd::OnNcLButtonDown( nHitTest, point);
  361. else
  362. {
  363. CExtControlBar * pExtBar =
  364. (CExtControlBar *)pBar;
  365. if( !pExtBar->_IsShowContentWhenDragging()
  366. && pExtBar->IsFixedMode()
  367. )
  368. {
  369. pBar->m_pDockContext->StartResize( nHitTest, point );
  370. return;
  371. }
  372. ClientToScreen( &point );
  373. _ResizingStart( nHitTest, point );
  374. }
  375. return;
  376. }
  377. else if( nHitTest == HTMINBUTTON
  378. || nHitTest == HTMAXBUTTON
  379. || nHitTest == HTGROWBOX
  380. )
  381. return;
  382. CMiniFrameWnd::OnNcLButtonDown( nHitTest, point );
  383. }
  384. void CExtMiniDockFrameWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point) 
  385. {
  386. if( nHitTest == HTCAPTION )
  387. {
  388. CRect rcWnd;
  389. GetWindowRect( &rcWnd );
  390. CPoint ptTestBtnHideBar( point - rcWnd.TopLeft() );
  391. if( m_rcBtnHideBar.PtInRect(ptTestBtnHideBar) )
  392. return;
  393. } // if( nHitTest == HTCAPTION )
  394. CExtControlBar * pExtBar = GetControlBarExt();
  395. if( pExtBar != NULL )
  396. {
  397. ASSERT_VALID( pExtBar );
  398. if( ! pExtBar->_FloatStateChangingIsEnabled( pExtBar ) )
  399. return;
  400. pExtBar->ToggleDocking();
  401. return;
  402. }
  403. CMiniDockFrameWnd::OnNcLButtonDblClk(nHitTest, point);
  404. }
  405. void CExtMiniDockFrameWnd::_ResizingStart(
  406. UINT nHitTest,
  407. const CPoint & point
  408. )
  409. {
  410. ASSERT( m_nResizingMode == HTNOWHERE );
  411. ASSERT( IsWindowVisible() );
  412. CPoint pointCurrentCursorPos = point;
  413. ScreenToClient( &pointCurrentCursorPos );
  414. CExtPopupMenuWnd::CancelMenuTracking();
  415. CWnd::CancelToolTips();
  416. CExtControlBar * pExtBar = GetControlBarExt();
  417. ASSERT_VALID( pExtBar );
  418. if( ! pExtBar->_FloatStateChangingIsEnabled( pExtBar ) )
  419. return;
  420. if( ( ! pExtBar->_IsShowContentWhenDragging() )
  421. && pExtBar->IsFixedMode()
  422. )
  423. {
  424. m_nResizingMode = HTNOWHERE;
  425. pExtBar->m_pDockContext->StartResize(nHitTest, point);
  426. return;
  427. }
  428. switch( nHitTest )
  429. {
  430. case HTLEFT:
  431. case HTRIGHT:
  432. case HTTOP:
  433. case HTTOPLEFT:
  434. case HTTOPRIGHT:
  435. case HTBOTTOM:
  436. case HTBOTTOMLEFT:
  437. case HTBOTTOMRIGHT:
  438. m_nResizingMode = nHitTest;
  439. break;
  440. default:
  441. return;
  442. } // switch( nHitTest )
  443. #ifdef _DEBUG
  444. int nPos = 1;
  445. CControlBar * pDebugDummyBar = NULL;
  446. while(
  447. pDebugDummyBar == NULL
  448. && nPos < m_wndDockBar.m_arrBars.GetSize()
  449. )
  450. pDebugDummyBar =
  451. reinterpret_cast < CExtDockBar & >
  452. ( m_wndDockBar ) . GetDockedControlBar( nPos++ );
  453. ASSERT( pDebugDummyBar != NULL );
  454. ASSERT_KINDOF( CExtControlBar, pDebugDummyBar );
  455. ASSERT( pDebugDummyBar->m_pDockContext != NULL );
  456. // CBRS_SIZE_DYNAMIC toolbars cannot have the CBRS_FLOAT_MULTI style
  457. ASSERT( (m_wndDockBar.m_dwStyle & CBRS_FLOAT_MULTI) == 0 );
  458. #endif // _DEBUG
  459. ASSERT( pExtBar == pDebugDummyBar );
  460. ASSERT( pExtBar->m_pDockContext != NULL );
  461. if( ! pExtBar->IsFixedMode() )
  462. ModifyStyle( __REMOVED_NONFIXMODE_STYLES, 0 );
  463. BringWindowToTop();
  464. CExtMouseCaptureSink::SetCapture( GetSafeHwnd() );
  465. GetWindowRect( &m_rcWndResizingStart );
  466. HWND hWndExtBar = pExtBar->m_hWnd;
  467. pExtBar->OnControlBarPositionChange(
  468. pExtBar,
  469. CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING,
  470. true,
  471. false
  472. );
  473. _ResizingUpdateState( pointCurrentCursorPos );
  474. pExtBar->OnControlBarPositionChange(
  475. pExtBar,
  476. CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING,
  477. false,
  478. false
  479. );
  480. while( m_nResizingMode != HTNOWHERE )
  481. {
  482. ::WaitMessage();
  483. MSG msg;
  484. // Process all the messages in the message queue
  485. while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  486. {
  487. bool bStop = false;
  488. switch( msg.message )
  489. {
  490. case WM_ACTIVATEAPP:
  491. case WM_COMMAND:
  492. bStop = true;
  493. break;
  494. default:
  495. if( WM_KEYFIRST <= msg.message
  496. && msg.message <= WM_KEYLAST
  497. )
  498. bStop = true;
  499. break;
  500. case WM_MOUSEMOVE:
  501. if( _ResizingIsInProgress() )
  502. {
  503. PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE);
  504. for( ; PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_NOREMOVE); )
  505. PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE);
  506. if( ::GetCursorPos( &pointCurrentCursorPos ) )
  507. {
  508. _ResizingUpdateState( pointCurrentCursorPos );
  509. pExtBar->OnControlBarPositionChange(
  510. pExtBar,
  511. CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING,
  512. false,
  513. false
  514. );
  515. }
  516. continue;
  517. } // if( _ResizingIsInProgress() )
  518. break;
  519. } // switch( msg.message )
  520. if( (!bStop) &&
  521. CExtMouseCaptureSink::GetCapture() != GetSafeHwnd()
  522. )
  523. bStop = true;
  524. if( bStop )
  525. {
  526. _ResizingEnd();
  527. if( ::IsWindow( hWndExtBar ) )
  528. pExtBar->OnControlBarPositionChange(
  529. pExtBar,
  530. CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING,
  531. false,
  532. true
  533. );
  534. return;
  535. }
  536. if( !AfxGetThread()->PumpMessage() )
  537. {
  538. PostQuitMessage(0);
  539. return; // Signal WM_QUIT received
  540. } // if( !AfxGetThread()->PumpMessage() )
  541. } // while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  542. if( CExtControlBar::g_bEnableOnIdleCalls )
  543. {
  544. for( LONG nIdleCounter = 0L;
  545. ::AfxGetThread()->OnIdle(nIdleCounter);
  546. nIdleCounter ++
  547. );
  548. }
  549. } // while( m_nResizingMode != HTNOWHERE )
  550. if( ::IsWindow( hWndExtBar ) )
  551. pExtBar->OnControlBarPositionChange(
  552. pExtBar,
  553. CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING,
  554. false,
  555. true
  556. );
  557. }
  558. void CExtMiniDockFrameWnd::_ResizingEnd()
  559. {
  560. m_ptLastResizing.x = m_ptLastResizing.y = -32767;
  561. m_ptResizingShift.x = m_ptResizingShift.y = 0;
  562. //ASSERT( m_nResizingMode != HTNOWHERE );
  563. if( m_nResizingMode == HTNOWHERE )
  564. return;
  565. if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() )
  566. CExtMouseCaptureSink::ReleaseCapture();
  567. CExtControlBar * pExtBar = GetControlBarExt();
  568. ASSERT_VALID( pExtBar );
  569. if( !pExtBar->IsFixedMode() )
  570. ModifyStyle( 0, __REMOVED_NONFIXMODE_STYLES );
  571. m_nResizingMode = HTNOWHERE;
  572. }
  573. bool CExtMiniDockFrameWnd::g_bInResizingUpdateState = false;
  574. void CExtMiniDockFrameWnd::_ResizingUpdateState(
  575. const CPoint & point
  576. )
  577. {
  578. if( g_bInResizingUpdateState
  579. || m_ptLastResizing == point
  580. )
  581. return;
  582. CPoint _pt( point );
  583. ASSERT( m_nResizingMode != HTNOWHERE );
  584. CRect rcWnd, rcClient;
  585. GetWindowRect( &rcWnd );
  586. GetClientRect( &rcClient );
  587. CExtControlBar * pExtBar = GetControlBarExt();
  588. ASSERT_VALID( pExtBar );
  589. bool bFixedMode = pExtBar->IsFixedMode();
  590. if( m_ptLastResizing.x == -32767 && m_ptLastResizing.y == -32767 )
  591. { // adjust "point" parameter by border location
  592. CRect rcClientScreen = rcClient;
  593. ClientToScreen( &rcClientScreen );
  594. m_ptResizingShift.x = m_ptResizingShift.y = 0;
  595. bool bAdjustTop = false, bAdjustBottom = false, bAdjustLeft = false, bAdjustRight = false;
  596. switch( m_nResizingMode )
  597. {
  598. case HTTOP:
  599. bAdjustTop = true;
  600. break;
  601. case HTBOTTOM:
  602. bAdjustBottom = true;
  603. break;
  604. case HTLEFT:
  605. bAdjustLeft = true;
  606. break;
  607. case HTRIGHT:
  608. bAdjustRight = true;
  609. break;
  610. case HTTOPLEFT:
  611. bAdjustTop = true;
  612. bAdjustLeft = true;
  613. break;
  614. case HTTOPRIGHT:
  615. bAdjustTop = true;
  616. bAdjustRight = true;
  617. break;
  618. case HTBOTTOMLEFT:
  619. bAdjustBottom = true;
  620. bAdjustLeft = true;
  621. break;
  622. case HTBOTTOMRIGHT:
  623. bAdjustBottom = true;
  624. bAdjustRight = true;
  625. break;
  626. } // switch( m_nResizingMode )
  627. if( bAdjustTop )
  628. {
  629. m_ptResizingShift.y += _pt.y - rcWnd.top;
  630. if( bFixedMode )
  631. m_ptResizingShift.y += rcClientScreen.top - rcWnd.top;
  632. }
  633. if( bAdjustBottom )
  634. {
  635. m_ptResizingShift.y += rcWnd.bottom - _pt.y;
  636. if( bFixedMode )
  637. m_ptResizingShift.y -= rcWnd.bottom - rcClientScreen.bottom;
  638. }
  639. if( bAdjustLeft )
  640. {
  641. m_ptResizingShift.x += _pt.x - rcWnd.left;
  642. if( bFixedMode )
  643. m_ptResizingShift.y += rcClientScreen.left - rcWnd.left;
  644. }
  645. if( bAdjustRight )
  646. {
  647. m_ptResizingShift.x += rcWnd.right - _pt.x;
  648. if( bFixedMode )
  649. m_ptResizingShift.y += rcWnd.right - rcClientScreen.right;
  650. }
  651. } // adjust "point" parameter by border location
  652. _pt += m_ptResizingShift;
  653. //TRACE2( "m_ptResizingShift = %d, %drn", m_ptResizingShift.x, m_ptResizingShift.y );
  654. #ifdef __FREIWALD_ORIGINAL__
  655. m_ptLastResizing = _pt;
  656. #else
  657. // store the coordinates of "point" here,
  658. // because "point is the base value for the above comparation
  659. m_ptLastResizing = point;
  660. #endif 
  661. g_bInResizingUpdateState = true;
  662. CRect rcClientOrg, rcWndOrg;
  663. rcClientOrg = rcClient;
  664. rcWndOrg = rcWnd;
  665. CSize sizeDiff =
  666. rcWnd.Size() - rcClient.Size();
  667. ASSERT( sizeDiff.cx >= 0 && sizeDiff.cy >= 0 );
  668. CSize sizeNcDiff( sizeDiff );
  669. int nCalcMinHW = pExtBar->_CalcDesiredMinHW();
  670. int nCalcMinVH = pExtBar->_CalcDesiredMinVH();
  671. if( sizeDiff.cx < nCalcMinHW )
  672. sizeDiff.cx = nCalcMinHW;
  673. if( sizeDiff.cy < nCalcMinVH )
  674. sizeDiff.cy = nCalcMinVH;
  675. UINT nHit = m_nResizingMode;
  676. bool bLeft = false, bTop = false, bHorz = false,
  677. bInvTop = false, bInvLeft = false;
  678. CPoint ptOffsetWnd( 0, 0 );
  679. if( bFixedMode )
  680. {
  681. switch( nHit )
  682. {
  683. case HTTOPLEFT:
  684. case HTTOPRIGHT:
  685. nHit = HTTOP;
  686. break;
  687. case HTBOTTOMLEFT:
  688. case HTBOTTOMRIGHT:
  689. nHit = HTBOTTOM;
  690. break;
  691. } // switch( nHit )
  692. switch( nHit )
  693. {
  694. case HTTOP:
  695. _pt.y =
  696. rcWndOrg.bottom
  697. + rcWndOrg.top - _pt.y;
  698. nHit = HTBOTTOM;
  699. bInvLeft = true;
  700. bInvTop = true;
  701. break;
  702. case HTLEFT:
  703. _pt.x =
  704. rcWndOrg.right
  705. + rcWndOrg.left - _pt.x;
  706. nHit = HTRIGHT;
  707. bInvLeft = true;
  708. bInvTop = true;
  709. break;
  710. } // switch( nHit )
  711. } // if( bFixedMode )
  712. if( bInvLeft || bInvTop || (! bFixedMode ) )
  713. {
  714. CRect rcWnd( rcWndOrg );
  715. ScreenToClient( & rcWnd );
  716. if( bInvLeft || (! bFixedMode ) )
  717. ptOffsetWnd.x =
  718. abs( rcWnd.left - rcClientOrg.left );
  719. if( bInvTop || (! bFixedMode ) )
  720. ptOffsetWnd.y =
  721. abs( rcWnd.top - rcClientOrg.top );
  722. } // if( bInvLeft || bInvTop )
  723. switch( nHit )
  724. {
  725. case HTLEFT:
  726. bHorz = true;
  727. rcWnd.left = min( _pt.x, rcWnd.right );
  728. bLeft = true;
  729. break;
  730. case HTRIGHT:
  731. bHorz = true;
  732. rcWnd.right = max( _pt.x, rcWnd.left );
  733. break;
  734. case HTTOP:
  735. rcWnd.top = min( _pt.y, rcWnd.bottom );
  736. bTop = true;
  737. break;
  738. case HTTOPLEFT:
  739. rcWnd.left = min( _pt.x, rcWnd.right );
  740. rcWnd.top = min( _pt.y, rcWnd.bottom );
  741. bLeft = true;
  742. bTop = true;
  743. break;
  744. case HTTOPRIGHT:
  745. rcWnd.right = max( _pt.x, rcWnd.left );
  746. rcWnd.top = min( _pt.y, rcWnd.bottom );
  747. bTop = true;
  748. break;
  749. case HTBOTTOM:
  750. rcWnd.bottom = max( _pt.y, rcWnd.top );
  751. break;
  752. case HTBOTTOMLEFT:
  753. rcWnd.left = min( _pt.x, rcWnd.right );
  754. rcWnd.bottom = max( _pt.y, rcWnd.top );
  755. bLeft = true;
  756. break;
  757. case HTBOTTOMRIGHT:
  758. rcWnd.right = max( _pt.x, rcWnd.left );
  759. rcWnd.bottom = max( _pt.y, rcWnd.top );
  760. break;
  761. default:
  762. ASSERT( FALSE );
  763. g_bInResizingUpdateState = false;
  764. return;
  765. } // switch( nHit )
  766. if( rcWnd.Width() < sizeDiff.cx )
  767. rcWnd.right = rcWnd.left + sizeDiff.cx;
  768. if( rcWnd.Height() < sizeDiff.cy )
  769. rcWnd.bottom = rcWnd.top + sizeDiff.cy;
  770. if( rcWnd.right > rcWndOrg.right
  771. && bLeft
  772. )
  773. rcWnd.OffsetRect(
  774. rcWndOrg.right - rcWnd.right,
  775. 0
  776. );
  777. if( rcWnd.bottom > rcWndOrg.bottom
  778. && bTop
  779. )
  780. rcWnd.OffsetRect(
  781. 0,
  782. rcWndOrg.bottom - rcWnd.bottom
  783. );
  784. rcClient.SetRect(
  785. rcWnd.left - (rcClient.left-rcWndOrg.left),
  786. rcWnd.top - (rcClient.top-rcWndOrg.top),
  787. rcWnd.right - (rcClient.right-rcWndOrg.right),
  788. rcWnd.bottom - (rcClient.bottom-rcWndOrg.bottom)
  789. );
  790. if( ! bFixedMode )
  791. {
  792. ASSERT( (GetStyle() & __REMOVED_NONFIXMODE_STYLES) == 0 );
  793. CSize _sizeMinFloated =
  794. pExtBar->_CalcDesiredMinFloatedSize();
  795. CSize _size = rcWnd.Size();
  796. if( _size.cx < _sizeMinFloated.cx )
  797. _size.cx = _sizeMinFloated.cx;
  798. if( _size.cy < _sizeMinFloated.cy )
  799. _size.cy = _sizeMinFloated.cy;
  800. CExtPaintManager::monitor_parms_t _mp;
  801. CExtPaintManager::stat_GetMonitorParms( _mp, this );
  802. CSize _sizeMaxFloated = _mp.m_rcWorkArea.Size();
  803. #ifdef __FREIWALD_ORIGINAL__
  804. #else
  805. // It should be possible to enlarge the size of a floating frame to cover two or more monitors
  806. // in a multiple monitor configuration.
  807. // The original implementation, however, adjusted the dimensions of the floating frame according to the
  808. // dimensions of the primary monitor.
  809. // This does not only prevent the floating frame from being enlarged to more than one monitor,
  810. // but may also cause wrong calculations, when the frame is resized on the non-primary monitor and
  811. // the dimensions / screen resolution of this non-primary monitor are different to those of the primary monitor.
  812. // This has been adjusted with the following change:
  813. if (GetSystemMetrics(__cSM_CMONITORS) > 1)
  814. {
  815. _sizeMaxFloated = CSize(GetSystemMetrics(__cSM_CXVIRTUALSCREEN), GetSystemMetrics(__cSM_CYVIRTUALSCREEN));
  816. }
  817. #endif
  818. if( _size.cx > _sizeMaxFloated.cx )
  819. _size.cx = _sizeMaxFloated.cx;
  820. if( _size.cy > _sizeMaxFloated.cy )
  821. _size.cy = _sizeMaxFloated.cy;
  822. //CRect rc1, rc2;
  823. //GetClientRect( &rc1 );
  824. //pExtBar->GetClientRect( &rc2 );
  825. //CSize sizeDiff2 = rc1.Size() - rc2.Size();
  826. //_size += sizeDiff2;
  827. #ifdef __FREIWALD_ORIGINAL__
  828. pExtBar->m_sizeFloated = _size - ptOffsetWnd;
  829. #else
  830. // The original code caused the control bar to change its size, 
  831. // even if the right border was only clicked without moving the mouse
  832. // The following change fixes this:
  833. pExtBar->m_sizeFloated += (_size - rcWndOrg.Size());
  834. #endif
  835. //pExtBar->m_pDockContext->m_sizeLast = pExtBar->m_sizeFloated;
  836. CRect rcWndValidated( rcWnd.TopLeft(), _size );
  837. //pExtBar->m_pDockContext->m_rectDragHorz
  838. // = pExtBar->m_pDockContext->m_rectDragVert
  839. // = pExtBar->m_pDockContext->m_rectFrameDragHorz
  840. // = pExtBar->m_pDockContext->m_rectFrameDragVert
  841. // = rcWndValidated;
  842. MoveWindow( &rcWndValidated );
  843. RecalcLayout();
  844. SetTimer( 1, 1, NULL );
  845. g_bInResizingUpdateState = false;
  846. return;
  847. } // if( ! bFixedMode )
  848. INT nResizingFrameDX = 0;
  849. INT nResizingFrameDY = 0;
  850. INT nCaptionDY = 0;
  851. OnQueryNcMetrics(
  852. nResizingFrameDX,
  853. nResizingFrameDY,
  854. nCaptionDY
  855. );
  856. DWORD dwMode = LM_HORZ|LM_COMMIT;
  857. LONG nLendth = 0;
  858. if( bHorz )
  859. nLendth = rcClient.Width();
  860. else
  861. {
  862. dwMode |= LM_LENGTHY;
  863. nLendth =
  864. rcClient.Height()
  865. - nResizingFrameDY;
  866. } // else from if( bHorz )
  867. CSize _sizeFloatedPrev = pExtBar->m_sizeFloated;
  868. CSize _size =
  869. pExtBar->CalcDynamicLayout( nLendth, dwMode );
  870. if( _sizeFloatedPrev == _size )
  871. {
  872. g_bInResizingUpdateState = false;
  873. return;
  874. }
  875. // if( _size.cx < _sizeMinFloated.cx )
  876. // _size.cx = _sizeMinFloated.cx;
  877. // if( _size.cy < _sizeMinFloated.cy )
  878. // _size.cy = _sizeMinFloated.cy;
  879. pExtBar->m_sizeFloated = _size;
  880. if( bInvTop )
  881. {
  882. ASSERT( rcWnd.top == rcWndOrg.top );
  883. rcWnd.bottom = m_rcWndResizingStart.bottom;
  884. rcWnd.top =
  885. rcWnd.bottom - _size.cy - ptOffsetWnd.y;
  886. }
  887. if( bInvLeft )
  888. {
  889. ASSERT( rcWnd.left == rcWndOrg.left );
  890. rcWnd.right = m_rcWndResizingStart.right;
  891. rcWnd.left =
  892. rcWnd.right - _size.cx - ptOffsetWnd.x;
  893. }
  894. ASSERT( pExtBar->m_pDockSite != NULL );
  895. ASSERT( pExtBar->m_pDockBar != NULL );
  896. pExtBar->m_ptFloatHelper = rcWnd.TopLeft();
  897. _size += sizeNcDiff;
  898. _size.cx -= nResizingFrameDX; // (+ v.2.22)
  899. _size.cy -= nResizingFrameDY;
  900. CRect rcToMoveMinFrame(
  901. pExtBar->m_ptFloatHelper,
  902. _size
  903. );
  904. MoveWindow( &rcToMoveMinFrame);
  905. // SendMessage( WM_NCPAINT );
  906. PostMessage( WM_NCPAINT );
  907. RecalcLayout();
  908. pExtBar->RedrawWindow(
  909. NULL,
  910. NULL,
  911. RDW_INVALIDATE|RDW_UPDATENOW
  912. |RDW_ERASE|RDW_ERASENOW
  913. |RDW_ALLCHILDREN
  914. );
  915. g_bInResizingUpdateState = false;
  916. }
  917. CControlBar * CExtMiniDockFrameWnd::GetControlBar()
  918. {
  919. CWnd* pTempWnd = GetWindow( GW_CHILD );
  920.     if( pTempWnd == NULL )
  921.         return NULL;
  922. pTempWnd = pTempWnd->GetWindow( GW_CHILD );
  923.     if( pTempWnd == NULL )
  924.         return NULL;
  925.     if( !pTempWnd->IsKindOf( RUNTIME_CLASS(CControlBar) ) )
  926.         return NULL;
  927.     return reinterpret_cast < CControlBar * > ( pTempWnd );
  928. }
  929. const CControlBar * CExtMiniDockFrameWnd::GetControlBar() const
  930. {
  931. CControlBar * pBar =
  932. ( const_cast < CExtMiniDockFrameWnd * > ( this ) ) ->
  933. GetControlBar();
  934. return pBar;
  935. }
  936. CExtControlBar * CExtMiniDockFrameWnd::GetControlBarExt()
  937. {
  938. CControlBar * pTempWnd = GetControlBar();
  939.     if( pTempWnd == NULL )
  940.         return NULL;
  941. // ASSERT_KINDOF( CExtControlBar, pTempWnd );
  942.     if( !pTempWnd->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) )
  943.         return NULL;
  944.     return reinterpret_cast < CExtControlBar * > ( pTempWnd );
  945. }
  946. const CExtControlBar * CExtMiniDockFrameWnd::GetControlBarExt() const
  947. {
  948. CExtControlBar * pExtBar =
  949. ( const_cast < CExtMiniDockFrameWnd * > ( this ) ) ->
  950. GetControlBarExt();
  951. return pExtBar;
  952. }
  953. void CExtMiniDockFrameWnd::OnNcRButtonDown(UINT nHitTest, CPoint point)
  954. {
  955. if( _ResizingIsInProgress() )
  956. {
  957. _ResizingEnd();
  958. return;
  959. }
  960. if( nHitTest == HTCAPTION )
  961. {
  962. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  963. CExtCustomizeSite * pSite =
  964. CExtCustomizeSite::GetCustomizeSite( m_hWnd );
  965. if( pSite != NULL
  966. && pSite->IsCustomizeMode()
  967. )
  968. return;
  969. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  970. if( CExtControlBar::FindHelpMode(this) )
  971. return;
  972. CExtControlBar * pExtBar =
  973. GetControlBarExt();
  974. if( pExtBar != NULL )
  975. {
  976. ASSERT_VALID( pExtBar );
  977. CFrameWnd * pFrame = pExtBar->_GetDockingFrameImpl();
  978. ASSERT_VALID( pFrame );
  979. CPoint point;
  980. if( ! ::GetCursorPos(&point) )
  981. return;
  982. HWND hWndTrack = pFrame->GetSafeHwnd();
  983. ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
  984. CExtPopupMenuWnd * pPopup =
  985. CExtPopupMenuWnd::InstantiatePopupMenu(
  986. hWndTrack,
  987. RUNTIME_CLASS(CExtPopupMenuWnd),
  988. this
  989. );
  990. VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
  991. if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
  992. pFrame,
  993. pPopup,
  994. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MINIFRAME_NC_CTX,
  995. pExtBar,
  996. WM_NCRBUTTONDOWN,
  997. NULL
  998. )
  999. )
  1000. {
  1001. delete pPopup;
  1002. return;
  1003. }
  1004. if( pPopup->ItemGetCount() == 0 )
  1005. {
  1006. delete pPopup;
  1007. return;
  1008. }
  1009. //::SetFocus( hWndTrack );
  1010. if( ! pPopup->TrackPopupMenu(
  1011. TPMX_OWNERDRAW_FIXED,
  1012. point.x,
  1013. point.y,
  1014. NULL,
  1015. this,
  1016. NULL,
  1017. NULL,
  1018. true
  1019. )
  1020. )
  1021. {
  1022. //delete pPopup;
  1023. }
  1024. return;
  1025. } // if( pExtBar != NULL )
  1026. } // if( nHitTest == HTCAPTION )
  1027. CMiniDockFrameWnd::OnNcRButtonDown(nHitTest,point);
  1028. }
  1029. void CExtMiniDockFrameWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  1030. {
  1031. // CMiniDockFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
  1032. bCalcValidRects;
  1033. if( PmBridge_GetPM()->Bar_MiniDockFrameNcCalcSize(
  1034. lpncsp->rgrc[0],
  1035. this,
  1036. GetControlBarExt()
  1037. )
  1038. )
  1039. return;
  1040. INT nResizingFrameDX = 0;
  1041. INT nResizingFrameDY = 0;
  1042. INT nCaptionDY = 0;
  1043. OnQueryNcMetrics(
  1044. nResizingFrameDX,
  1045. nResizingFrameDY,
  1046. nCaptionDY
  1047. );
  1048. ::InflateRect(
  1049. &lpncsp->rgrc[0],
  1050. - nResizingFrameDX,
  1051. - nResizingFrameDY
  1052. );
  1053. lpncsp->rgrc[0].top += nCaptionDY;
  1054. }
  1055. void CExtMiniDockFrameWnd::CalcWindowRect(
  1056. LPRECT lpClientRect,
  1057. UINT nAdjustType // = CWnd::AdjustType::adjustBorder
  1058. )
  1059. {
  1060. ASSERT_VALID( this );
  1061. ASSERT( lpClientRect != NULL );
  1062. nAdjustType;
  1063. INT nResizingFrameDX = 0;
  1064. INT nResizingFrameDY = 0;
  1065. INT nCaptionDY = 0;
  1066. OnQueryNcMetrics(
  1067. nResizingFrameDX,
  1068. nResizingFrameDY,
  1069. nCaptionDY
  1070. );
  1071. ::InflateRect(
  1072. lpClientRect,
  1073. nResizingFrameDX,
  1074. nResizingFrameDY
  1075. );
  1076. lpClientRect->top -= nCaptionDY;
  1077. }
  1078. void CExtMiniDockFrameWnd::OnNcPaint() 
  1079. {
  1080. CRect rcClient, rcBar;
  1081. GetClientRect(rcClient);
  1082. ClientToScreen(rcClient);
  1083. GetWindowRect(rcBar);
  1084. rcClient.OffsetRect(-rcBar.TopLeft());
  1085. rcBar.OffsetRect(-rcBar.TopLeft());
  1086. CWindowDC dcSrc( this );
  1087. dcSrc.ExcludeClipRect( &rcClient );
  1088. CExtMemoryDC dcWin( &dcSrc, &rcBar );
  1089. RenderNC( dcWin );
  1090. PmBridge_GetPM()->OnPaintSessionComplete( this );
  1091. }
  1092. CExtControlBar * CExtMiniDockFrameWnd::FindSingleVisbleFlatingBar()
  1093. {
  1094. ASSERT_VALID( this );
  1095. if( GetSafeHwnd() == NULL )
  1096. return false;
  1097. CWnd * pWnd = GetWindow( GW_CHILD );
  1098. if( pWnd == NULL )
  1099. return NULL;
  1100. CDockBar * pDockBar = DYNAMIC_DOWNCAST( CDockBar, pWnd );
  1101. if( pDockBar == NULL )
  1102. return NULL;
  1103. if( pDockBar->GetDlgCtrlID() != AFX_IDW_DOCKBAR_FLOAT )
  1104. return NULL;
  1105. CExtControlBar * pFoundBar = NULL;
  1106. if( ! CExtControlBar::stat_FindSingleVisbleBarNested( pDockBar, &pFoundBar ) )
  1107. return NULL;
  1108. ASSERT_VALID( pFoundBar );
  1109. ASSERT( pFoundBar->GetSafeHwnd() != NULL );
  1110. ASSERT( ((CControlBar*)pFoundBar) != ((CControlBar*)pDockBar) );
  1111. return pFoundBar;
  1112. }
  1113. void CExtMiniDockFrameWnd::RenderNC( CDC & dc )
  1114. {
  1115. ASSERT_VALID( this );
  1116. ASSERT( dc.GetSafeHdc() != NULL );
  1117. CExtControlBar * pExtBar = GetControlBarExt();
  1118. bool bExtBar = false;
  1119. if( pExtBar != NULL
  1120. && (! pExtBar->IsFixedMode() )
  1121. )
  1122. bExtBar = true;
  1123. CRect rcClient, rcBar;
  1124. GetClientRect(rcClient);
  1125. ClientToScreen(rcClient);
  1126. GetWindowRect(rcBar);
  1127. rcClient.OffsetRect(-rcBar.TopLeft());
  1128. rcBar.OffsetRect(-rcBar.TopLeft());
  1129. #ifdef __FREIWALD_ORIGINAL__
  1130. bool bActive =
  1131. ( m_bHelperNcActive
  1132. //|| ( pExtBar != NULL && pExtBar->IsBarWindowActive() )
  1133. ) ? true : false;
  1134. #else
  1135. bool bActive = false;
  1136. HWND hTmpWndFocus = ::GetFocus();
  1137. if( hTmpWndFocus != NULL
  1138. && ( GetSafeHwnd() == hTmpWndFocus
  1139. || ::IsChild( GetSafeHwnd(), hTmpWndFocus )
  1140. )
  1141. )
  1142. bActive = true;
  1143. #endif
  1144. CExtPaintManager::PAINTDOCKINGFRAMEDATA _pdfd(
  1145. this,
  1146. rcBar,
  1147. rcClient,
  1148. bActive,
  1149. true,
  1150. bExtBar
  1151. );
  1152. PmBridge_GetPM()->PaintDockingFrame( dc, _pdfd );
  1153. bool bEnableCaptionText = true;
  1154. CExtSafeString sCaption;
  1155. if( pExtBar != NULL )
  1156. {
  1157. if( pExtBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar))
  1158. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1159. && ( !pExtBar->IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar)) )
  1160. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1161. )
  1162. bEnableCaptionText = false;
  1163. else
  1164. {
  1165. pExtBar->OnGetBarCaptionText(
  1166. CExtControlBar::__EBCT_SINGLE_CAPTION_FLOATING,
  1167. sCaption
  1168. );
  1169. }
  1170. }
  1171. if( ! bEnableCaptionText )
  1172. {
  1173. if( pExtBar != NULL
  1174. && pExtBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar))
  1175. )
  1176. bEnableCaptionText =
  1177. _GetSingleVisibleCaptionText(
  1178. sCaption
  1179. );
  1180. }
  1181. else
  1182. if( bEnableCaptionText && sCaption.IsEmpty() )
  1183. {
  1184. if( pExtBar != NULL )
  1185. {
  1186. pExtBar->OnGetBarCaptionText(
  1187. CExtControlBar::__EBCT_SINGLE_CAPTION_FLOATING,
  1188. sCaption
  1189. );
  1190. } // if( pExtBar != NULL )
  1191. else
  1192. {
  1193. int nTextLen = GetWindowTextLength();
  1194. if( nTextLen > 0 )
  1195. {
  1196. GetWindowText( sCaption.GetBuffer( nTextLen+2 ), nTextLen+1 );
  1197. sCaption.ReleaseBuffer();
  1198. } // if( nTextLen > 0 )
  1199. } // else from if( pExtBar != NULL )
  1200. }
  1201. CRect rcCapt( m_rcFrameCaption );
  1202. CRect rcText( m_rcFrameCaption );
  1203. if( pExtBar == NULL )
  1204. rcText.right = m_rcBtnHideBar.left;
  1205. if( pExtBar != NULL )
  1206. pExtBar->NcButtons_CalcGripperTextLocation( rcText );
  1207. if( ! bActive )
  1208. {
  1209. HWND hTmpWndFocus = ::GetFocus();
  1210. if( hTmpWndFocus != NULL
  1211. && ( GetSafeHwnd() == hTmpWndFocus
  1212. || ::IsChild( GetSafeHwnd(), hTmpWndFocus )
  1213. )
  1214. )
  1215. bActive = true;
  1216. }
  1217. rcText.DeflateRect(2,0);
  1218. CExtControlBar * pSingleVisbleFlatingBar = FindSingleVisbleFlatingBar();
  1219. if( pSingleVisbleFlatingBar != NULL )
  1220. {
  1221. CExtControlBar * pFlashingBar = pSingleVisbleFlatingBar;
  1222. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1223. CExtDynTabControlBar * pTabbedBar = DYNAMIC_DOWNCAST( CExtDynTabControlBar, pSingleVisbleFlatingBar );
  1224. if( pTabbedBar != NULL )
  1225. {
  1226. LONG nSel = pTabbedBar->GetSwitcherSelection();
  1227. if( nSel >= 0 )
  1228. {
  1229. CExtControlBar * pBar = pTabbedBar->GetBarAt( nSel, true );
  1230. if( pBar != NULL )
  1231. {
  1232. ASSERT_VALID( pBar );
  1233. ASSERT( pBar->GetSafeHwnd() != NULL );
  1234. pFlashingBar = pBar;
  1235. } // if( pBar != NULL )
  1236. } // if( nSel >= 0 )
  1237. } // if( pTabbedBar != NULL )
  1238. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1239. CExtPaintManager::PAINTGRIPPERDATA _pgd(
  1240. pFlashingBar, // pSingleVisbleFlatingBar
  1241. rcCapt,
  1242. rcText,
  1243. bActive,
  1244. true,
  1245. false,
  1246. bExtBar,
  1247. sCaption.IsEmpty() ? LPCTSTR( NULL ) : sCaption,
  1248. ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false
  1249. );
  1250. bool bDrawDefaultCaption = true, bFlashCaptionHighlightedState = false;
  1251. if( pFlashingBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  1252. {
  1253. _pgd.m_bFlashCaptionHighlightedState = bFlashCaptionHighlightedState;
  1254. _pgd.m_clrFlashCaptionText = pFlashingBar->m_clrFlashCaptionText;
  1255. _pgd.m_clrFlashCaptionBackground = pFlashingBar->m_clrFlashCaptionBackground;
  1256. if( pFlashingBar->FlashCaption_DoPaintNC(
  1257. dc,
  1258. (LPVOID)(&_pgd)
  1259. )
  1260. )
  1261. bDrawDefaultCaption = false;
  1262. } // if( pFlashingBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  1263. if( bDrawDefaultCaption )
  1264. {
  1265. PmBridge_GetPM()->PaintGripper( dc, _pgd );
  1266. if( pExtBar != NULL )
  1267. pExtBar->NcButtons_Paint( dc );
  1268. } // if( bDrawDefaultCaption )
  1269. } // if( pSingleVisbleFlatingBar != NULL )
  1270. else
  1271. {
  1272. CExtPaintManager::PAINTGRIPPERDATA _pgd(
  1273. this,
  1274. rcCapt,
  1275. rcText,
  1276. bActive,
  1277. true,
  1278. false,
  1279. bExtBar,
  1280. sCaption.IsEmpty() ? LPCTSTR( NULL ) : sCaption,
  1281. ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false
  1282. );
  1283. PmBridge_GetPM()->PaintGripper( dc, _pgd );
  1284. }
  1285. if( pExtBar != NULL )
  1286. pExtBar->NcButtons_Paint( dc );
  1287. }
  1288. bool CExtMiniDockFrameWnd::_GetSingleVisibleCaptionText( CExtSafeString & sCaption )
  1289. {
  1290. sCaption = _T("");
  1291. CFrameWnd * pDockSite = GetParentFrame();
  1292. if( pDockSite == NULL )
  1293. return false;
  1294. ASSERT( ! pDockSite->IsKindOf( RUNTIME_CLASS(CMiniFrameWnd) ) );
  1295. POSITION pos = pDockSite->m_listControlBars.GetHeadPosition();
  1296. for( ; pos != NULL; )
  1297. {
  1298. CExtControlBar * pBar =
  1299. DYNAMIC_DOWNCAST(
  1300. CExtControlBar,
  1301. ((CControlBar *)(pDockSite->m_listControlBars.GetNext(pos)))
  1302. );
  1303. if( pBar == NULL
  1304. || pBar->m_pDockSite == NULL
  1305. || pBar->IsFixedMode()
  1306. || ( pBar->IsKindOf(RUNTIME_CLASS(CExtDynControlBar))
  1307. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1308. && !pBar->IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar))
  1309. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1310. )
  1311. || pBar->GetParentFrame() != this
  1312. || pBar->IsFloating()
  1313. || !pBar->IsVisible()
  1314. )
  1315. continue;
  1316. ASSERT( pBar->m_pDockBar != NULL );
  1317. if(
  1318. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1319. pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar))
  1320. ||
  1321. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1322. !pBar->m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar))
  1323. )
  1324. continue;
  1325. if( ! pBar->_IsSingleVisibleInFloatingPalette() )
  1326. return false;
  1327. pBar->OnGetBarCaptionText(
  1328. CExtControlBar::__EBCT_SINGLE_CAPTION_FLOATING,
  1329. sCaption
  1330. );
  1331. return sCaption.IsEmpty() ? false : true;
  1332. }
  1333. return false;
  1334. }
  1335. BOOL CExtMiniDockFrameWnd::OnNcActivate(BOOL bActive) 
  1336. {
  1337. ASSERT_VALID( this );
  1338. m_bHelperNcActive = bActive ? true : false;
  1339. BOOL rc = CMiniDockFrameWnd::OnNcActivate( bActive );
  1340. CExtControlBar * pExtBar = GetControlBarExt();
  1341. if( pExtBar != NULL )
  1342. {
  1343. ASSERT_VALID( pExtBar );
  1344. pExtBar->_OnNcMiniFrameActivate( bActive ? true : false );
  1345. }
  1346. if( ( GetStyle() & WS_VISIBLE ) != 0 )
  1347. {
  1348. // SendMessage( WM_NCPAINT );
  1349. PostMessage( WM_NCPAINT );
  1350. if( bActive )
  1351. {
  1352. if( pExtBar != NULL )
  1353. {
  1354. ASSERT_VALID( pExtBar );
  1355. pExtBar->RedrawWindow(
  1356. NULL,
  1357. NULL,
  1358. RDW_INVALIDATE|RDW_UPDATENOW
  1359. |RDW_ERASE|RDW_ALLCHILDREN
  1360. );
  1361. }
  1362. }
  1363. } // if( ( GetStyle() & WS_VISIBLE ) != 0 )
  1364. return rc;
  1365. }
  1366. void CExtMiniDockFrameWnd::OnSize(UINT nType, int cx, int cy) 
  1367. {
  1368. // if( _ResizingIsInProgress() )
  1369. // return;
  1370. ASSERT( cx >= 0 && cy >= 0 );
  1371. CExtPaintManager::monitor_parms_t _mp;
  1372. CExtPaintManager::stat_GetMonitorParms( _mp, this );
  1373. CRect rcWnd;
  1374. GetWindowRect( &rcWnd );
  1375. #ifdef __FREIWALD_ORIGINAL__
  1376. if( ( cx > _mp.m_rcWorkArea.Width() && _mp.m_rcWorkArea.Width() > 0 )
  1377. || ( cy > _mp.m_rcWorkArea.Height() && _mp.m_rcWorkArea.Height() > 0 )
  1378. || rcWnd.right < _mp.m_rcWorkArea.left
  1379. || rcWnd.bottom < _mp.m_rcWorkArea.top
  1380. || rcWnd.left > _mp.m_rcWorkArea.right
  1381. || rcWnd.top > _mp.m_rcWorkArea.bottom
  1382. )
  1383. #else
  1384. // It should be possible to enlarge the size of a floating frame to cover two or more monitors
  1385. // in a multiple monitor configuration.
  1386. // The original implementation, however, adjusted the dimensions of the floating frame according to the
  1387. // dimensions of the primary monitor.
  1388. // This does not only prevent the floating frame from being enlarged to more than one monitor,
  1389. // but may also cause wrong calculations, when the frame is resized on the non-primary monitor and
  1390. // the dimensions / screen resolution of this non-primary monitor are different to those of the primary monitor.
  1391. // This has been adjusted with the following change:
  1392. CRect rcWorkArea = _mp.m_rcWorkArea;
  1393. if (GetSystemMetrics(__cSM_CMONITORS) > 1)
  1394. {
  1395. rcWorkArea = CRect(CPoint(GetSystemMetrics(__cSM_XVIRTUALSCREEN), GetSystemMetrics(__cSM_YVIRTUALSCREEN)), 
  1396.  CSize(GetSystemMetrics(__cSM_CXVIRTUALSCREEN), GetSystemMetrics(__cSM_CYVIRTUALSCREEN)));
  1397. }
  1398. if( ( cx > rcWorkArea.Width() && rcWorkArea.Width() > 0 )
  1399. || ( cy > rcWorkArea.Height() && rcWorkArea.Height() > 0 )
  1400. || rcWnd.right < rcWorkArea.left
  1401. || rcWnd.bottom < rcWorkArea.top
  1402. || rcWnd.left > rcWorkArea.right
  1403. || rcWnd.top > rcWorkArea.bottom
  1404. )
  1405. #endif
  1406. {
  1407. if( ! m_bMovingLargeBar )
  1408. SetTimer( 5, 1, NULL );
  1409. return;
  1410. }
  1411. CMiniDockFrameWnd::OnSize(nType, cx, cy);
  1412. VERIFY(
  1413. PmBridge_GetPM()->Bar_MiniDockFrameCaptionCalcRect(
  1414. m_rcFrameCaption,
  1415. this,
  1416. GetControlBarExt()
  1417. );
  1418. int nDummyMetric = ::GetSystemMetrics( SM_CXSMSIZE ) - 1;
  1419. int nRight =
  1420. m_rcFrameCaption.right - nDummyMetric - 1;
  1421. m_rcBtnHideBar.SetRect(
  1422. nRight,
  1423. m_rcFrameCaption.top + 2,
  1424. nRight + nDummyMetric - 2,
  1425. m_rcFrameCaption.bottom - 2
  1426. );
  1427. CExtControlBar * pExtBar = GetControlBarExt();
  1428. if( pExtBar != NULL )
  1429. {
  1430. pExtBar->OnNcAreaButtonsReinitialize();
  1431. pExtBar->OnNcAreaButtonsReposition();
  1432. } // if( pExtBar != NULL )
  1433. if( ::GetCapture() == m_hWnd )
  1434. SendMessage( WM_NCPAINT );
  1435. CExtPaintManager::stat_PassPaintMessages();
  1436. }
  1437. void CExtMiniDockFrameWnd::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
  1438. {
  1439. CMiniDockFrameWnd::OnWindowPosChanged(lpwndpos);
  1440. CExtControlBar * pExtBar = GetControlBarExt();
  1441. if( _ResizingIsInProgress()
  1442. || g_bOnWndPosChgProcessing
  1443. || (lpwndpos->flags & SWP_NOMOVE) != 0
  1444. )
  1445. {
  1446. return;
  1447. }
  1448. if( pExtBar == NULL || (! pExtBar->IsFloating()) )
  1449. return;
  1450. CRect rcWnd;
  1451. GetWindowRect( &rcWnd );
  1452. INT nResizingFrameDX = 0;
  1453. INT nResizingFrameDY = 0;
  1454. INT nCaptionDY = 0;
  1455. OnQueryNcMetrics(
  1456. nResizingFrameDX,
  1457. nResizingFrameDY,
  1458. nCaptionDY
  1459. );
  1460. CExtPaintManager::monitor_parms_t _mp;
  1461. CExtPaintManager::stat_GetMonitorParms( _mp, this );
  1462. ASSERT( ! g_bOnWndPosChgProcessing );
  1463. //if( rcWnd.top < _mp.m_rcWorkArea.top )
  1464. if( rcWnd.bottom < _mp.m_rcWorkArea.top )
  1465. {
  1466. rcWnd.top = _mp.m_rcWorkArea.top;
  1467. g_bOnWndPosChgProcessing = true;
  1468. }
  1469. else if( rcWnd.top + nCaptionDY > _mp.m_rcWorkArea.bottom )
  1470. {
  1471. rcWnd.top =
  1472. max(
  1473. _mp.m_rcWorkArea.top, 
  1474. _mp.m_rcWorkArea.bottom
  1475. - nCaptionDY
  1476. );
  1477. g_bOnWndPosChgProcessing = true;
  1478. }
  1479. if( ! g_bOnWndPosChgProcessing )
  1480. {
  1481. return;
  1482. }
  1483. SetWindowPos(
  1484. NULL,
  1485. rcWnd.left, rcWnd.top, -1, -1,
  1486. SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE
  1487. );
  1488. pExtBar->OnNcAreaButtonsReposition();
  1489. PostMessage( WM_NCPAINT );
  1490. CExtPaintManager::stat_PassPaintMessages();
  1491. g_bOnWndPosChgProcessing = false;
  1492. }
  1493. void CExtMiniDockFrameWnd::OnWindowPosChanging( WINDOWPOS* lpwndpos )
  1494. {
  1495. CMiniDockFrameWnd::OnWindowPosChanging( lpwndpos );
  1496. if( GetStyle() & __REMOVED_STYLES_NORMAL )
  1497. ModifyStyle( __REMOVED_STYLES_NORMAL, 0, __SWP_FOR_REMOVED_STYLES );
  1498. if( GetExStyle() & __REMOVED_STYLES_EXTENDED )
  1499. ModifyStyleEx( __REMOVED_STYLES_EXTENDED, 0, __SWP_FOR_REMOVED_STYLES );
  1500. }
  1501. void CExtMiniDockFrameWnd::_AnalyzeButtonsHover(
  1502. bool bAllowShowAdvacedTip // = false
  1503. )
  1504. {
  1505. ASSERT_VALID( this );
  1506. CPoint point;
  1507. if( ::GetCursorPos( &point ) )
  1508. _AnalyzeButtonsHover(
  1509. point,
  1510. bAllowShowAdvacedTip
  1511. );
  1512. }
  1513. void CExtMiniDockFrameWnd::_AnalyzeButtonsHover(
  1514. CPoint point,
  1515. bool bAllowShowAdvacedTip // = false
  1516. )
  1517. {
  1518. ASSERT_VALID( this );
  1519. CExtControlBar * pExtBar = GetControlBarExt();
  1520. if( pExtBar != NULL )
  1521. {
  1522. CExtPopupMenuTipWnd * pATTW =
  1523. pExtBar->OnAdvancedPopupMenuTipWndGet();
  1524. if( pATTW == NULL )
  1525. bAllowShowAdvacedTip = false;
  1526. CExtBarNcAreaButton * pBtn = NULL;
  1527. pExtBar->NcButtons_HitTest( point, &pBtn );
  1528. if( bAllowShowAdvacedTip && pBtn != NULL )
  1529. {
  1530. TOOLINFO _ti;
  1531. ::memset( &_ti, 0, sizeof(AFX_OLDTOOLINFO) );
  1532. _ti.cbSize = sizeof( TOOLINFO );
  1533. _ti.hinst = ::AfxGetInstanceHandle();
  1534. if( pBtn->OnToolHitTest( point, &_ti ) > 0 )
  1535. {
  1536. if( _ti.lpszText != NULL
  1537. && _ti.lpszText != LPSTR_TEXTCALLBACK
  1538. && _tcslen( _ti.lpszText ) > 0
  1539. )
  1540. {
  1541. CRect rcArea = *pBtn;
  1542. CRect rcDefOffsetWnd;
  1543. GetWindowRect( &rcDefOffsetWnd );
  1544. rcArea.OffsetRect( rcDefOffsetWnd.TopLeft() );
  1545. pExtBar->OnAdvancedPopupMenuTipWndDisplay(
  1546. *pATTW,
  1547. rcArea,
  1548. _ti.lpszText
  1549. );
  1550. }
  1551. }
  1552. if( _ti.lpszText != NULL
  1553. && _ti.lpszText != LPSTR_TEXTCALLBACK
  1554. )
  1555. ::free( _ti.lpszText );
  1556. } // if( bAllowShowAdvacedTip && pBtn != NULL )
  1557. return;
  1558. }
  1559. CRect rcClient, rcBar;
  1560. GetClientRect( &rcClient );
  1561. ClientToScreen( &rcClient );
  1562. GetWindowRect( &rcBar );
  1563. rcClient.OffsetRect( -rcBar.TopLeft() );
  1564. rcBar.OffsetRect (-rcBar.TopLeft() );
  1565. ScreenToClient( &point );
  1566. point.y -= rcBar.top - rcClient.top;
  1567. bool bBtnHideBarHover = false;
  1568. if( m_rcBtnHideBar.PtInRect(point) )
  1569. bBtnHideBarHover = true;
  1570. if( m_bBtnHideBar != bBtnHideBarHover )
  1571. {
  1572. m_bBtnHideBar = bBtnHideBarHover;
  1573. // SendMessage( WM_NCPAINT );
  1574. PostMessage( WM_NCPAINT );
  1575. }
  1576. if( m_bBtnHideBar || bBtnHideBarHover )
  1577. SetTimer( 2, 20, NULL );
  1578. else
  1579. KillTimer( 2 );
  1580. }
  1581. void CExtMiniDockFrameWnd::OnNcMouseMove( UINT nHitTest, CPoint point )
  1582. {
  1583. if( g_bAutoMakeTopmostOnMouseEvent
  1584. && (!CExtPopupMenuWnd::IsMenuTracking())
  1585. && (CExtControlBar::_DraggingGetBar() == NULL)
  1586. )
  1587. BringWindowToTop();
  1588. if( _ResizingIsInProgress() )
  1589. {
  1590. return;
  1591. }
  1592. CMiniDockFrameWnd::OnNcMouseMove( nHitTest, point );
  1593. _AnalyzeButtonsHover( point, true );
  1594. }
  1595. void CExtMiniDockFrameWnd::OnTimer( __EXT_MFC_UINT_PTR nIDEvent )
  1596. {
  1597. CExtControlBar * pExtBar = GetControlBarExt();
  1598. if( nIDEvent == 1 )
  1599. {
  1600. if( pExtBar == NULL )
  1601. return;
  1602. KillTimer( 1 );
  1603. if( pExtBar->IsFixedMode() )
  1604. {
  1605. CRect rcWnd;
  1606. GetWindowRect( &rcWnd );
  1607. pExtBar->SetInitDesiredSizeFloating( rcWnd.Size() );
  1608. }
  1609. pExtBar->OnNcAreaButtonsReposition();
  1610.   if( IsWindowVisible() )
  1611. //  SendMessage( WM_NCPAINT );
  1612. PostMessage( WM_NCPAINT );
  1613. return;
  1614. }
  1615. if( nIDEvent == 2 )
  1616. {
  1617. _AnalyzeButtonsHover();
  1618. return;
  1619. }
  1620. if( nIDEvent == 4 )
  1621. {
  1622. if( CExtControlBar::_DraggingGetBar() != NULL )
  1623. {
  1624. KillTimer( 4 );
  1625. return;
  1626. } // if( CExtControlBar::_DraggingGetBar() != NULL )
  1627. if( pExtBar != NULL )
  1628. {
  1629. ASSERT_VALID( pExtBar );
  1630. CPoint point;
  1631. if( ! ::GetCursorPos(&point) )
  1632. return;
  1633. UINT nHT = pExtBar->NcButtons_HitTest( point );
  1634. if( nHT == HTCLIENT )
  1635. {
  1636. PostMessage( WM_NCPAINT );
  1637. pExtBar->m_bNcAreaBtnTracking = false;
  1638. }
  1639. }
  1640. if( !pExtBar->m_bNcAreaBtnTracking )
  1641. KillTimer( 4 );
  1642. return;
  1643. }
  1644. if( nIDEvent == 5 )
  1645. {
  1646. KillTimer( 5 );
  1647. CExtPaintManager::monitor_parms_t _mp;
  1648. CExtPaintManager::stat_GetMonitorParms( _mp, this );
  1649. CRect rcWnd;
  1650. GetWindowRect( &rcWnd );
  1651. #ifdef __FREIWALD_ORIGINAL__
  1652. if( ( rcWnd.Width() > _mp.m_rcWorkArea.Width() && _mp.m_rcWorkArea.Width() > 0 )
  1653. || ( rcWnd.Height() > _mp.m_rcWorkArea.Height() && _mp.m_rcWorkArea.Height() > 0 )
  1654. )
  1655. {
  1656. rcWnd.right =
  1657. rcWnd.left
  1658. + ( min( rcWnd.Width(), _mp.m_rcWorkArea.Width() ) )
  1659. ;
  1660. rcWnd.bottom =
  1661. rcWnd.top
  1662. + ( min( rcWnd.Height(), _mp.m_rcWorkArea.Height() ) )
  1663. ;
  1664. #else
  1665. // It should be possible to enlarge the size of a floating frame to cover two or more monitors
  1666. // in a multiple monitor configuration.
  1667. // The original implementation, however, adjusted the dimensions of the floating frame according to the
  1668. // dimensions of the primary monitor.
  1669. // This does not only prevent the floating frame from being enlarged to more than one monitor,
  1670. // but may also cause wrong calculations, when the frame is resized on the non-primary monitor and
  1671. // the dimensions / screen resolution of this non-primary monitor are different to those of the primary monitor.
  1672. // This has been adjusted with the following change:
  1673. CRect rcWorkArea = _mp.m_rcWorkArea;
  1674. if (GetSystemMetrics(__cSM_CMONITORS) > 1)
  1675. {
  1676. rcWorkArea = CRect(CPoint(GetSystemMetrics(__cSM_XVIRTUALSCREEN), GetSystemMetrics(__cSM_YVIRTUALSCREEN)), 
  1677.  CSize(GetSystemMetrics(__cSM_CXVIRTUALSCREEN), GetSystemMetrics(__cSM_CYVIRTUALSCREEN)));
  1678. }
  1679. if( ( rcWnd.Width() > rcWorkArea.Width() && rcWorkArea.Width() > 0 )
  1680. || ( rcWnd.Height() > rcWorkArea.Height() && rcWorkArea.Height() > 0 )
  1681. )
  1682. {
  1683. rcWnd.right =
  1684. rcWnd.left
  1685. + ( min( rcWnd.Width(), rcWorkArea.Width() ) )
  1686. ;
  1687. rcWnd.bottom =
  1688. rcWnd.top
  1689. + ( min( rcWnd.Height(), rcWorkArea.Height() ) )
  1690. ;
  1691. #endif
  1692. m_bMovingLargeBar = true;
  1693. MoveWindow( &rcWnd );
  1694. // SendMessage( WM_NCPAINT );
  1695. PostMessage( WM_NCPAINT );
  1696. m_bMovingLargeBar = false;
  1697. }
  1698. CRect rcWndAdjusted( 0, 0, 0, 0 );
  1699. if( rcWnd.right < _mp.m_rcWorkArea.left )
  1700. {
  1701. rcWndAdjusted = rcWnd;
  1702. rcWndAdjusted.OffsetRect(
  1703. _mp.m_rcWorkArea.left - rcWnd.left,
  1704. 0
  1705. );
  1706. }
  1707. if( rcWnd.bottom < _mp.m_rcWorkArea.top )
  1708. {
  1709. rcWndAdjusted = rcWnd;
  1710. rcWndAdjusted.OffsetRect(
  1711. 0,
  1712. _mp.m_rcWorkArea.top - rcWnd.top
  1713. );
  1714. }
  1715. if( rcWnd.left > _mp.m_rcWorkArea.right )
  1716. {
  1717. rcWndAdjusted = rcWnd;
  1718. rcWndAdjusted.OffsetRect(
  1719. _mp.m_rcWorkArea.right - rcWnd.right,
  1720. 0
  1721. );
  1722. }
  1723. if( rcWnd.top > _mp.m_rcWorkArea.bottom )
  1724. {
  1725. rcWndAdjusted = rcWnd;
  1726. rcWndAdjusted.OffsetRect(
  1727. 0,
  1728. _mp.m_rcWorkArea.bottom - rcWnd.bottom
  1729. );
  1730. }
  1731. if( ! rcWndAdjusted.IsRectEmpty() )
  1732. {
  1733. m_bMovingLargeBar = true;
  1734. MoveWindow( &rcWndAdjusted );
  1735. // SendMessage( WM_NCPAINT );
  1736. PostMessage( WM_NCPAINT );
  1737. m_bMovingLargeBar = false;
  1738. }
  1739. return;
  1740. }
  1741. if( pExtBar == NULL )
  1742. return;
  1743. ASSERT_VALID( pExtBar );
  1744. if( nIDEvent == (UINT)pExtBar->GetDlgCtrlID() )
  1745. {
  1746. if( _ResizingIsInProgress() )
  1747. return;
  1748. CPoint pt;
  1749. if( ! ::GetCursorPos( &pt ) )
  1750. return;
  1751. CWnd * pTempWnd = WindowFromPoint( pt );
  1752. int IsMouseInsideTheWindow =
  1753. IsChild( pTempWnd ) || pTempWnd->m_hWnd == m_hWnd;
  1754. if( IsMouseInsideTheWindow
  1755. || IsChild(GetFocus())  
  1756. || (CExtMouseCaptureSink::GetCapture() && pExtBar->m_hWnd == CExtMouseCaptureSink::GetCapture()) 
  1757. || CExtPopupMenuWnd::IsMenuTracking()
  1758. {
  1759. if( IsMouseInsideTheWindow 
  1760. && !CExtPopupMenuWnd::IsMenuTracking()
  1761. && IsWindowEnabled()
  1762. && GetFocus()
  1763. BringWindowToTop();
  1764. }
  1765. } // if( nIDEvent == (UINT)pExtBar->GetDlgCtrlID() )
  1766. }
  1767. void CExtMiniDockFrameWnd::OnClose() 
  1768. {
  1769. CMiniDockFrameWnd::OnClose();
  1770. }
  1771. void CExtMiniDockFrameWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
  1772. {
  1773.     CMiniDockFrameWnd::OnGetMinMaxInfo( lpMMI );
  1774. CExtPaintManager::monitor_parms_t _mp;
  1775. CExtPaintManager::stat_GetMonitorParms( _mp, this );
  1776. if( lpMMI->ptMaxTrackSize.x > _mp.m_rcWorkArea.Width() )
  1777. lpMMI->ptMaxTrackSize.x = _mp.m_rcWorkArea.Width();
  1778. if( lpMMI->ptMaxTrackSize.y > _mp.m_rcWorkArea.Height() ) 
  1779. lpMMI->ptMaxTrackSize.y = _mp.m_rcWorkArea.Height();
  1780. }
  1781. void CExtMiniDockFrameWnd::OnMouseMove(UINT nFlags, CPoint point) 
  1782. {
  1783. if( g_bAutoMakeTopmostOnMouseEvent
  1784. && (!CExtPopupMenuWnd::IsMenuTracking())
  1785. )
  1786. BringWindowToTop();
  1787. if( _ResizingIsInProgress() )
  1788. {
  1789. ClientToScreen( &point );
  1790. _ResizingUpdateState( point );
  1791. return;
  1792. }
  1793. CMiniDockFrameWnd::OnMouseMove(nFlags, point);
  1794. }
  1795. void CExtMiniDockFrameWnd::OnCaptureChanged(CWnd *pWnd) 
  1796. {
  1797. if( _ResizingIsInProgress()
  1798. && pWnd != this
  1799. )
  1800. {
  1801. _ResizingEnd();
  1802. return;
  1803. }
  1804. CMiniDockFrameWnd::OnCaptureChanged(pWnd);
  1805. }
  1806. void CExtMiniDockFrameWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  1807. {
  1808. if( _ResizingIsInProgress() )
  1809. {
  1810. _ResizingEnd();
  1811. return;
  1812. }
  1813. CMiniDockFrameWnd::OnLButtonUp(nFlags, point);
  1814. }
  1815. void CExtMiniDockFrameWnd::OnRButtonDown(UINT nFlags, CPoint point) 
  1816. {
  1817. if( _ResizingIsInProgress() )
  1818. {
  1819. _ResizingEnd();
  1820. return;
  1821. }
  1822. CMiniDockFrameWnd::OnRButtonDown(nFlags, point);
  1823. }
  1824. BOOL CExtMiniDockFrameWnd::OnEraseBkgnd(CDC* pDC) 
  1825. {
  1826. pDC;
  1827. return TRUE;
  1828. }
  1829. UINT CExtMiniDockFrameWnd::OnNcHitTest(CPoint point) 
  1830. {
  1831. if( CExtControlBar::_DraggingGetBar() != NULL )
  1832. return HTNOWHERE;
  1833. CExtControlBar * pExtBar = GetControlBarExt();
  1834. if( pExtBar != NULL )
  1835. {
  1836. ASSERT_VALID( pExtBar );
  1837. if( ! pExtBar->_FloatStateChangingIsEnabled( pExtBar ) )
  1838. return HTNOWHERE;
  1839. }
  1840. if( GetStyle() & MFS_MOVEFRAME )
  1841. ModifyStyle( MFS_MOVEFRAME, 0 );
  1842. //UINT nHit = CMiniDockFrameWnd::OnNcHitTest(point);
  1843. CRect rcBar;
  1844. GetWindowRect( &rcBar );
  1845. if( !rcBar.PtInRect( point ) )
  1846. return HTNOWHERE;
  1847. UINT nHit = HTCLIENT;
  1848. INT nResizingFrameDX = 0;
  1849. INT nResizingFrameDY = 0;
  1850. INT nCaptionDY = 0;
  1851. OnQueryNcMetrics(
  1852. nResizingFrameDX,
  1853. nResizingFrameDY,
  1854. nCaptionDY
  1855. );
  1856. CRect rcTest(
  1857. rcBar.left,
  1858. rcBar.top,
  1859. rcBar.right,
  1860. rcBar.top + nResizingFrameDY
  1861. );
  1862. if( rcTest.PtInRect( point ) )
  1863. nHit = HTTOP;
  1864. else
  1865. {
  1866. rcTest.SetRect(
  1867. rcBar.left,
  1868. rcBar.bottom - nResizingFrameDY,
  1869. rcBar.right,
  1870. rcBar.bottom
  1871. );
  1872. if( rcTest.PtInRect( point ) )
  1873. nHit = HTBOTTOM;
  1874. else
  1875. {
  1876. rcTest.SetRect(
  1877. rcBar.left,
  1878. rcBar.top,
  1879. rcBar.left + nResizingFrameDX,
  1880. rcBar.bottom
  1881. );
  1882. if( rcTest.PtInRect( point ) )
  1883. nHit = HTLEFT;
  1884. else
  1885. {
  1886. rcTest.SetRect(
  1887. rcBar.right - nResizingFrameDX,
  1888. rcBar.top,
  1889. rcBar.right,
  1890. rcBar.bottom
  1891. );
  1892. if( rcTest.PtInRect( point ) )
  1893. nHit = HTRIGHT;
  1894. else
  1895. {
  1896. rcTest.SetRect(
  1897. rcBar.left,
  1898. rcBar.top + nResizingFrameDY,
  1899. rcBar.right,
  1900. rcBar.top + nResizingFrameDY + nCaptionDY
  1901. );
  1902. if( rcTest.PtInRect( point ) )
  1903. nHit = HTCAPTION;
  1904. }
  1905. }
  1906. }
  1907. }
  1908. switch( nHit )
  1909. {
  1910. case HTTOP:
  1911. {
  1912. rcTest.SetRect(
  1913. rcBar.left,
  1914. rcBar.top,
  1915. rcBar.left + nCaptionDY,
  1916. rcBar.top + nResizingFrameDY
  1917. );
  1918. if( rcTest.PtInRect(point) )
  1919. nHit = HTTOPLEFT;
  1920. else
  1921. {
  1922. rcTest.SetRect(
  1923. rcBar.right - nResizingFrameDY,
  1924. rcBar.top,
  1925. rcBar.right,
  1926. rcBar.top + nResizingFrameDY
  1927. );
  1928. if( rcTest.PtInRect(point) )
  1929. nHit = HTTOPRIGHT;
  1930. }
  1931. }
  1932. break;
  1933. case HTBOTTOM:
  1934. {
  1935. rcTest.SetRect(
  1936. rcBar.left,
  1937. rcBar.bottom - nResizingFrameDY,
  1938. rcBar.left + nCaptionDY,
  1939. rcBar.bottom
  1940. );
  1941. if( rcTest.PtInRect(point) )
  1942. nHit = HTBOTTOMLEFT;
  1943. else
  1944. {
  1945. rcTest.SetRect(
  1946. rcBar.right - nResizingFrameDY,
  1947. rcBar.bottom - nResizingFrameDY,
  1948. rcBar.right,
  1949. rcBar.bottom
  1950. );
  1951. if( rcTest.PtInRect(point) )
  1952. nHit = HTBOTTOMRIGHT;
  1953. }
  1954. }
  1955. break;
  1956. case HTLEFT:
  1957. {
  1958. rcTest.SetRect(
  1959. rcBar.left,
  1960. rcBar.top,
  1961. rcBar.left + nResizingFrameDX,
  1962. rcBar.top + nCaptionDY
  1963. );
  1964. if( rcTest.PtInRect(point) )
  1965. nHit = HTTOPLEFT;
  1966. else
  1967. {
  1968. rcTest.SetRect(
  1969. rcBar.left,
  1970. rcBar.bottom - nCaptionDY,
  1971. rcBar.left + nResizingFrameDX,
  1972. rcBar.bottom
  1973. );
  1974. if( rcTest.PtInRect(point) )
  1975. nHit = HTBOTTOMLEFT;
  1976. }
  1977. }
  1978. break;
  1979. case HTRIGHT:
  1980. {
  1981. rcTest.SetRect(
  1982. rcBar.right - nResizingFrameDX,
  1983. rcBar.top,
  1984. rcBar.right,
  1985. rcBar.top + nCaptionDY
  1986. );
  1987. if( rcTest.PtInRect(point) )
  1988. nHit = HTTOPRIGHT;
  1989. else
  1990. {
  1991. rcTest.SetRect(
  1992. rcBar.right - nResizingFrameDX,
  1993. rcBar.bottom - nCaptionDY,
  1994. rcBar.right,
  1995. rcBar.bottom
  1996. );
  1997. if( rcTest.PtInRect(point) )
  1998. nHit = HTBOTTOMRIGHT;
  1999. }
  2000. }
  2001. break;
  2002. } // switch( nHit )
  2003. bool bNcRepaint = false;
  2004. if( pExtBar != NULL )
  2005. {
  2006. ASSERT_VALID( pExtBar );
  2007. UINT nHT = pExtBar->NcButtons_HitTest( point );
  2008. if( nHT != HTCLIENT )
  2009. {
  2010. pExtBar->m_bNcAreaBtnTracking = true;
  2011. if( pExtBar->_IsDockSiteCustomizeMode() )
  2012. SetTimer( 4, 20, NULL );
  2013. return nHT;
  2014. }
  2015. else
  2016. {
  2017. bNcRepaint = true;
  2018. pExtBar->m_bNcAreaBtnTracking = false;
  2019. }
  2020. if( pExtBar->IsFixedMode() )
  2021. {
  2022. bool bPaletteMode = false;
  2023. CExtToolControlBar * pToolBar =
  2024. DYNAMIC_DOWNCAST(
  2025. CExtToolControlBar,
  2026. pExtBar
  2027. );
  2028. if( pToolBar != NULL )
  2029. {
  2030. ASSERT_VALID( pToolBar );
  2031. bPaletteMode = pToolBar->m_bPaletteMode;
  2032. } // if( pToolBar != NULL )
  2033. switch( nHit )
  2034. {
  2035. case HTTOP:
  2036. case HTBOTTOM:
  2037. case HTLEFT:
  2038. case HTRIGHT:
  2039. if( bPaletteMode )
  2040. nHit = HTCAPTION;
  2041. break;
  2042. case HTTOPLEFT:
  2043. case HTTOPRIGHT:
  2044. nHit = bPaletteMode ? HTCAPTION : HTTOP;
  2045. break;
  2046. case HTBOTTOMLEFT:
  2047. case HTBOTTOMRIGHT:
  2048. nHit = bPaletteMode ? HTCAPTION : HTBOTTOM;
  2049. break;
  2050. } // switch( nHit )
  2051. } // if( pExtBar->IsFixedMode() )
  2052. } // if( pExtBar != NULL )
  2053. if( bNcRepaint )
  2054. // SendMessage( WM_NCPAINT );
  2055. PostMessage( WM_NCPAINT );
  2056. return nHit;
  2057. }
  2058. void CExtMiniDockFrameWnd::OnCancelMode() 
  2059. {
  2060. CMiniDockFrameWnd::OnCancelMode();
  2061. CExtPopupMenuWnd::CancelMenuTracking();
  2062. CWnd::CancelToolTips();
  2063. // ASSERT( ! CExtPopupMenuWnd::IsMenuTracking() );
  2064. if( _ResizingIsInProgress() )
  2065. _ResizingEnd();
  2066. }
  2067. void CExtMiniDockFrameWnd::OnPaint() 
  2068. {
  2069. CPaintDC dcPaint( this );
  2070. // return;
  2071. CRect rcClient;
  2072. GetClientRect( &rcClient );
  2073. if( rcClient.IsRectEmpty()
  2074. || (! dcPaint.RectVisible( &rcClient ) )
  2075. )
  2076. return;
  2077. CExtMemoryDC dc( &dcPaint, &rcClient );
  2078. CExtPaintManager::stat_ExcludeChildAreas(
  2079. dcPaint.GetSafeHdc(),
  2080. GetSafeHwnd()
  2081. );
  2082. if( (! PmBridge_GetPM()->GetCb2DbTransparentMode(this) )
  2083. || (! PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  2084. )
  2085. dc.FillSolidRect(
  2086. &rcClient,
  2087. PmBridge_GetPM()->GetColor(
  2088. CExtPaintManager::CLR_3DFACE_OUT,
  2089. this
  2090. )
  2091. );
  2092. }
  2093. __EXT_MFC_INT_PTR CExtMiniDockFrameWnd::OnToolHitTest(
  2094. CPoint point,
  2095. TOOLINFO * pTI
  2096. ) const
  2097. {
  2098. ASSERT_VALID( this );
  2099. if( pTI == NULL || m_wndToolTip.GetSafeHwnd() == NULL )
  2100. return -1;
  2101. const CControlBar * pBar = GetControlBar();
  2102. if( pBar == NULL )
  2103. return -1;
  2104. ASSERT_VALID( pBar );
  2105. if( (pBar->m_dwStyle & CBRS_TOOLTIPS) == NULL )
  2106. return -1;
  2107. __EXT_MFC_INT_PTR nRet = pBar->OnToolHitTest( point, pTI );
  2108. if( nRet < 0 )
  2109. return -1;
  2110. if( pTI->lpszText != NULL )
  2111. {
  2112. CExtMiniDockFrameWnd * pNCT = (CExtMiniDockFrameWnd *)this;
  2113. VERIFY(
  2114. pNCT->m_wndToolTip.AddTool(
  2115. pNCT,
  2116. pTI->lpszText,
  2117. &pTI->rect,
  2118. 1
  2119. )
  2120. );
  2121. }
  2122. return -1;
  2123. }
  2124. LRESULT CExtMiniDockFrameWnd::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  2125. {
  2126. switch( message)
  2127. {
  2128. case WM_DESTROY:
  2129. m_bHelperNcActive = false;
  2130. break;
  2131. case WM_PRINT:
  2132. case WM_PRINTCLIENT:
  2133. {
  2134. CDC * pDC = CDC::FromHandle( (HDC) wParam );
  2135. if( (lParam&PRF_NONCLIENT) != 0 )
  2136. RenderNC( *pDC );
  2137. if( (lParam&PRF_CHILDREN) != 0 )
  2138. CExtPaintManager::stat_PrintChildren(
  2139. m_hWnd,
  2140. message,
  2141. pDC->GetSafeHdc(),
  2142. lParam
  2143. );
  2144. }
  2145. return (!0);
  2146. } // switch( message)
  2147. LRESULT lResult = CMiniDockFrameWnd::WindowProc( message, wParam, lParam );
  2148. return lResult;
  2149. }
  2150. BOOL CExtMiniDockFrameWnd::PreTranslateMessage( MSG* pMsg ) 
  2151. {
  2152. if( m_wndToolTip.GetSafeHwnd() != NULL )
  2153. m_wndToolTip.RelayEvent( pMsg );
  2154. return CMiniDockFrameWnd::PreTranslateMessage( pMsg );
  2155. }
  2156. BOOL CExtMiniDockFrameWnd::PreCreateWindow(CREATESTRUCT& cs) 
  2157. {
  2158. if( ! RegisterMiniDockFrameWndClass() )
  2159. {
  2160. ASSERT( FALSE );
  2161. return FALSE;
  2162. }
  2163. cs.lpszClass = __EXT_MINIDOCKFRAMEWND_CLASS_NAME;
  2164. if( ! CMiniDockFrameWnd::PreCreateWindow( cs ) )
  2165. {
  2166. ASSERT( FALSE );
  2167. return FALSE;
  2168. }
  2169. cs.dwExStyle |= WS_EX_TOOLWINDOW;
  2170. cs.dwExStyle &= ~(WS_EX_LAYOUTRTL|WS_EX_RTLREADING);
  2171. return TRUE;
  2172. }
  2173. void CExtMiniDockFrameWnd::RecalcLayout(BOOL bNotify /* = TRUE */ )
  2174. {
  2175. if( GetSafeHwnd() == NULL || m_bInRecalcLayout )
  2176. return;
  2177. //CExtControlBar * pExtBar = GetControlBarExt();
  2178. // if( pExtBar != NULL
  2179. // && (! pExtBar->IsFixedMode() )
  2180. // )
  2181. // {
  2182. // if( (GetStyle() & __REMOVED_NONFIXMODE_STYLES) != 0 )
  2183. // ModifyStyle( __REMOVED_NONFIXMODE_STYLES, 0 );
  2184. // }
  2185. CMiniDockFrameWnd::RecalcLayout( bNotify );
  2186. if( GetSafeHwnd() != NULL )
  2187. SendMessage( WM_NCPAINT );
  2188. }
  2189. void CExtMiniDockFrameWnd::OnQueryNcMetrics(
  2190. INT & nResizingFrameDX,
  2191. INT & nResizingFrameDY,
  2192. INT & nCaptionDY
  2193. )
  2194. {
  2195. PmBridge_GetPM()->Bar_MiniDockFrameGetNcMetrics(
  2196. nResizingFrameDX,
  2197. nResizingFrameDY,
  2198. nCaptionDY,
  2199. this,
  2200. GetControlBarExt()
  2201. );
  2202. }
  2203. bool CExtMiniDockFrameWnd::g_bMiniDockFrameWndClassRegistered = false;
  2204. bool CExtMiniDockFrameWnd::RegisterMiniDockFrameWndClass()
  2205. {
  2206. if( g_bMiniDockFrameWndClassRegistered )
  2207. return true;
  2208. WNDCLASS _wndClassInfo;
  2209. HINSTANCE hInst = ::AfxGetInstanceHandle();
  2210. if( ! ::GetClassInfo( hInst, __EXT_MINIDOCKFRAMEWND_CLASS_NAME, &_wndClassInfo ) )
  2211. {
  2212. _wndClassInfo.style = CS_GLOBALCLASS|CS_DBLCLKS;
  2213. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  2214. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  2215. _wndClassInfo.hInstance = hInst;
  2216. _wndClassInfo.hIcon = NULL;
  2217. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  2218. ASSERT( _wndClassInfo.hCursor != NULL );
  2219. _wndClassInfo.hbrBackground = NULL; 
  2220. _wndClassInfo.lpszMenuName = NULL;
  2221. _wndClassInfo.lpszClassName = __EXT_MINIDOCKFRAMEWND_CLASS_NAME;
  2222. if( ! ::AfxRegisterClass( &_wndClassInfo ) )
  2223. {
  2224. ASSERT( FALSE );
  2225. //AfxThrowResourceException();
  2226. return false;
  2227. }
  2228. }
  2229. g_bMiniDockFrameWndClassRegistered = true;
  2230. return true;
  2231. }