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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #if (!defined __EXT_TEMPL_H)
  22. #define __EXT_TEMPL_H
  23. #if (!defined __EXT_MFC_DEF_H)
  24. #include <ExtMfcDef.h>
  25. #endif // __EXT_MFC_DEF_H
  26. #if (!defined __EXT_MEMORY_DC_H)
  27. #include <../Src/ExtMemoryDC.h>
  28. #endif
  29. #if (!defined __EXT_PAINT_MANAGER_H)
  30. #include <ExtPaintManager.h>
  31. #endif
  32. #if (!defined __EXT_POPUP_MENU_WND_H)
  33. #include <ExtPopupMenuWnd.h>
  34. #endif
  35. #if (!defined __EXT_TOOLCONTROLBAR_H)
  36. #include <ExtToolControlBar.h>
  37. #endif
  38. #if (!defined __EXT_CONTROLS_H)
  39. #include <ExtControls.h>
  40. #endif
  41. #if (!defined _AFX_NO_OCC_SUPPORT )
  42. #if (!defined __PROF_UIS_OCC_IMPL_INCLUDED )
  43. #define __PROF_UIS_OCC_IMPL_INCLUDED
  44. #if _MFC_VER < 0x700
  45. #if (!defined __PROF_UIS_AUTOMATION_PACK_IMPL__) && (!defined __PROF_SKIN_IMPL__)
  46. #include <../Src/occimpl.h>
  47. #define __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED
  48. #endif
  49. #else
  50. #include <ocdb.h>
  51. #include <afxocc.h>
  52. #include <../src/mfc/occimpl.h>
  53. #define __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED
  54. #endif
  55. #endif // (!defined __PROF_UIS_OCC_IMPL_INCLUDED )
  56. #endif // (!defined _AFX_NO_OCC_SUPPORT )
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CExtWFF template window extension (flicker free window)
  59. //
  60. // removes flicker effect caused by WM_ERASEBKGND or
  61. // non-buffered painting, useful for new win32 (not old win16)
  62. // common controls such as list-view or tree-view
  63. //
  64. template <
  65. class CExtWFFBase = CWnd,
  66. bool _bExludeChildAreas = true,
  67. bool _bEat_WM_ERASEBKGND = true,
  68. bool _bEmulate_WM_ERASEBKGND = true
  69. >
  70. class CExtWFF : public CExtWFFBase
  71. {
  72. protected:
  73. virtual LRESULT WindowProc( 
  74. UINT message, 
  75. WPARAM wParam, 
  76. LPARAM lParam
  77. )
  78. {
  79. switch( message )
  80. {
  81. case WM_ERASEBKGND:
  82. {
  83. bool bValEat_WM_ERASEBKGND = _bEat_WM_ERASEBKGND;
  84. if( bValEat_WM_ERASEBKGND )
  85. return FALSE;
  86. }
  87. break;
  88. case WM_PAINT:
  89. {
  90. CPaintDC dcPaint( this );
  91. bool bValExludeChildAreas = _bExludeChildAreas;
  92. if( bValExludeChildAreas )
  93. {
  94. CExtPaintManager::stat_ExcludeChildAreas(
  95. dcPaint.GetSafeHdc(),
  96. GetSafeHwnd()
  97. );
  98. }
  99. CRect rcClient;
  100. GetClientRect( &rcClient );
  101. CExtMemoryDC dc(
  102. &dcPaint,
  103. &rcClient
  104. );
  105. bool bValEmulate_WM_ERASEBKGND = _bEmulate_WM_ERASEBKGND;
  106. if( bValEmulate_WM_ERASEBKGND )
  107. DefWindowProc(
  108. WM_ERASEBKGND,
  109. WPARAM( dc.GetSafeHdc() ),
  110. LPARAM(0)
  111. );
  112. DefWindowProc(
  113. WM_PAINT,
  114. WPARAM( dc.GetSafeHdc() ),
  115. LPARAM(0)
  116. );
  117. }
  118. return TRUE;
  119. }
  120. return CExtWFFBase::WindowProc( message, wParam, lParam );
  121. }
  122. }; // class CExtWFF
  123. /////////////////////////////////////////////////////////////////////////////
  124. // CExtWRB template window extension (window in resizable bar)
  125. //
  126. // adds thin nonclient area border according to paint manager;
  127. // useful for windows inserted into resizable control bar
  128. //
  129. template <
  130. class CExtWRBBase = CWnd
  131. >
  132. class CExtWRB : public CExtWRBBase
  133. {
  134. public:
  135. virtual CExtPaintManager * PmBridge_GetPM() const
  136. {
  137. ASSERT_VALID( this );
  138. return g_PaintManager.GetPM();
  139. }
  140. protected:
  141. virtual LRESULT WindowProc( 
  142. UINT message, 
  143. WPARAM wParam, 
  144. LPARAM lParam
  145. )
  146. {
  147. switch( message )
  148. {
  149. case WM_NCCALCSIZE:
  150. {
  151. NCCALCSIZE_PARAMS * pNCCSP =
  152. reinterpret_cast < NCCALCSIZE_PARAMS * > ( lParam );
  153. ASSERT( pNCCSP != NULL );
  154. CRect rcInBarWnd( pNCCSP->rgrc[0] );
  155. rcInBarWnd.DeflateRect(
  156. 1, 1, 1, 1
  157. );
  158. ::CopyRect( &(pNCCSP->rgrc[0]), rcInBarWnd );
  159. return 0;
  160. } // case WM_NCCALCSIZE
  161. case WM_NCPAINT:
  162. {
  163. CRect rcInBarWnd, rcInBarClient;
  164. GetWindowRect( &rcInBarWnd );
  165. GetClientRect( &rcInBarClient );
  166. ClientToScreen( &rcInBarClient );
  167. if( rcInBarWnd == rcInBarClient )
  168. return 0;
  169. CPoint ptDevOffset = -rcInBarWnd.TopLeft();
  170. rcInBarWnd.OffsetRect( ptDevOffset );
  171. rcInBarClient.OffsetRect( ptDevOffset );
  172. CWindowDC dc( this );
  173. ASSERT( dc.GetSafeHdc() != NULL );
  174. dc.ExcludeClipRect( &rcInBarClient );
  175. PmBridge_GetPM()->PaintResizableBarChildNcAreaRect(
  176. dc,
  177. rcInBarWnd,
  178. this
  179. );
  180. return 0;
  181. } // case WM_NCPAINT
  182. } // switch( message )
  183. return CExtWRBBase::WindowProc( message, wParam, lParam );
  184. }
  185. }; // class CExtWRB
  186. /////////////////////////////////////////////////////////////////////////////
  187. // CExtWS template window extension (styled window)
  188. //
  189. // adds current PaintManager's background style,
  190. // load/save window position feature,
  191. // right-bottom resizing gripper (default is off)
  192. // and cool system menu for WS_POPUP windows
  193. //
  194. #ifdef GET_WM_CTLCOLOR_HDC
  195. #define __EXT_GET_WM_CTLCOLOR_HDC(wp,lp,msg) GET_WM_CTLCOLOR_HDC(wp,lp,msg)
  196. #else
  197. #define __EXT_GET_WM_CTLCOLOR_HDC(wp,lp,msg) (HDC)(wp)
  198. #endif
  199. #ifdef GET_WM_CTLCOLOR_HWND
  200. #define __EXT_GET_WM_CTLCOLOR_HWND(wp,lp,msg) GET_WM_CTLCOLOR_HWND(wp,lp,msg)
  201. #else
  202. #define __EXT_GET_WM_CTLCOLOR_HWND(wp,lp,msg) (HWND)(lp)
  203. #endif
  204. #ifdef GET_WM_CTLCOLOR_TYPE
  205. #define __EXT_GET_WM_CTLCOLOR_TYPE(wp,lp,msg) GET_WM_CTLCOLOR_TYPE(wp,lp,msg)
  206. #else
  207. #define __EXT_GET_WM_CTLCOLOR_TYPE(wp,lp,msg) (WORD)(msg - WM_CTLCOLORMSGBOX)
  208. #endif
  209. template <
  210. class CExtWSBase
  211. , UINT nIdTimerSysMenuTracking = UINT(301)
  212. >
  213. class CExtWS : public CExtWSBase
  214. {
  215. protected:
  216. CExtSafeString m_sSection; // section name and
  217. CExtSafeString m_sEntry;   // entry for save/restore
  218. bool m_bStyledWndInitDone : 1;
  219. bool m_bEnableSaveRestore : 1;
  220. bool m_bSysMenuTracking : 1;
  221. bool m_bShowResizingGripper : 1;
  222. bool m_bAutoSubclassChildControls : 1;
  223. COLORREF m_clrBackground;
  224. bool m_bGripperRTL : 1;
  225. public:
  226. CExtWSGripper m_wndGripper;
  227. CExtWS()
  228. : m_bStyledWndInitDone( false )
  229. , m_bSysMenuTracking( false )
  230. , m_bEnableSaveRestore( false )
  231. , m_bShowResizingGripper( false )
  232. , m_bAutoSubclassChildControls( false )
  233. , m_bGripperRTL( false )
  234. , m_clrBackground( COLORREF(-1L) )
  235. {
  236. }
  237. CExtWS(
  238. UINT nIDTemplate,
  239. CWnd * pParentWnd
  240. )
  241. : CExtWSBase( nIDTemplate, pParentWnd )
  242. , m_bStyledWndInitDone( false )
  243. , m_bSysMenuTracking( false )
  244. , m_bEnableSaveRestore( false )
  245. , m_bShowResizingGripper( false )
  246. , m_bAutoSubclassChildControls( false )
  247. , m_bGripperRTL( false )
  248. , m_clrBackground( COLORREF(-1L) )
  249. {
  250. }
  251. CExtWS(
  252. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  253. CWnd * pParentWnd
  254. )
  255. : CExtWSBase( lpszTemplateName, pParentWnd )
  256. , m_bStyledWndInitDone( false )
  257. , m_bSysMenuTracking( false )
  258. , m_bEnableSaveRestore( false )
  259. , m_bShowResizingGripper( false )
  260. , m_bAutoSubclassChildControls( false )
  261. , m_bGripperRTL( false )
  262. , m_clrBackground( COLORREF(-1L) )
  263. {
  264. }
  265. CExtWS(
  266. UINT nIDTemplate,
  267. UINT nIDCaption = 0
  268. )
  269. : CExtWSBase( nIDTemplate, nIDCaption )
  270. , m_bStyledWndInitDone( false )
  271. , m_bSysMenuTracking( false )
  272. , m_bEnableSaveRestore( false )
  273. , m_bShowResizingGripper( false )
  274. , m_bAutoSubclassChildControls( false )
  275. , m_bGripperRTL( false )
  276. , m_clrBackground( COLORREF(-1L) )
  277. {
  278. }
  279. CExtWS(
  280. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  281. UINT nIDCaption = 0
  282. )
  283. : CExtWSBase( lpszTemplateName, nIDCaption )
  284. , m_bStyledWndInitDone( false )
  285. , m_bSysMenuTracking( false )
  286. , m_bEnableSaveRestore( false )
  287. , m_bShowResizingGripper( false )
  288. , m_bAutoSubclassChildControls( false )
  289. , m_bGripperRTL( false )
  290. , m_clrBackground( COLORREF(-1L) )
  291. {
  292. }
  293. CExtWS(
  294. UINT nIDCaption,
  295. CWnd *pParentWnd,
  296. UINT iSelectPage
  297. )
  298. : CExtWSBase( nIDCaption, pParentWnd, iSelectPage )
  299. , m_bStyledWndInitDone( false )
  300. , m_bSysMenuTracking( false )
  301. , m_bEnableSaveRestore( false )
  302. , m_bShowResizingGripper( false )
  303. , m_bAutoSubclassChildControls( false )
  304. , m_bGripperRTL( false )
  305. , m_clrBackground( COLORREF(-1L) )
  306. {
  307. }
  308. CExtWS(
  309. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  310. CWnd *pParentWnd,
  311. UINT iSelectPage
  312. )
  313. : CExtWSBase( pszCaption, pParentWnd, iSelectPage )
  314. , m_bStyledWndInitDone( false )
  315. , m_bSysMenuTracking( false )
  316. , m_bEnableSaveRestore( false )
  317. , m_bShowResizingGripper( false )
  318. , m_bAutoSubclassChildControls( false )
  319. , m_bGripperRTL( false )
  320. , m_clrBackground( COLORREF(-1L) )
  321. {
  322. }
  323. virtual CExtPaintManager * PmBridge_GetPM() const
  324. {
  325. ASSERT_VALID( this );
  326. return g_PaintManager.GetPM();
  327. }
  328. COLORREF SetBkColor( COLORREF clrBk )
  329. {
  330. COLORREF clrBkOld = m_clrBackground;
  331. m_clrBackground = clrBk; 
  332. if( GetSafeHwnd() != NULL )
  333. {
  334. Invalidate();
  335. UpdateWindow();
  336. }
  337. return clrBkOld;
  338. }
  339. COLORREF GetBkColor() const
  340. {
  341. return m_clrBackground; 
  342. }
  343. void SetAutoSubclassChildControls( 
  344. bool bSet = true
  345. )
  346. {
  347. m_bAutoSubclassChildControls = bSet;
  348. }
  349. bool GetAutoSubclassChildControls() const
  350. {
  351. return m_bAutoSubclassChildControls;
  352. }
  353. void SubclassChildControls()
  354. {
  355. if( m_hWnd != NULL 
  356. && ::IsWindow( m_hWnd )
  357. )
  358. {
  359. ::SubclassChildControls( m_hWnd );
  360. //if( ::IsWindowVisible( m_hWnd ) )
  361. // RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN );
  362. }
  363. }
  364. virtual void ShowSizeGrip( BOOL bShow = TRUE )
  365. {
  366. bool _bShow = bShow ? true : false;
  367. if( m_bShowResizingGripper != _bShow )
  368. {
  369. m_bShowResizingGripper = _bShow;
  370. if( m_wndGripper.GetSafeHwnd() != NULL )
  371. {
  372. m_wndGripper.ShowWindow( 
  373. m_bShowResizingGripper ? SW_SHOW : SW_HIDE 
  374. );
  375. if( (!m_bShowResizingGripper)
  376. && m_hWnd != NULL
  377. && ::IsWindow( m_hWnd ) )
  378. {
  379. CRect rcGripper;
  380. m_wndGripper.GetWindowRect( &rcGripper );
  381. ScreenToClient( &rcGripper );
  382. InvalidateRect( &rcGripper );
  383. }
  384. }
  385. }
  386. }
  387. virtual void SaveWindowRect() const
  388. {
  389. VERIFY(
  390. CExtControlBar::stat_SaveWindowRect(
  391. GetSafeHwnd(),
  392. __EXT_MFC_SAFE_LPCTSTR( m_sSection ),
  393. __EXT_MFC_SAFE_LPCTSTR( m_sEntry )
  394. )
  395. );
  396. }
  397. virtual void LoadWindowRect(
  398. bool bForceHideWindow = false
  399. )
  400. {
  401. CExtControlBar::stat_LoadWindowRect(
  402. GetSafeHwnd(),
  403. __EXT_MFC_SAFE_LPCTSTR( m_sSection ),
  404. __EXT_MFC_SAFE_LPCTSTR( m_sEntry ),
  405. bForceHideWindow
  406. );
  407. }
  408. virtual void EnableSaveRestore(
  409. __EXT_MFC_SAFE_LPCTSTR pszSection,
  410. __EXT_MFC_SAFE_LPCTSTR pszEntry,
  411. bool bForceHideWindow = false
  412. )
  413. {
  414. m_sSection = pszSection;
  415. m_sEntry = pszEntry;
  416. m_bEnableSaveRestore = true;
  417. LoadWindowRect( bForceHideWindow );
  418. }
  419. virtual void DisableSaveRestore()
  420. {
  421. m_bEnableSaveRestore = false;
  422. }
  423. virtual BOOL _TrackWndSystemPopupMenu(
  424. CPoint * pPoint,
  425. BOOL bSelectAny
  426. )
  427. {
  428. if( (GetStyle() & WS_POPUP) == 0 )
  429. return FALSE;
  430. if( CExtPopupMenuWnd::IsMenuTracking() )
  431. CExtPopupMenuWnd::CancelMenuTracking();
  432. m_bSysMenuTracking = false;
  433. CMenu * pSysMenu =
  434. GetSystemMenu( FALSE );
  435. if( pSysMenu == NULL )
  436. return FALSE;
  437. ASSERT( ::IsMenu(pSysMenu->GetSafeHmenu()) );
  438. CExtPopupMenuWnd * pPopup =
  439. CExtPopupMenuWnd::InstantiatePopupMenu(
  440. GetSafeHwnd(),
  441. RUNTIME_CLASS(CExtPopupMenuWnd),
  442. this
  443. );
  444. if( ! pPopup->CreatePopupMenu( GetSafeHwnd() ) )
  445. {
  446. ASSERT( FALSE );
  447. delete pPopup;
  448. return FALSE;
  449. }
  450. if( ! pPopup->UpdateFromMenu(
  451. GetSafeHwnd(),
  452. pSysMenu,
  453. false
  454. )
  455. )
  456. {
  457. ASSERT( FALSE );
  458. delete pPopup;
  459. return FALSE;
  460. }
  461. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  462. bool bRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  463. CPoint point;
  464. if( pPoint != NULL)
  465. point = *pPoint;
  466. else
  467. {
  468. CRect rcWnd, rcClient, rcHelper;
  469. GetWindowRect( &rcWnd );
  470. GetClientRect( &rcClient );
  471. rcHelper = rcWnd;
  472. ScreenToClient( &rcHelper );
  473. ASSERT( rcHelper.top <= rcClient.top );
  474. int yDiff = rcClient.top - rcHelper.top;
  475. int n = 0;
  476. WINDOWPLACEMENT _wp;
  477. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  478. _wp.length = sizeof(WINDOWPLACEMENT);
  479. VERIFY(
  480. CExtControlBar::stat_GetWindowPlacement(
  481. GetSafeHwnd(),
  482. _wp
  483. )
  484. );
  485. if( _wp.showCmd != SW_SHOWMAXIMIZED ) 
  486. n = ::GetSystemMetrics( SM_CXFRAME );
  487. point = rcWnd.TopLeft();
  488. if( bRTL )
  489. {
  490. point = CPoint( rcWnd.right, rcWnd.top );
  491. n = -n;
  492. }
  493. point.x += n;
  494. point.y += yDiff;
  495. }
  496. DWORD dwTrackFlags = (bRTL ? TPMX_RIGHTALIGN : TPMX_TOPALIGN);
  497. if( bSelectAny )
  498. dwTrackFlags |= TPMX_SELECT_ANY;
  499. HWND hWndFocus = ::GetFocus();
  500. if( hWndFocus != NULL
  501. && (! ( hWndFocus == m_hWnd
  502. || ::IsChild( m_hWnd, hWndFocus )
  503. ) )
  504. )
  505. SetFocus();
  506. if( bRTL )
  507. point.x += pPopup->OnQueryMenuShadowSize();
  508. CRect rcExclude( point, point );
  509. m_bSysMenuTracking =
  510. pPopup->TrackPopupMenu(
  511. dwTrackFlags | TPMX_SYSMENU,
  512. point.x,point.y,
  513. rcExclude
  514. ) ? true : false;
  515. if( m_bSysMenuTracking )
  516. SetTimer( nIdTimerSysMenuTracking, 20, NULL );
  517. //else
  518. // delete pPopup;
  519. return m_bSysMenuTracking; //TRUE;
  520. }
  521. virtual BOOL PreTranslateMessage( MSG* pMsg )
  522. {
  523. if( GetSafeHwnd() != NULL
  524. && ::IsWindow( GetSafeHwnd() )
  525. && ( pMsg->message == WM_SYSKEYDOWN
  526. || pMsg->message == WM_SYSKEYUP
  527. || pMsg->message == WM_KEYDOWN
  528. //|| pMsg->message == WM_KEYUP
  529. )
  530. )
  531. {
  532. BOOL bSuccessRetVal = TRUE;
  533. if( ( GetStyle() & WS_POPUP ) == 0 )
  534. {
  535. //return FALSE;
  536. //return CExtWSBase::PreTranslateMessage(pMsg);
  537. bSuccessRetVal = FALSE;
  538. }
  539. bool bKeyUp =
  540. ( //pMsg->message == WM_KEYUP ||
  541. pMsg->message == WM_SYSKEYUP)
  542. ? true
  543. : false
  544. ;
  545. //BOOL bCtrl = GetKeyState(VK_CONTROL) & 0x80000000;
  546. //BOOL bShift = GetKeyState(VK_SHIFT) & 0x80000000;
  547. BOOL bAlt = HIWORD(pMsg->lParam) & KF_ALTDOWN;
  548. __EXT_MFC_SAFE_TCHAR vkTCHAR = (TCHAR)pMsg->wParam;
  549. if( bAlt && vkTCHAR == ((TCHAR)VK_SPACE) )
  550. {
  551. if( bKeyUp )
  552. return bSuccessRetVal; // TRUE;
  553. // allow child popup track it's system menu
  554. CWnd * pWnd = CWnd::GetActiveWindow();
  555. if( pWnd == NULL
  556. || (! ::IsWindow(pWnd->GetSafeHwnd()))
  557. )
  558. return bSuccessRetVal; // TRUE;
  559. if( pWnd->GetSafeHwnd() != GetSafeHwnd()
  560. && (pWnd->GetStyle() & WS_POPUP) != 0
  561. )
  562. return bSuccessRetVal; // TRUE;
  563. // track dialog system menu
  564. if( (GetStyle() & WS_POPUP) != 0
  565. && CExtWSBase::GetSystemMenu( FALSE ) != NULL
  566. )
  567. {
  568. VERIFY( _TrackWndSystemPopupMenu( NULL, TRUE ) );
  569. }
  570. return bSuccessRetVal; // TRUE;
  571. } // if( bAlt && vkTCHAR == ((TCHAR)VK_SPACE) )
  572. }
  573. return CExtWSBase::PreTranslateMessage(pMsg);
  574. }
  575. protected:
  576. virtual void _InitSizeGripper()
  577. {
  578. if( m_wndGripper.m_hWnd != NULL 
  579. && ::IsWindow( m_wndGripper.m_hWnd )
  580. )
  581. {
  582. m_wndGripper.DestroyWindow();
  583. m_wndGripper.m_hWnd = NULL;
  584. }
  585. CRect rcGripper;
  586. GetClientRect( &rcGripper );
  587. CSize szGripperSize = 
  588. PmBridge_GetPM()->GetResizingGriperSize( this );
  589. rcGripper.left = rcGripper.right - szGripperSize.cx;
  590. rcGripper.top = rcGripper.bottom - szGripperSize.cy;
  591. WNDCLASS _wndClassInfo;
  592. HINSTANCE hInst = ::AfxGetInstanceHandle();
  593. if( ! ::GetClassInfo(
  594. hInst,
  595. __EXT_SIZE_GRIPPER_CLASS_NAME,
  596. &_wndClassInfo
  597. )
  598. )
  599. {
  600. _wndClassInfo.style = CS_GLOBALCLASS|CS_DBLCLKS;
  601. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  602. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  603. _wndClassInfo.hInstance = hInst;
  604. _wndClassInfo.hIcon = NULL;
  605. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  606. ASSERT( _wndClassInfo.hCursor != NULL );
  607. _wndClassInfo.hbrBackground = NULL; 
  608. _wndClassInfo.lpszMenuName = NULL;
  609. _wndClassInfo.lpszClassName = __EXT_SIZE_GRIPPER_CLASS_NAME;
  610. if( !::AfxRegisterClass( & _wndClassInfo ) )
  611. {
  612. ASSERT( FALSE );
  613. return;
  614. }
  615. }
  616. if( ! m_wndGripper.Create(
  617. __EXT_SIZE_GRIPPER_CLASS_NAME, 
  618. NULL,
  619. WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
  620. rcGripper, 
  621. this, 
  622. UINT( __EXT_MFC_IDC_STATIC )
  623. )
  624. )
  625. return;
  626. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  627. m_bGripperRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  628. // show the sizing gripper only if it is really needed
  629. m_bShowResizingGripper = 
  630. ( ( GetStyle() & WS_THICKFRAME ) == WS_THICKFRAME )
  631. ? true
  632. : false;
  633. m_wndGripper.SetWindowPos(
  634. &CWnd::wndTop, 
  635. 0, 0, 
  636. 0, 0,
  637. SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED
  638. | ( m_bShowResizingGripper ? SWP_SHOWWINDOW : SWP_HIDEWINDOW )
  639. );
  640. }
  641. const AFX_MSGMAP_ENTRY * _FindMessageMapHandler(
  642. UINT nMsg, 
  643. UINT nCode, 
  644. UINT nID
  645. )
  646. {
  647. ASSERT_VALID( this );
  648. const AFX_MSGMAP * pMessageMap = GetMessageMap(); 
  649. if( pMessageMap != NULL )
  650. {
  651. UINT nEntry = 0;
  652. const AFX_MSGMAP_ENTRY * lpEntry = NULL;
  653. while( (lpEntry = (pMessageMap->lpEntries + nEntry))->nSig != AfxSig_end )
  654. {
  655. if( lpEntry->nMessage == nMsg 
  656. && lpEntry->nCode == nCode 
  657. && nID >= lpEntry->nID 
  658. && nID <= lpEntry->nLastID
  659. )
  660. return lpEntry;
  661. nEntry++;
  662. }
  663. } // if( pMessageMap != NULL )
  664. return NULL;
  665. }
  666. virtual LRESULT WindowProc(
  667. UINT message,
  668. WPARAM wParam,
  669. LPARAM lParam
  670. {
  671. if( ( message == WM_CREATE 
  672. && (!( IsKindOf( RUNTIME_CLASS(CDialog) )
  673. || IsKindOf( RUNTIME_CLASS(CPropertyPage) )
  674. || IsKindOf( RUNTIME_CLASS(CPropertySheet) )
  675. ))
  676. )
  677. || message == WM_INITDIALOG
  678. )
  679. {
  680. LRESULT lResult = CExtWSBase::WindowProc( message, wParam, lParam );
  681. _InitSizeGripper();
  682. if( m_bAutoSubclassChildControls )
  683. SubclassChildControls();
  684. return lResult;
  685. }
  686. if( message == WM_WINDOWPOSCHANGED )
  687. {
  688. LRESULT lResult = CExtWSBase::WindowProc( message, wParam, lParam );
  689. LPWINDOWPOS lpWindowPos = 
  690. reinterpret_cast < LPWINDOWPOS > (lParam);
  691. ASSERT( lpWindowPos != NULL );
  692. if( m_wndGripper.m_hWnd != NULL 
  693. && ::IsWindow( m_wndGripper.m_hWnd )
  694. )
  695. {
  696. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  697. bool bRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  698. if( m_bGripperRTL != bRTL )
  699. _InitSizeGripper();
  700. CRect rcClient;
  701. GetClientRect( &rcClient );
  702. CSize szGripperSize = 
  703. PmBridge_GetPM()->GetResizingGriperSize( this );
  704. m_wndGripper.SetWindowPos(
  705. NULL,
  706. rcClient.right - szGripperSize.cx,
  707. rcClient.bottom - szGripperSize.cy,
  708. 0, 
  709. 0,
  710. SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOACTIVATE
  711. );
  712. m_wndGripper.Invalidate();
  713. m_wndGripper.UpdateWindow();
  714. }
  715. if( (lpWindowPos->flags&SWP_NOSIZE) != 0 )
  716. return lResult;
  717. if( ::IsWindowVisible( m_hWnd ) 
  718. // - 2.64
  719. // && PmBridge_GetPM()->GetCb2DbTransparentMode( this )
  720. )
  721. {
  722. // if m_hWnd is dialog, then redraw all child controls
  723. bool bDlg = false;
  724. TCHAR strClassName[ _MAX_PATH + 1 ] = _T("");
  725. ::GetClassName( m_hWnd, strClassName, _MAX_PATH );
  726. if( _tcscmp( strClassName, _T("#32770") ) == 0 )
  727. bDlg = true;
  728. if( bDlg )
  729. {
  730. RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW| RDW_NOCHILDREN|RDW_NOFRAME );
  731. for( CWnd * pWnd = this->GetWindow(GW_CHILD); pWnd != NULL; pWnd = pWnd->GetWindow(GW_HWNDNEXT) )
  732. {
  733. if( (pWnd->GetStyle() & WS_VISIBLE) == 0 )
  734. continue;
  735. pWnd->RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_NOFRAME );
  736. }
  737. } // if( bDlg )
  738. }
  739. return lResult;
  740. } // if( message == WM_WINDOWPOSCHANGED )
  741. if( message == WM_PRINT 
  742. || message == WM_PRINTCLIENT
  743. )
  744. {
  745. CExtWSBase::WindowProc( message, wParam, lParam );
  746. CDC dc;
  747. dc.Attach( (HDC)wParam );
  748. CRect rcRgnWnd, rcRgnClient;
  749. GetWindowRect( &rcRgnWnd );
  750. GetClientRect( &rcRgnClient );
  751. if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  752. {
  753. CPoint ptVpOffset( 0, 0 );
  754. if( (lParam&PRF_NONCLIENT) != 0 )
  755. {
  756. CRect rcWnd = rcRgnWnd, rcClient = rcRgnClient;
  757. ClientToScreen( &rcClient );
  758. ptVpOffset.x = rcWnd.left - rcClient.left;
  759. ptVpOffset.y = rcWnd.top - rcClient.top;
  760. }
  761. if( ptVpOffset.x != 0
  762. || ptVpOffset.y != 0
  763. )
  764. dc.OffsetViewportOrg(
  765. -ptVpOffset.x,
  766. -ptVpOffset.y
  767. );
  768. for( CWnd * pWnd = GetWindow( GW_CHILD );
  769. pWnd != NULL && pWnd != this;
  770. pWnd = pWnd->GetWindow( GW_HWNDNEXT )
  771. )
  772. {
  773. if( (pWnd->GetStyle() & WS_VISIBLE) == 0 )
  774. continue;
  775. CRect rcChild;
  776. pWnd->GetWindowRect( &rcChild );
  777. ScreenToClient( &rcChild );
  778. dc.ExcludeClipRect( &rcChild );
  779. }
  780. COLORREF clrBackground = GetBkColor();
  781. bool bTransparent = false;
  782. if( PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  783. && ( clrBackground == COLORREF(-1L) )
  784. )
  785. {
  786. CExtPaintManager::stat_ExcludeChildAreas(
  787. dc,
  788. GetSafeHwnd(),
  789. CExtPaintManager::stat_DefExcludeChildAreaCallback
  790. );
  791. if( PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  792. bTransparent = true;
  793. }
  794. if( (! bTransparent)
  795. && clrBackground != COLORREF(-1L)
  796. )
  797. dc.FillSolidRect(
  798. &rcRgnClient,
  799. clrBackground
  800. );
  801. dc.SelectClipRgn( NULL );
  802. PmBridge_GetPM()->OnPaintSessionComplete( this );
  803. if( ptVpOffset.x != 0
  804. || ptVpOffset.y != 0
  805. )
  806. dc.OffsetViewportOrg(
  807. ptVpOffset.x,
  808. ptVpOffset.y
  809. );
  810. } // if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  811. if( (lParam&PRF_CHILDREN) != 0 )
  812. CExtPaintManager::stat_PrintChildren(
  813. m_hWnd,
  814. message,
  815. dc.GetSafeHdc(),
  816. lParam,
  817. false
  818. );
  819. dc.Detach();
  820. return (!0);
  821. }
  822. if( message == WM_PAINT )
  823. {
  824. ASSERT_VALID( this );
  825. bool bDlg = IsKindOf(RUNTIME_CLASS(CDialog)) ? true : false;
  826. if( !bDlg )
  827. {
  828. TCHAR strClassName[ _MAX_PATH + 1 ] = _T("");
  829. ::GetClassName( m_hWnd, strClassName, _MAX_PATH );
  830. __EXT_MFC_STRLWR( strClassName, _MAX_PATH + 1 );
  831. if( _tcsstr( strClassName, _T("#") ) != NULL )
  832. bDlg = true;
  833. }
  834. // look through the message map to see 
  835. // if this message is handled by user
  836. const AFX_MSGMAP_ENTRY * lpEntry = 
  837. _FindMessageMapHandler(
  838. message,
  839. 0, 0
  840. );
  841. bool bPainted = false;
  842. //if( !(bDlg && GetParent() == NULL) ) 
  843. if( !bDlg ) 
  844. {
  845. if( lpEntry != NULL )
  846. {
  847. // invoke the user defined message handler
  848. union 
  849. {
  850. AFX_PMSG pfn;
  851. void (AFX_MSG_CALL CCmdTarget::*pfn_COMMAND)();
  852. } mmf;
  853. mmf.pfn = lpEntry->pfn;
  854. (this->*mmf.pfn_COMMAND)();
  855. // return 0L;
  856. bPainted = true;
  857. } // if( lpEntry != NULL )
  858. }
  859. if( !bPainted )
  860. {
  861. CPaintDC dc( this );
  862. COLORREF clrBackground = GetBkColor();
  863. bool bTransparent = false;
  864. if( PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  865. && ( clrBackground == COLORREF(-1L) )
  866. )
  867. {
  868. CExtPaintManager::stat_ExcludeChildAreas(
  869. dc,
  870. GetSafeHwnd(),
  871. CExtPaintManager::stat_DefExcludeChildAreaCallback
  872. );
  873. if( PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  874. bTransparent = true;
  875. }
  876. if( (! bTransparent)
  877. && clrBackground != COLORREF(-1L)
  878. )
  879. {
  880. CRect rcClient;
  881. GetClientRect( &rcClient );
  882. dc.FillSolidRect(
  883. &rcClient,
  884. clrBackground
  885. );
  886. }
  887. PmBridge_GetPM()->OnPaintSessionComplete( this );
  888. }
  889. // if( bDlg && GetParent() == NULL ) 
  890. if( bDlg ) 
  891. {
  892. if( lpEntry != NULL )
  893. {
  894. // invoke the user defined message handler
  895. union 
  896. {
  897. AFX_PMSG pfn;
  898. void (AFX_MSG_CALL CCmdTarget::*pfn_COMMAND)();
  899. } mmf;
  900. mmf.pfn = lpEntry->pfn;
  901. (this->*mmf.pfn_COMMAND)();
  902. return 0L;
  903. } // if( lpEntry != NULL )
  904. }
  905. return 0L;
  906. } // if( message == WM_PAINT )
  907. if( message == WM_ERASEBKGND )
  908. {
  909. ASSERT_VALID( this );
  910. // look through the message map to see 
  911. // if this message is handled by user
  912. const AFX_MSGMAP_ENTRY * lpEntry = 
  913. _FindMessageMapHandler(
  914. message,
  915. 0, 0
  916. );
  917. if( lpEntry != NULL )
  918. {
  919. // invoke the user defined message handler
  920. union 
  921. {
  922. AFX_PMSG pfn;
  923. BOOL (AFX_MSG_CALL CWnd::*pfn_bD)( CDC* );
  924. } mmf;
  925. mmf.pfn = lpEntry->pfn;
  926. LRESULT lResult = 
  927. (this->*mmf.pfn_bD)( CDC::FromHandle( ( HDC ) wParam ) );
  928. return lResult;
  929. } // if( lpEntry != NULL )
  930. HDC hDC = reinterpret_cast < HDC > (wParam);
  931. ASSERT( hDC != NULL );
  932. HWND hWnd = ::WindowFromDC( hDC );
  933. if( hWnd != NULL
  934. && hWnd != m_hWnd
  935. )
  936. return CExtWSBase::WindowProc( message, wParam, lParam );
  937. if( (GetStyle() & WS_CLIPCHILDREN) != 0
  938. && PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  939. )
  940. return (!0L);
  941. // HDC hDC = reinterpret_cast < HDC > (wParam);
  942. // ASSERT( hDC != NULL );
  943. CExtPaintManager::stat_ExcludeChildAreas(
  944. hDC,
  945. GetSafeHwnd(),
  946. CExtPaintManager::stat_DefExcludeChildAreaCallback
  947. );
  948. return CExtWSBase::WindowProc( message, wParam, lParam );
  949. } // if( message == WM_ERASEBKGND )
  950. if( message >= WM_CTLCOLORMSGBOX && message <= WM_CTLCOLORSTATIC )
  951. {
  952. HBRUSH hBrush = (HBRUSH) CExtWSBase::WindowProc( message, wParam, lParam );
  953. HDC hDC = __EXT_GET_WM_CTLCOLOR_HDC( wParam, lParam, message );
  954. HWND hWnd = __EXT_GET_WM_CTLCOLOR_HWND( wParam, lParam, message );
  955. ASSERT( hWnd != NULL );
  956. INT nCtlColor = __EXT_GET_WM_CTLCOLOR_TYPE( wParam, lParam, message );
  957. if( nCtlColor == CTLCOLOR_DLG
  958. || nCtlColor == CTLCOLOR_STATIC
  959. || nCtlColor == CTLCOLOR_MSGBOX
  960. )
  961. {
  962. if( nCtlColor == CTLCOLOR_STATIC )
  963. {
  964. bool bDefaultProcessing = false;
  965. if( hWnd == NULL || (! ::IsWindow( hWnd ) ) )
  966. bDefaultProcessing = true;
  967. else
  968. {
  969. CExtSafeString sClassName;
  970. ::GetClassName( hWnd, LPTSTR( sClassName.GetBuffer( _MAX_PATH + 1 ) ), _MAX_PATH );
  971. sClassName.ReleaseBuffer();
  972. sClassName.MakeLower();
  973. if( sClassName != LPCTSTR( _T("static") ) )
  974. bDefaultProcessing = true;
  975. if( bDefaultProcessing )
  976. return (LRESULT)hBrush;
  977. } // else from if( hWnd == NULL || (! ::IsWindow(hWnd) ) )
  978. ::SetBkMode( hDC, TRANSPARENT );
  979. // (+ v.2.22) corrected by the Dmitry Yakovlev's advice
  980. if( (GetStyle()&WS_CHILD) != 0
  981. && PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  982. )
  983. return (LRESULT)::GetStockObject( NULL_BRUSH );
  984. }
  985. static CBrush brBackground;
  986. static COLORREF clrLast = (COLORREF)(-1L);
  987. COLORREF clrNew = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_3DFACE_OUT, this );
  988. if( clrLast != clrNew )
  989. {
  990. if( brBackground.GetSafeHandle() != NULL )
  991. brBackground.DeleteObject();
  992. }
  993. if( brBackground.GetSafeHandle() == NULL )
  994. {
  995. clrLast = clrNew;
  996. VERIFY( brBackground.CreateSolidBrush( clrLast ) );
  997. } // if( brBackground.GetSafeHandle() == NULL )
  998. return (LRESULT)brBackground.GetSafeHandle();
  999. }
  1000. return (LRESULT)hBrush;
  1001. } // if( message >= WM_CTLCOLORMSGBOX && message <= WM_CTLCOLORSTATIC )
  1002. if( message == WM_TIMER )
  1003. {
  1004. if( wParam == nIdTimerSysMenuTracking )
  1005. {
  1006. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  1007. {
  1008. m_bSysMenuTracking = false;
  1009. KillTimer( nIdTimerSysMenuTracking );
  1010. }
  1011. return 0;
  1012. }
  1013. return CExtWSBase::WindowProc( message, wParam, lParam );
  1014. } // if( message == WM_TIMER )
  1015. if( message == WM_DESTROY )
  1016. {
  1017. if( m_bEnableSaveRestore )
  1018. SaveWindowRect();
  1019. return CExtWSBase::WindowProc( message, wParam, lParam );
  1020. }
  1021. if( (message == WM_NCLBUTTONDOWN && wParam == HTSYSMENU)
  1022. || (message == WM_NCRBUTTONUP && (wParam == HTCAPTION || wParam == HTSYSMENU))
  1023. )
  1024. {
  1025. if( wParam == HTCAPTION )
  1026. {
  1027. CPoint point;
  1028. if( ::GetCursorPos( &point ) )
  1029. _TrackWndSystemPopupMenu(
  1030. &point,
  1031. FALSE
  1032. );
  1033. } // if( wParam == HTCAPTION )
  1034. else
  1035. {
  1036. _TrackWndSystemPopupMenu(
  1037. NULL,
  1038. FALSE
  1039. );
  1040. } // else if if( wParam == HTCAPTION )
  1041. return 0;
  1042. }
  1043. if( (message == WM_NCLBUTTONDOWN || message == WM_NCRBUTTONDOWN )
  1044. && wParam == HTSYSMENU
  1045. )
  1046. return 0;
  1047. if( (message == WM_NCLBUTTONDBLCLK )
  1048. && wParam == HTSYSMENU
  1049. )
  1050. CExtPopupMenuWnd::CancelMenuTracking();
  1051. if( message == WM_NCRBUTTONDOWN && wParam == HTCAPTION )
  1052. {
  1053. CPoint point;
  1054. if( ::GetCursorPos( &point ) )
  1055. _TrackWndSystemPopupMenu(
  1056. &point,
  1057. FALSE
  1058. );
  1059. return 0;
  1060. }
  1061. return CExtWSBase::WindowProc( message, wParam, lParam );
  1062. }
  1063. virtual void PostNcDestroy()
  1064. {
  1065. m_bStyledWndInitDone = false;
  1066. CExtWSBase::PostNcDestroy();
  1067. }
  1068. }; // class CExtWS
  1069. /////////////////////////////////////////////////////////////////////////////
  1070. // CExtWA template window extension
  1071. //
  1072. // adds child anchoring support to any window;
  1073. // anchoring idea by Paolo Messina, copyright provided:
  1074. //
  1075. //
  1076. // Copyright (C) 2000 by Paolo Messina
  1077. // (ppescher@yahoo.com)
  1078. //
  1079. const SIZE __RDA_NONE = {  -1,  -1 };
  1080. const SIZE __RDA_LT = {   0,   0 };
  1081. const SIZE __RDA_RT = { 100,   0 };
  1082. const SIZE __RDA_LB = {   0, 100 };
  1083. const SIZE __RDA_RB = { 100, 100 };
  1084. const SIZE __RDA_KEEP = __RDA_LT;
  1085. const SIZE __RDA_X = __RDA_RT;
  1086. const SIZE __RDA_Y = __RDA_LB;
  1087. const SIZE __RDA_XY = __RDA_RB;
  1088. const SIZE __RDA_BOTH = __RDA_RB;
  1089. template < class CExtWABase >
  1090. class CExtWA : public CExtWABase
  1091. {
  1092. protected:
  1093. bool m_bAnchoringInitDone : 1;
  1094. bool m_bUseMaxTrack : 1;
  1095. bool m_bUseMinTrack : 1;
  1096. bool m_bUseMaxRect : 1;
  1097. CPoint m_ptMinTrackSize; // min tracking size
  1098. CPoint m_ptMaxTrackSize; // max tracking size
  1099. CPoint m_ptMaxPos; // maximized position
  1100. CPoint m_ptMaxSize; // maximized size
  1101. struct RDI_t
  1102. {
  1103. // upper-left corner
  1104. SIZE m_AnchLT;
  1105. SIZE m_MargLT;
  1106. // bottom-right corner
  1107. SIZE m_AnchRB;
  1108. SIZE m_MargRB;
  1109. RDI_t(
  1110. SIZE AnchLT = __RDA_LT,
  1111. SIZE MargLT = CSize(0,0), 
  1112. SIZE AnchRB = __RDA_LT,
  1113. SIZE MargRB = CSize(0,0)
  1114. )
  1115. : m_AnchLT( AnchLT )
  1116. , m_MargLT( MargLT )
  1117. , m_AnchRB( AnchRB )
  1118. , m_MargRB( MargRB )
  1119. {
  1120. }
  1121. RDI_t(
  1122. const RDI_t & other
  1123. )
  1124. : m_AnchLT( other.m_AnchLT )
  1125. , m_MargLT( other.m_MargLT )
  1126. , m_AnchRB( other.m_AnchRB )
  1127. , m_MargRB( other.m_MargRB )
  1128. {
  1129. }
  1130. RDI_t & operator = (
  1131. const RDI_t & other
  1132. )
  1133. {
  1134. m_AnchLT = other.m_AnchLT;
  1135. m_MargLT = other.m_MargLT;
  1136. m_AnchRB = other.m_AnchRB;
  1137. m_MargRB = other.m_MargRB;
  1138. return *this;
  1139. }
  1140. }; // struct RDI_t
  1141. // map of repositionable controls
  1142. CMap < HWND, HWND, RDI_t, RDI_t > m_mapRDI;
  1143. public:
  1144. CExtWA()
  1145. : m_bAnchoringInitDone( false )
  1146. , m_bUseMinTrack( false )
  1147. , m_bUseMaxTrack( false )
  1148. , m_bUseMaxRect( false )
  1149. , m_ptMinTrackSize( 0, 0 )
  1150. , m_ptMaxTrackSize( 0, 0 )
  1151. , m_ptMaxPos( 0, 0 )
  1152. , m_ptMaxSize( 0, 0 )
  1153. {
  1154. }
  1155. CExtWA(
  1156. UINT nIDTemplate,
  1157. CWnd * pParentWnd
  1158. )
  1159. : CExtWABase( nIDTemplate, pParentWnd )
  1160. , m_bAnchoringInitDone( false )
  1161. , m_bUseMinTrack( false )
  1162. , m_bUseMaxTrack( false )
  1163. , m_bUseMaxRect( false )
  1164. , m_ptMinTrackSize( 0, 0 )
  1165. , m_ptMaxTrackSize( 0, 0 )
  1166. , m_ptMaxPos( 0, 0 )
  1167. , m_ptMaxSize( 0, 0 )
  1168. {
  1169. }
  1170. CExtWA(
  1171. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1172. CWnd * pParentWnd
  1173. )
  1174. : CExtWABase( lpszTemplateName, pParentWnd )
  1175. , m_bAnchoringInitDone( false )
  1176. , m_bUseMinTrack( false )
  1177. , m_bUseMaxTrack( false )
  1178. , m_bUseMaxRect( false )
  1179. , m_ptMinTrackSize( 0, 0 )
  1180. , m_ptMaxTrackSize( 0, 0 )
  1181. , m_ptMaxPos( 0, 0 )
  1182. , m_ptMaxSize( 0, 0 )
  1183. {
  1184. }
  1185. CExtWA(
  1186. UINT nIDTemplate,
  1187. UINT nIDCaption = 0
  1188. )
  1189. : CExtWABase( nIDTemplate, nIDCaption )
  1190. , m_bAnchoringInitDone( false )
  1191. , m_bUseMinTrack( false )
  1192. , m_bUseMaxTrack( false )
  1193. , m_bUseMaxRect( false )
  1194. , m_ptMinTrackSize( 0, 0 )
  1195. , m_ptMaxTrackSize( 0, 0 )
  1196. , m_ptMaxPos( 0, 0 )
  1197. , m_ptMaxSize( 0, 0 )
  1198. {
  1199. }
  1200. CExtWA(
  1201. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1202. UINT nIDCaption = 0
  1203. )
  1204. : CExtWABase( lpszTemplateName, nIDCaption )
  1205. , m_bAnchoringInitDone( false )
  1206. , m_bUseMinTrack( false )
  1207. , m_bUseMaxTrack( false )
  1208. , m_bUseMaxRect( false )
  1209. , m_ptMinTrackSize( 0, 0 )
  1210. , m_ptMaxTrackSize( 0, 0 )
  1211. , m_ptMaxPos( 0, 0 )
  1212. , m_ptMaxSize( 0, 0 )
  1213. {
  1214. }
  1215. CExtWA(
  1216. UINT nIDCaption,
  1217. CWnd *pParentWnd,
  1218. UINT iSelectPage
  1219. )
  1220. : CExtWABase( nIDCaption, pParentWnd, iSelectPage )
  1221. , m_bAnchoringInitDone( false )
  1222. , m_bUseMinTrack( false )
  1223. , m_bUseMaxTrack( false )
  1224. , m_bUseMaxRect( false )
  1225. , m_ptMinTrackSize( 0, 0 )
  1226. , m_ptMaxTrackSize( 0, 0 )
  1227. , m_ptMaxPos( 0, 0 )
  1228. , m_ptMaxSize( 0, 0 )
  1229. {
  1230. }
  1231. CExtWA(
  1232. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  1233. CWnd *pParentWnd,
  1234. UINT iSelectPage
  1235. )
  1236. : CExtWABase( pszCaption, pParentWnd, iSelectPage )
  1237. , m_bAnchoringInitDone( false )
  1238. , m_bUseMinTrack( false )
  1239. , m_bUseMaxTrack( false )
  1240. , m_bUseMaxRect( false )
  1241. , m_ptMinTrackSize( 0, 0 )
  1242. , m_ptMaxTrackSize( 0, 0 )
  1243. , m_ptMaxPos( 0, 0 )
  1244. , m_ptMaxSize( 0, 0 )
  1245. {
  1246. }
  1247. virtual ~CExtWA()
  1248. {
  1249. RemoveAllAnchors();
  1250. }
  1251. virtual CExtPaintManager * PmBridge_GetPM() const
  1252. {
  1253. ASSERT_VALID( this );
  1254. return g_PaintManager.GetPM();
  1255. }
  1256. bool RemoveAnchor(
  1257. UINT nDlgCtrlID
  1258. )
  1259. {
  1260. if( GetSafeHwnd() == NULL
  1261. || (! ::IsWindow(GetSafeHwnd()) )
  1262. )
  1263. {
  1264. ASSERT( FALSE );
  1265. return false;
  1266. }
  1267. HWND hWnd = NULL;
  1268. #if (defined __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED)
  1269. if( m_pCtrlCont != NULL )
  1270. m_pCtrlCont->GetDlgItem( nDlgCtrlID, &hWnd );
  1271. else
  1272. #endif // (defined __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED)
  1273. hWnd = ::GetDlgItem( GetSafeHwnd(), nDlgCtrlID );
  1274. if( hWnd == NULL
  1275. || (! ::IsWindow(hWnd) )
  1276. )
  1277. {
  1278. ASSERT( FALSE );
  1279. return false;
  1280. }
  1281. return RemoveAnchor( hWnd );
  1282. }
  1283. bool RemoveAnchor(
  1284. HWND hWnd
  1285. )
  1286. {
  1287. bool bRetVal =
  1288. m_mapRDI.RemoveKey( hWnd ) ? true : false;
  1289. return bRetVal;
  1290. }
  1291. void RemoveAllAnchors()
  1292. {
  1293. m_mapRDI.RemoveAll();
  1294. }
  1295. bool AddAnchor(
  1296. UINT nDlgCtrlID,
  1297. const CRect & rcAnch
  1298. )
  1299. {
  1300. if( GetSafeHwnd() == NULL
  1301. || (! ::IsWindow(GetSafeHwnd()) )
  1302. )
  1303. {
  1304. ASSERT( FALSE );
  1305. return false;
  1306. }
  1307. HWND hWnd = NULL;
  1308. #if (defined __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED)
  1309. if( m_pCtrlCont != NULL )
  1310. m_pCtrlCont->GetDlgItem( nDlgCtrlID, &hWnd );
  1311. else
  1312. #endif // (defined __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED)
  1313. hWnd = ::GetDlgItem( GetSafeHwnd(), nDlgCtrlID );
  1314. if( hWnd == NULL
  1315. || (! ::IsWindow(hWnd) )
  1316. )
  1317. {
  1318. ASSERT( FALSE );
  1319. return false;
  1320. }
  1321. return AddAnchor( hWnd, rcAnch );
  1322. }
  1323. bool AddAnchor(
  1324. HWND hWnd,
  1325. const CRect & rcAnch
  1326. )
  1327. {
  1328. if( GetSafeHwnd() == NULL
  1329. || (! ::IsWindow( GetSafeHwnd() ) )
  1330. )
  1331. {
  1332. ASSERT( FALSE );
  1333. return false;
  1334. }
  1335. return
  1336. AddAnchor(
  1337. hWnd,
  1338. CSize( rcAnch.left, rcAnch.top ),
  1339. CSize( rcAnch.right, rcAnch.bottom )
  1340. );
  1341. }
  1342. bool AddAnchor(
  1343. UINT nDlgCtrlID,
  1344. CSize AnchLT,
  1345. CSize AnchRB = __RDA_NONE
  1346. )
  1347. {
  1348. if( AnchLT == __RDA_NONE
  1349. || GetSafeHwnd() == NULL
  1350. || (! ::IsWindow( GetSafeHwnd() ) )
  1351. )
  1352. {
  1353. ASSERT( FALSE );
  1354. return false;
  1355. }
  1356. HWND hWnd = NULL;
  1357. #if (defined __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED)
  1358. if( m_pCtrlCont != NULL )
  1359. m_pCtrlCont->GetDlgItem( nDlgCtrlID, &hWnd );
  1360. else
  1361. #endif // (defined __EXT_TEMPL_OCC_SUPPORT_IMPLEMENTED)
  1362. hWnd = ::GetDlgItem( GetSafeHwnd(), nDlgCtrlID );
  1363. if( hWnd == NULL
  1364. || (! ::IsWindow(hWnd) )
  1365. )
  1366. {
  1367. ASSERT( FALSE );
  1368. return false;
  1369. }
  1370. return AddAnchor( hWnd, AnchLT, AnchRB );
  1371. }
  1372. virtual bool AddAnchor(
  1373. HWND hWnd,
  1374. CSize AnchLT,
  1375. CSize AnchRB = __RDA_NONE
  1376. )
  1377. {
  1378. if( AnchLT == __RDA_NONE
  1379. || GetSafeHwnd() == NULL
  1380. || (! ::IsWindow( GetSafeHwnd() ) )
  1381. || (! ::IsWindow( hWnd ) )
  1382. || (! ::IsChild( GetSafeHwnd(), hWnd ) )
  1383. )
  1384. {
  1385. ASSERT( FALSE );
  1386. return false;
  1387. }
  1388. CRect rcClient, rcItem;
  1389. GetClientRect( &rcClient );
  1390. int cx = rcClient.Width();
  1391. int cy = rcClient.Height();
  1392. ::GetWindowRect( hWnd, &rcItem );
  1393. ScreenToClient( &rcItem );
  1394. CSize MargLT, MargRB;
  1395. if( AnchRB == __RDA_NONE )
  1396. AnchRB = AnchLT;
  1397. MargLT.cx = rcItem.left - cx*AnchLT.cx/100;
  1398. MargLT.cy = rcItem.top - cy*AnchLT.cy/100;
  1399. MargRB.cx = rcItem.right - cx*AnchRB.cx/100;
  1400. MargRB.cy = rcItem.bottom - cy*AnchRB.cy/100;
  1401. m_mapRDI.SetAt(
  1402. hWnd,
  1403. RDI_t( AnchLT, MargLT, AnchRB, MargRB )
  1404. );
  1405. return true;
  1406. }
  1407. virtual void ArrangeLayout(
  1408. int cx = -1,
  1409. int cy = -1
  1410. )
  1411. {
  1412. INT nCount = INT( m_mapRDI.GetCount() );
  1413. if( nCount <= 0 )
  1414. return;
  1415. if( cx < 0 || cy < 0 )
  1416. {
  1417. CRect rcClient;
  1418. GetClientRect( &rcClient );
  1419. cx = rcClient.Width();
  1420. cy = rcClient.Height();
  1421. } // if( cx < 0 || cy < 0 )
  1422. HDWP _hDWP = ::BeginDeferWindowPos( nCount );
  1423. ASSERT( _hDWP != NULL );
  1424. CList < HWND, HWND > listInvalidHWNDs;
  1425. POSITION pos = m_mapRDI.GetStartPosition();
  1426. for( ; pos != NULL; )
  1427. {
  1428. HWND _hWnd;
  1429. RDI_t _rdi;
  1430. m_mapRDI.GetNextAssoc( pos, _hWnd, _rdi );
  1431. if( ! ::IsWindow( _hWnd ) )
  1432. {
  1433. listInvalidHWNDs.AddTail(_hWnd);
  1434. continue;
  1435. }
  1436. int x  = _rdi.m_MargLT.cx + ::MulDiv(cx,_rdi.m_AnchLT.cx,100);
  1437. int y  = _rdi.m_MargLT.cy + ::MulDiv(cy,_rdi.m_AnchLT.cy,100);
  1438. int dx = _rdi.m_MargRB.cx + ::MulDiv(cx,_rdi.m_AnchRB.cx,100) - x;
  1439. int dy = _rdi.m_MargRB.cy + ::MulDiv(cy,_rdi.m_AnchRB.cy,100) - y;
  1440. RECT rcWnd;
  1441. ::GetWindowRect( _hWnd, &rcWnd );
  1442. ::ScreenToClient( m_hWnd, ((LPPOINT)(&rcWnd))+0 );
  1443. ::ScreenToClient( m_hWnd, ((LPPOINT)(&rcWnd))+1 );
  1444. UINT uFlags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER;
  1445. if( rcWnd.left == x
  1446. && rcWnd.top == y
  1447. )
  1448. uFlags |= SWP_NOMOVE;
  1449. if( (rcWnd.right - rcWnd.left) == dx
  1450. && (rcWnd.bottom - rcWnd.top) == dy
  1451. )
  1452. uFlags |= SWP_NOSIZE;
  1453. if( (uFlags&SWP_NOMOVE) != 0
  1454. && (uFlags&SWP_NOSIZE) != 0
  1455. )
  1456. continue;
  1457. _hDWP =
  1458. ::DeferWindowPos(
  1459. _hDWP, _hWnd, NULL, 
  1460. x, y, 
  1461. dx, dy,
  1462. uFlags
  1463. );
  1464. ASSERT( _hDWP != NULL );
  1465. } // for( ; pos != NULL; )
  1466. VERIFY( ::EndDeferWindowPos( _hDWP ) );
  1467. if( listInvalidHWNDs.GetCount() > 0 )
  1468. {
  1469. pos = listInvalidHWNDs.GetHeadPosition();
  1470. for( ; pos != NULL; )
  1471. {
  1472. HWND hWnd = listInvalidHWNDs.GetNext(pos);
  1473. m_mapRDI.RemoveKey( hWnd );
  1474. } // for( ; pos != NULL; )
  1475. } // if( listInvalidHWNDs.GetCount() > 0 )
  1476. if( (m_nFlags&WF_OLECTLCONTAINER) != 0 )
  1477. {
  1478. for( pos = m_mapRDI.GetStartPosition(); pos != NULL; )
  1479. {
  1480. HWND _hWnd;
  1481. RDI_t _rdi;
  1482. m_mapRDI.GetNextAssoc( pos, _hWnd, _rdi );
  1483. ASSERT( ::IsWindow( _hWnd ) );
  1484. if( ! ::IsWindow( _hWnd ) )
  1485. continue;
  1486. CWnd * pWnd = CWnd::FromHandlePermanent( _hWnd );
  1487. if( pWnd == NULL )
  1488. continue;
  1489. LPUNKNOWN pUnknown = pWnd->GetControlUnknown();
  1490. if( pUnknown != NULL )
  1491. {
  1492. IOleObject * pOleObject = NULL;
  1493. HRESULT hr =
  1494. pUnknown->QueryInterface(
  1495. __uuidof(IOleObject),
  1496. (LPVOID*)(&pOleObject)
  1497. );
  1498. if( hr == S_OK )
  1499. {
  1500. ASSERT( pOleObject != NULL );
  1501. IOleInPlaceObject * pOleInPlaceObject = NULL;
  1502. hr =
  1503. pUnknown->QueryInterface(
  1504. __uuidof(IOleInPlaceObject),
  1505. (LPVOID*)(&pOleInPlaceObject)
  1506. );
  1507. if( hr == S_OK )
  1508. {
  1509. ASSERT( pOleInPlaceObject != NULL );
  1510. CRect rcClient;
  1511. GetClientRect( &rcClient );
  1512. CRect rc;
  1513. pWnd->GetWindowRect( &rc );
  1514. ScreenToClient( &rc );
  1515. SIZEL _sizeL;
  1516. _sizeL.cx = rc.Width();
  1517. _sizeL.cy = rc.Height();
  1518. CClientDC dc(pWnd);
  1519. dc.DPtoHIMETRIC(&_sizeL);
  1520. hr = pOleObject->SetExtent( DVASPECT_CONTENT, &_sizeL );
  1521.   ASSERT( SUCCEEDED( hr ) );
  1522. hr;
  1523. hr = pOleInPlaceObject->SetObjectRects( &rc, &rcClient );
  1524.   ASSERT( SUCCEEDED( hr ) );
  1525. hr;
  1526. IOleClientSite * pOleClientSite = NULL;
  1527. hr = pOleObject->GetClientSite( &pOleClientSite );
  1528. if( hr == S_OK )
  1529. { // ActiveX resizing fix by Jean-Yves Tremblay
  1530. ASSERT( pOleClientSite != NULL );
  1531. IOleInPlaceSite * pOleInPlaceSite = NULL;
  1532. hr = pOleClientSite->QueryInterface( __uuidof(IOleInPlaceSite), (LPVOID*)(&pOleInPlaceSite) );
  1533. if( hr == S_OK )
  1534. {
  1535. ASSERT( pOleInPlaceSite != NULL );
  1536. hr = pOleInPlaceSite->OnPosRectChange( &rc );
  1537. ASSERT( SUCCEEDED( hr ) );
  1538. pOleInPlaceSite->Release();
  1539. }
  1540. pOleClientSite->Release();
  1541. } // ActiveX resizing fix by Jean-Yves Tremblay
  1542. pOleInPlaceObject->Release();
  1543. } // if( hr == S_OK )
  1544. pOleObject->Release();
  1545. } // if( hr == S_OK )
  1546. } // if( pUnknown != NULL )
  1547. } // for( pos = m_mapRDI.GetStartPosition(); pos != NULL; )
  1548. } // if( (m_nFlags&WF_OLECTLCONTAINER) != 0 )
  1549. }
  1550. void SetMaximizedRect(const CRect& rc)
  1551. {
  1552. m_bUseMaxRect = true;
  1553. m_ptMaxPos = rc.TopLeft();
  1554. m_ptMaxSize.x = rc.Width();
  1555. m_ptMaxSize.y = rc.Height();
  1556. }
  1557. void ResetMaximizedRect()
  1558. {
  1559. m_bUseMaxRect = false;
  1560. }
  1561. void SetMinTrackSize(const CSize& size)
  1562. {
  1563. m_bUseMinTrack = true;
  1564. m_ptMinTrackSize.x = size.cx;
  1565. m_ptMinTrackSize.y = size.cy;
  1566. }
  1567. void ResetMinTrackSize()
  1568. {
  1569. m_bUseMinTrack = false;
  1570. }
  1571. void SetMaxTrackSize(const CSize& size)
  1572. {
  1573. m_bUseMaxTrack = true;
  1574. m_ptMaxTrackSize.x = size.cx;
  1575. m_ptMaxTrackSize.y = size.cy;
  1576. }
  1577. void ResetMaxTrackSize()
  1578. {
  1579. m_bUseMaxTrack = false;
  1580. }
  1581. protected:
  1582. virtual bool NcFrameImpl_GetMinMaxInfo(
  1583. LPMINMAXINFO pMMI
  1584. ) const
  1585. {
  1586. if( m_bUseMinTrack )
  1587. pMMI->ptMinTrackSize = m_ptMinTrackSize;
  1588. if( m_bUseMaxTrack )
  1589. pMMI->ptMaxTrackSize = m_ptMaxTrackSize;
  1590. if( m_bUseMaxRect )
  1591. {
  1592. pMMI->ptMaxPosition = m_ptMaxPos;
  1593. pMMI->ptMaxSize = m_ptMaxSize;
  1594. }
  1595. return true;
  1596. }
  1597. virtual LRESULT WindowProc(
  1598. UINT message,
  1599. WPARAM wParam,
  1600. LPARAM lParam
  1601. {
  1602. if( message == WM_GETMINMAXINFO )
  1603. {
  1604. if( ! m_bAnchoringInitDone )
  1605. return 0;
  1606. LPMINMAXINFO pMMI =
  1607. reinterpret_cast < LPMINMAXINFO > ( lParam );
  1608. NcFrameImpl_GetMinMaxInfo( pMMI );
  1609. return 0;
  1610. } // if( message == WM_GETMINMAXINFO )
  1611. if( message == WM_SIZE )
  1612. {
  1613. LRESULT lResult = CExtWABase::WindowProc( message, wParam, lParam );
  1614. if( wParam == SIZE_MINIMIZED )
  1615. return lResult;
  1616. if( ! m_bAnchoringInitDone )
  1617. {
  1618. // gets the template size as the min track size
  1619. CRect rc;
  1620. GetWindowRect( &rc );
  1621. m_ptMinTrackSize.x = rc.Width();
  1622. m_ptMinTrackSize.y = rc.Height();
  1623. m_bUseMinTrack = true;
  1624. m_bAnchoringInitDone = true;
  1625. ArrangeLayout();
  1626. return lResult;
  1627. } // if( !m_bAnchoringInitDone )
  1628. if( wParam == SIZE_MAXHIDE || wParam == SIZE_MAXSHOW )
  1629. return lResult; // arrangement not needed
  1630. if( m_bAnchoringInitDone )
  1631. ArrangeLayout( LOWORD(lParam), HIWORD(lParam) );
  1632. return lResult;
  1633. } // if( message == WM_SIZE )
  1634. CWnd * pWndThis = this;
  1635. HWND hWndOwn = m_hWnd;
  1636. LRESULT lResult =
  1637. CExtWABase::WindowProc(message, wParam, lParam);
  1638. if( message == WM_DESTROY
  1639. || message == WM_NCDESTROY
  1640. )
  1641. {
  1642. if( hWndOwn != NULL
  1643. && ::IsWindow( hWndOwn )
  1644. && CWnd::FromHandlePermanent( hWndOwn ) == pWndThis
  1645. )
  1646. RemoveAllAnchors();
  1647. }
  1648. return lResult;
  1649. }
  1650. }; // class CExtWA
  1651. /////////////////////////////////////////////////////////////////////////////
  1652. // CExtADLG template adaptor for CDialog
  1653. template < class CExtADLGBase >
  1654. class CExtADLG : public CExtADLGBase
  1655. {
  1656. public:
  1657. CExtADLG()
  1658. {
  1659. }
  1660. CExtADLG(
  1661. UINT nIDTemplate,
  1662. CWnd * pParentWnd
  1663. )
  1664. : CExtADLGBase( nIDTemplate, pParentWnd )
  1665. {
  1666. }
  1667. CExtADLG(
  1668. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1669. CWnd * pParentWnd
  1670. )
  1671. : CExtADLGBase( lpszTemplateName, pParentWnd )
  1672. {
  1673. }
  1674. CExtADLG(
  1675. UINT nIDTemplate,
  1676. UINT nIDCaption = 0
  1677. )
  1678. {
  1679. // no such constructor in CDialog
  1680. nIDTemplate;
  1681. nIDCaption;
  1682. ASSERT( FALSE );
  1683. }
  1684. CExtADLG(
  1685. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1686. UINT nIDCaption = 0
  1687. )
  1688. {
  1689. // no such constructor in CDialog
  1690. lpszTemplateName;
  1691. nIDCaption;
  1692. ASSERT( FALSE );
  1693. }
  1694. CExtADLG(
  1695. UINT nIDCaption,
  1696. CWnd *pParentWnd,
  1697. UINT iSelectPage
  1698. )
  1699. {
  1700. // no such constructor in CDialog
  1701. nIDCaption;
  1702. pParentWnd;
  1703. iSelectPage;
  1704. ASSERT( FALSE );
  1705. }
  1706. CExtADLG(
  1707. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  1708. CWnd *pParentWnd,
  1709. UINT iSelectPage
  1710. )
  1711. {
  1712. // no such constructor in CDialog
  1713. pszCaption;
  1714. pParentWnd;
  1715. iSelectPage;
  1716. ASSERT( FALSE );
  1717. }
  1718. }; // class CExtADLG
  1719. /////////////////////////////////////////////////////////////////////////////
  1720. // CExtAPSH template adaptor for CPropertySheet
  1721. template < class CExtAPSHBase >
  1722. class CExtAPSH : public CExtAPSHBase
  1723. {
  1724. public:
  1725. CExtAPSH()
  1726. {
  1727. }
  1728. CExtAPSH(
  1729. UINT nIDTemplate,
  1730. CWnd * pParentWnd
  1731. )
  1732. {
  1733. // no such constructor in CPropertySheet
  1734. nIDTemplate;
  1735. pParentWnd;
  1736. ASSERT( FALSE );
  1737. }
  1738. CExtAPSH(
  1739. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1740. CWnd * pParentWnd
  1741. )
  1742. {
  1743. // no such constructor in CPropertySheet
  1744. lpszTemplateName;
  1745. pParentWnd;
  1746. ASSERT( FALSE );
  1747. }
  1748. CExtAPSH(
  1749. UINT nIDTemplate,
  1750. UINT nIDCaption = 0
  1751. )
  1752. {
  1753. // no such constructor in CPropertySheet
  1754. nIDTemplate;
  1755. nIDCaption;
  1756. ASSERT( FALSE );
  1757. }
  1758. CExtAPSH(
  1759. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1760. UINT nIDCaption = 0
  1761. )
  1762. {
  1763. // no such constructor in CPropertySheet
  1764. lpszTemplateName;
  1765. nIDCaption;
  1766. ASSERT( FALSE );
  1767. }
  1768. CExtAPSH(
  1769. UINT nIDCaption,
  1770. CWnd *pParentWnd,
  1771. UINT iSelectPage
  1772. )
  1773. : CExtAPSHBase( nIDCaption, pParentWnd, iSelectPage )
  1774. {
  1775. }
  1776. CExtAPSH(
  1777. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  1778. CWnd *pParentWnd,
  1779. UINT iSelectPage
  1780. )
  1781. : CExtAPSHBase( pszCaption, pParentWnd, iSelectPage )
  1782. {
  1783. }
  1784. }; // class CExtAPSH
  1785. /////////////////////////////////////////////////////////////////////////////
  1786. // CExtAPPG template adaptor for CPropertyPage
  1787. template < class CExtAPPGBase >
  1788. class CExtAPPG : public CExtAPPGBase
  1789. {
  1790. public:
  1791. CExtAPPG()
  1792. {
  1793. }
  1794. CExtAPPG(
  1795. UINT nIDTemplate,
  1796. CWnd * pParentWnd
  1797. )
  1798. {
  1799. // no such constructor in CPropertyPage
  1800. nIDTemplate;
  1801. pParentWnd;
  1802. ASSERT( FALSE );
  1803. }
  1804. CExtAPPG(
  1805. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1806. CWnd * pParentWnd
  1807. )
  1808. {
  1809. // no such constructor in CPropertyPage
  1810. lpszTemplateName;
  1811. pParentWnd;
  1812. ASSERT( FALSE );
  1813. }
  1814. CExtAPPG(
  1815. UINT nIDTemplate,
  1816. UINT nIDCaption = 0
  1817. )
  1818. : CExtAPPGBase( nIDTemplate, nIDCaption )
  1819. {
  1820. }
  1821. CExtAPPG(
  1822. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1823. UINT nIDCaption = 0
  1824. )
  1825. : CExtAPPGBase( lpszTemplateName, nIDCaption )
  1826. {
  1827. }
  1828. CExtAPPG(
  1829. UINT nIDCaption,
  1830. CWnd *pParentWnd,
  1831. UINT iSelectPage
  1832. )
  1833. {
  1834. // no such constructor in CPropertyPage
  1835. nIDCaption;
  1836. pParentWnd;
  1837. iSelectPage;
  1838. ASSERT( FALSE );
  1839. }
  1840. CExtAPPG(
  1841. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  1842. CWnd *pParentWnd,
  1843. UINT iSelectPage
  1844. )
  1845. {
  1846. // no such constructor in CPropertyPage
  1847. pszCaption;
  1848. pParentWnd;
  1849. iSelectPage;
  1850. ASSERT( FALSE );
  1851. }
  1852. }; // class CExtAPPG
  1853. /////////////////////////////////////////////////////////////////////////////
  1854. // CExtAGW template adaptor for generic window classes
  1855. template < class CExtAGWBase >
  1856. class CExtAGW : public CExtAGWBase
  1857. {
  1858. public:
  1859. CExtAGW()
  1860. {
  1861. }
  1862. CExtAGW(
  1863. UINT nIDTemplate,
  1864. CWnd * pParentWnd
  1865. )
  1866. {
  1867. // should not have such constructor
  1868. nIDTemplate;
  1869. pParentWnd;
  1870. ASSERT( FALSE );
  1871. }
  1872. CExtAGW(
  1873. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1874. CWnd * pParentWnd
  1875. )
  1876. {
  1877. // should not have such constructor
  1878. lpszTemplateName;
  1879. pParentWnd;
  1880. ASSERT( FALSE );
  1881. }
  1882. CExtAGW(
  1883. UINT nIDTemplate,
  1884. UINT nIDCaption = 0
  1885. )
  1886. : CExtAGWBase( nIDTemplate, nIDCaption )
  1887. {
  1888. // should not have such constructor
  1889. nIDTemplate;
  1890. nIDCaption;
  1891. ASSERT( FALSE );
  1892. }
  1893. CExtAGW(
  1894. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1895. UINT nIDCaption = 0
  1896. )
  1897. : CExtAGWBase( lpszTemplateName, nIDCaption )
  1898. {
  1899. // should not have such constructor
  1900. lpszTemplateName;
  1901. nIDCaption;
  1902. ASSERT( FALSE );
  1903. }
  1904. CExtAGW(
  1905. UINT nIDCaption,
  1906. CWnd *pParentWnd,
  1907. UINT iSelectPage
  1908. )
  1909. {
  1910. // should not have such constructor
  1911. nIDCaption;
  1912. pParentWnd;
  1913. iSelectPage;
  1914. ASSERT( FALSE );
  1915. }
  1916. CExtAGW(
  1917. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  1918. CWnd *pParentWnd,
  1919. UINT iSelectPage
  1920. )
  1921. {
  1922. // should not have such constructor
  1923. pszCaption;
  1924. pParentWnd;
  1925. iSelectPage;
  1926. ASSERT( FALSE );
  1927. }
  1928. }; // class CExtAGW
  1929. /////////////////////////////////////////////////////////////////////////////
  1930. // CExtAFV template adaptor for CFormView
  1931. template < class CExtAFVBase >
  1932. class CExtAFV : public CExtAFVBase
  1933. {
  1934. public:    
  1935. CExtAFV()
  1936. : CExtAFVBase( (UINT) 0 )
  1937. {
  1938. }    
  1939. CExtAFV(
  1940. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1941. CWnd * pParentWnd
  1942. )
  1943. : CExtAFVBase( lpszTemplateName )
  1944. {        
  1945. pParentWnd;    
  1946. }    
  1947. CExtAFV(
  1948. UINT nIDTemplate,
  1949. CWnd * pParentWnd
  1950. )
  1951. : CExtAFVBase( nIDTemplate )
  1952. {        
  1953. pParentWnd;    
  1954. }
  1955. }; // class CExtAFV
  1956. /////////////////////////////////////////////////////////////////////////////
  1957. // CExtCTA template (cool tip able)
  1958. #define __EXT_MFC_TIMER_ID_COOL_TIP_TEMPLATE 7654
  1959. template < class _CTA_BASE >
  1960. class CExtCTA : public _CTA_BASE
  1961. {
  1962. protected:
  1963. mutable CExtPopupMenuTipWnd m_wndCoolTip;
  1964. mutable __EXT_MFC_INT_PTR m_nLastToolHitID;
  1965. mutable CRect m_rcLastToolHit;
  1966. void _CancelTip() const
  1967. {
  1968. if( GetSafeHwnd() != NULL )
  1969. ((CWnd*)this)->KillTimer( __EXT_MFC_TIMER_ID_COOL_TIP_TEMPLATE );
  1970. m_nLastToolHitID = -1;
  1971. m_rcLastToolHit.SetRectEmpty();
  1972. if( m_wndCoolTip.GetSafeHwnd() != NULL )
  1973. m_wndCoolTip.Hide();
  1974. CWnd::CancelToolTips();
  1975. }
  1976. protected:
  1977. virtual __EXT_MFC_INT_PTR OnToolHitTest(
  1978. CPoint point,
  1979. TOOLINFO * pTI
  1980. ) const
  1981. {
  1982. ASSERT_VALID( this );
  1983. __EXT_MFC_INT_PTR nToolTipHit =
  1984. _CTA_BASE::OnToolHitTest( point, pTI );
  1985. bool bHide = true;
  1986. if( nToolTipHit >= 0 )
  1987. {
  1988. if( m_nLastToolHitID != nToolTipHit )
  1989. {
  1990. if( pTI->lpszText != NULL )
  1991. {
  1992. if( pTI->lpszText != LPSTR_TEXTCALLBACK )
  1993. {
  1994. bHide = false;
  1995. m_nLastToolHitID = nToolTipHit;
  1996. m_rcLastToolHit = pTI->rect;
  1997. ClientToScreen( &m_rcLastToolHit );
  1998. m_wndCoolTip.SetText(
  1999. LPCTSTR(LPVOID(pTI->lpszText))
  2000. );
  2001. ((CWnd*)this)->SetTimer(
  2002. __EXT_MFC_TIMER_ID_COOL_TIP_TEMPLATE,
  2003. 50,
  2004. NULL
  2005. );
  2006. m_wndCoolTip.Show(
  2007. (CWnd*)this,
  2008. m_rcLastToolHit
  2009. );
  2010. ::free( pTI->lpszText );
  2011. } // if( pTI->lpszText != LPSTR_TEXTCALLBACK )
  2012. pTI->lpszText = NULL;
  2013. } // if( pTI->lpszText != NULL )
  2014. } // if( nToolTipHit >= 0 )
  2015. else
  2016. bHide = false;
  2017. nToolTipHit = -1;
  2018. }
  2019. if( bHide )
  2020. _CancelTip();
  2021. return nToolTipHit;
  2022. }
  2023. LRESULT WindowProc(
  2024. UINT message,
  2025. WPARAM wParam,
  2026. LPARAM lParam
  2027. )
  2028. {
  2029. if( message == WM_DESTROY || message == WM_NCDESTROY )
  2030. _CancelTip();
  2031. else if(
  2032. message == WM_TIMER
  2033. && wParam == __EXT_MFC_TIMER_ID_COOL_TIP_TEMPLATE
  2034. )
  2035. {
  2036. if( m_nLastToolHitID < 0
  2037. || m_rcLastToolHit.IsRectEmpty()
  2038. )
  2039. {
  2040. _CancelTip();
  2041. return 0;
  2042. }
  2043. POINT ptCursor;
  2044. if( ! ::GetCursorPos( &ptCursor ) )
  2045. {
  2046. _CancelTip();
  2047. return 0;
  2048. }
  2049. if( ! m_rcLastToolHit.PtInRect(ptCursor) )
  2050. {
  2051. _CancelTip();
  2052. return 0;
  2053. }
  2054. return 0; 
  2055. }
  2056. LRESULT lResult = 
  2057. _CTA_BASE::WindowProc( message, wParam, lParam );
  2058. return lResult;
  2059. }
  2060. virtual void PreSubclassWindow()
  2061. {
  2062. _CancelTip();
  2063. _CTA_BASE::PreSubclassWindow();
  2064. }
  2065. }; // class CExtCTA
  2066. #endif // __EXT_TEMPL_H