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

界面编程

开发平台:

Visual C++

  1. // ChildView.cpp : implementation of the CChildView class
  2. //
  3. #include "stdafx.h"
  4. #include "ZoomScrollBar.h"
  5. #include "ChildView.h"
  6. #include "MainFrm.h"
  7. #include "Resources/resource.h"
  8. #include "resource.h"
  9. #if (! defined __VSSYM32_H__)
  10. #include <vssym32/vssym32.h>
  11. #endif // (! defined __VSSYM32_H__)
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CChildView
  19. IMPLEMENT_DYNAMIC( CChildView, CExtScrollWnd );
  20. const COLORREF CChildView::g_arrClrBk[ 4 ] =
  21. {
  22. RGB(230,230,230),
  23. RGB(192,192,0),
  24. RGB(0,0,164),
  25. RGB(192,0,0),
  26. };
  27. const double CChildView::g_arrVZF[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ] =
  28. {
  29. (__ZOOM_FACTOR_MULTIPLIER/15.0),
  30. (__ZOOM_FACTOR_MULTIPLIER/75.0),
  31. (__ZOOM_FACTOR_MULTIPLIER/150.0),
  32. (0.75),
  33. };
  34. const INT CChildView::g_arrRadiuses[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ] =
  35. {
  36. 2,
  37. 3,
  38. 5,
  39. 9,
  40. };
  41. const INT CChildView::g_arrDwmGlowSizes[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ] =
  42. {
  43. 2,
  44. 5,
  45. 10,
  46. 15,
  47. };
  48. CChildView::CChildView()
  49. : m_lfZoomFactor( 1.0 )
  50. , m_rcHelperZoomRectPadding( 31, 31, 31, 31 )
  51. , m_rcHelperDrawZoomRect( 0, 0, 0, 0 )
  52. , m_nHT( -1 )
  53. , m_eSTLT( CChildView::__ESTLT_BY_ZOOM )
  54. , m_eSTOT( CChildView::__ESTOT_ALPHA_BMP )
  55. , m_bEnableVistaTextRendering( g_PaintManager.m_bIsWinVistaOrLater && g_PaintManager.m_DWM.IsCompositionEnabled() )
  56. , m_bEnableHalftoning( g_PaintManager.m_bIsWinNT )
  57. , m_ptLastStatusLL( -1, -1 )
  58. {
  59. m_bClientCB = true;
  60. m_wndZoomer.m_bEnabledTrackingToolTips = true;
  61. VERIFY(
  62. g_ResourceManager->LoadString(
  63. m_strEmptyLocationStatusText,
  64. ID_INDICATOR_LOCATION
  65. )
  66. );
  67. VERIFY(
  68. m_bmpHelperZoomRectHighlight.LoadBMP_Resource(
  69. MAKEINTRESOURCE(IDB_BITMAP_ZOOM_RECT_HIGHLIGHT)
  70. )
  71. );
  72. VERIFY(
  73. m_bmp.LoadBMP_Resource(
  74. MAKEINTRESOURCE( IDB_BITMAP_GERMANY )
  75. )
  76. );
  77. CExtResourceManager::CExtResourceMemoryBuffer _buffer;
  78. if( g_ResourceManager->LoadResourceBuffer(
  79. _buffer,
  80. _T("dat"),
  81. IDR_DAT1
  82. )
  83. )
  84. {
  85. CString s;
  86. wchar_t _line[512];
  87. ::memset( _line, 0, sizeof(_line) );
  88. INT nLineIndex = 0, nCharIndex, nCharCount = INT( _buffer.GetSize() );
  89. for( nCharIndex = 0; nCharIndex < nCharCount; nCharIndex ++ )
  90. {
  91. BYTE _byte1 = _buffer.GetBuffer()[nCharIndex++];
  92. if( nCharIndex >= nCharCount )
  93. break;
  94. BYTE _byte2 = _buffer.GetBuffer()[nCharIndex];
  95. wchar_t _wchr = wchar_t( (WORD(_byte2)<<8)|(WORD(_byte1)) );
  96. if( _wchr == 13 )
  97. continue;
  98. if( _wchr != 10 )
  99. {
  100. ASSERT( nLineIndex < (sizeof(_line)/sizeof(_line[0])) );
  101. _line[ nLineIndex ++ ] = _wchr;
  102. continue;
  103. } // if( _byte != 10 )
  104. s = _line;
  105. if( ! s.IsEmpty() )
  106. {
  107. GEODESIC_OBJECT _object;
  108. if( _object.ScanLine( s ) )
  109. m_arrObjects.Add( _object );
  110. } // if( ! s.IsEmpty() )
  111. nLineIndex = 0;
  112. ::memset( _line, 0, sizeof(_line) );
  113. } // for( nCharIndex = 0; nCharIndex < nCharCount; nCharIndex ++ )
  114. s = _line;
  115. if( ! s.IsEmpty() )
  116. {
  117. GEODESIC_OBJECT _object;
  118. if( _object.ScanLine( s ) )
  119. m_arrObjects.Add( _object );
  120. } // if( ! s.IsEmpty() )
  121. }
  122. static LPCTSTR g_arrObjectBmpResourceIDs[ 4 ] =
  123. {
  124. MAKEINTRESOURCE(IDB_OBJECT0),
  125. MAKEINTRESOURCE(IDB_OBJECT1),
  126. MAKEINTRESOURCE(IDB_OBJECT2),
  127. MAKEINTRESOURCE(IDB_OBJECT3),
  128. };
  129. INT nBmpIndex, nBmpCount = INT( sizeof(g_arrObjectBmpResourceIDs)/sizeof(g_arrObjectBmpResourceIDs[0]) );
  130. for( nBmpIndex = 0; nBmpIndex < nBmpCount; nBmpIndex ++ )
  131. {
  132. VERIFY( m_arrObjectBmps[nBmpIndex].LoadBMP_Resource( g_arrObjectBmpResourceIDs[nBmpIndex] ) );
  133. m_arrObjectBmpSize[nBmpIndex] = m_arrObjectBmps[nBmpIndex].GetSize();
  134. m_arrObjectBmpOffsets[nBmpIndex].x = m_arrObjectBmpSize[nBmpIndex].cx / 2;
  135. m_arrObjectBmpOffsets[nBmpIndex].y = m_arrObjectBmpSize[nBmpIndex].cy / 2;
  136. } // for( nBmpIndex = 0; nBmpIndex < nBmpCount; nBmpIndex ++ )
  137. }
  138. CChildView::~CChildView()
  139. {
  140. }
  141. BEGIN_MESSAGE_MAP( CChildView, CExtScrollWnd )
  142. //{{AFX_MSG_MAP(CChildView)
  143. ON_WM_CREATE()
  144. ON_WM_LBUTTONDOWN()
  145. ON_WM_HSCROLL()
  146. ON_WM_VSCROLL()
  147. ON_WM_SIZE()
  148. ON_WM_MOUSEMOVE()
  149. ON_WM_TIMER()
  150. ON_COMMAND( ID_HIDE_ALL_TEXT_LABELS, OnHideAllTextLabels )
  151. ON_UPDATE_COMMAND_UI( ID_HIDE_ALL_TEXT_LABELS, OnUpdateHideAllTextLabels )
  152. ON_COMMAND( ID_SHOW_TEXT_LABELS_WITH_ZOOM, OnShowTextLabelsWithZooming )
  153. ON_UPDATE_COMMAND_UI( ID_SHOW_TEXT_LABELS_WITH_ZOOM, OnUpdateShowTextLabelsZooming )
  154. ON_COMMAND( ID_SHOW_ALL_TEXT_LABELS, OnShowAllTextLabels )
  155. ON_UPDATE_COMMAND_UI( ID_SHOW_ALL_TEXT_LABELS, OnUpdateShowAllTextLabels )
  156. ON_WM_SETCURSOR()
  157. ON_COMMAND(ID_VISTA_TEXT_RENDERING, OnVistaTextRendering)
  158. ON_UPDATE_COMMAND_UI(ID_VISTA_TEXT_RENDERING, OnUpdateVistaTextRendering)
  159. ON_COMMAND(ID_HALFTONING, OnHalftoning)
  160. ON_UPDATE_COMMAND_UI(ID_HALFTONING, OnUpdateHalftoning)
  161. ON_COMMAND(ID_OBJECT_HIDE_ALL, OnObjectHideAll)
  162. ON_UPDATE_COMMAND_UI(ID_OBJECT_HIDE_ALL, OnUpdateObjectHideAll)
  163. ON_COMMAND(ID_OBJECT_ELLIPSE_FLAT, OnObjectEllipseFlat)
  164. ON_UPDATE_COMMAND_UI(ID_OBJECT_ELLIPSE_FLAT, OnUpdateObjectEllipseFlat)
  165. ON_COMMAND(ID_OBJECT_ELLIPSE_CIRCLE, OnObjectEllipseCircle)
  166. ON_UPDATE_COMMAND_UI(ID_OBJECT_ELLIPSE_CIRCLE, OnUpdateObjectEllipseCircle)
  167. ON_COMMAND(ID_OBJECT_ELLIPSE_SOLID, OnObjectEllipseSolid)
  168. ON_UPDATE_COMMAND_UI(ID_OBJECT_ELLIPSE_SOLID, OnUpdateObjectEllipseSolid)
  169. ON_COMMAND(ID_OBJECT_ALPHA_BMP, OnObjectAlphaBmp)
  170. ON_UPDATE_COMMAND_UI(ID_OBJECT_ALPHA_BMP, OnUpdateObjectAlphaBmp)
  171. ON_COMMAND(ID_SHOW_TRACKING_TOOLTIP_ON_ZOOM_SCROLLBAR, OnShowTrackingTooltipOnZoomScrollbar)
  172. ON_UPDATE_COMMAND_UI(ID_SHOW_TRACKING_TOOLTIP_ON_ZOOM_SCROLLBAR, OnUpdateShowTrackingTooltipOnZoomScrollbar)
  173. //}}AFX_MSG_MAP
  174. END_MESSAGE_MAP()
  175. /////////////////////////////////////////////////////////////////////////////
  176. // CChildView message handlers
  177. BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
  178. {
  179. if( ! CExtWRB < CExtScrollWnd > :: PreCreateWindow( cs ) )
  180. {
  181. ASSERT( FALSE );
  182. return FALSE;
  183. }
  184. cs.style |= WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
  185. cs.dwExStyle &= ~(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME);
  186. cs.style &= ~WS_BORDER;
  187. cs.lpszClass =
  188. ::AfxRegisterWndClass(
  189. CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
  190. ::LoadCursor( NULL, IDC_ARROW ),
  191. NULL, NULL
  192. );
  193. return TRUE;
  194. }
  195. int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  196. {
  197. if( CExtWRB < CExtScrollWnd > :: OnCreate( lpCreateStruct ) == -1 )
  198. {
  199. ASSERT( FALSE );
  200. return -1;
  201. }
  202. if( (GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  203. ModifyStyleEx( WS_EX_LAYOUTRTL, 0, SWP_FRAMECHANGED );
  204. m_wndScrollBarH.m_eSO = CExtScrollBar::__ESO_BOTTOM;
  205. m_wndScrollBarV.m_eSO = CExtScrollBar::__ESO_RIGHT;
  206. if( ! m_wndScrollBarV.Create(
  207. WS_CHILD|WS_VISIBLE|SBS_VERT|SBS_RIGHTALIGN,
  208. CRect(0,0,0,0),
  209. this,
  210. 1
  211. )
  212. )
  213. {
  214. ASSERT( FALSE );
  215. return false;
  216. }
  217. if( ! m_wndScrollBarH.Create(
  218. WS_CHILD|WS_VISIBLE|SBS_HORZ|SBS_BOTTOMALIGN,
  219. CRect(0,0,0,0),
  220. this,
  221. 2
  222. )
  223. )
  224. {
  225. ASSERT( FALSE );
  226. return false;
  227. }
  228. m_wndScrollBarH.SyncReservedSpace( &m_wndScrollBarV );
  229. m_wndScrollBarV.SyncReservedSpace( &m_wndScrollBarH );
  230. CMainFrame * pMainFrame = _GetMainFrame();
  231. ASSERT_VALID( pMainFrame );
  232. ASSERT( pMainFrame->GetSafeHwnd() != NULL );
  233. ASSERT( pMainFrame->m_wndStatusBar.GetSafeHwnd() != NULL );
  234. if( ! m_wndZoomer.Create(
  235. WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SBS_HORZ,
  236. CRect( 0, 0, __ZOOM_EXTENT_PX, 20 ),
  237. &(pMainFrame->m_wndStatusBar),
  238. ID_ZOOM_SCROLL_BAR_PANE
  239. )
  240. )
  241. {
  242. ASSERT( FALSE );
  243. return false;
  244. }
  245. m_wndZoomer.m_eSO = CExtScrollBar::__ESO_BOTTOM;
  246. SCROLLINFO _si = { sizeof(SCROLLINFO), SIF_ALL, 0, __ZOOM_EXTENT_PX, __ZOOM_EXTENT_PX/20, __ZOOM_EXTENT_PX/2, __ZOOM_EXTENT_PX/2 };
  247. VERIFY( m_wndZoomer.SetScrollInfo( &_si ) );
  248. m_wndZoomer.m_bEnabledToolTips         = true;
  249. m_wndZoomer.m_strTipTextForThumbButton = _T("Zoom");
  250. m_wndZoomer.m_strTipTextForUpButton    = _T("Zoom Out");
  251. m_wndZoomer.m_strTipTextForDownButton  = _T("Zoom In");
  252. _UpdateZoomerTT();
  253. pMainFrame->m_wndStatusBar.SetPaneControl(
  254. &m_wndZoomer,
  255. ID_ZOOM_SCROLL_BAR_PANE,
  256. false
  257. );
  258. pMainFrame->m_wndStatusBar.SetPaneWidth(
  259. pMainFrame->m_wndStatusBar.CommandToIndex( ID_ZOOM_SCROLL_BAR_PANE ),
  260. __ZOOM_EXTENT_PX
  261. );
  262. OnSwRecalcLayout( true );
  263. return 0;
  264. }
  265. CScrollBar* CChildView::GetScrollBarCtrl(int nBar) const
  266. {
  267. ASSERT_VALID( this );
  268. if( m_hWnd == NULL || (! ::IsWindow(m_hWnd) ) )
  269. return NULL;
  270. ASSERT( nBar == SB_HORZ || nBar == SB_VERT );
  271. if( nBar == SB_HORZ )
  272. {
  273. if( m_wndScrollBarH.GetSafeHwnd() != NULL )
  274. return ( const_cast < CExtScrollBar * > ( &m_wndScrollBarH ) );
  275. } // if( nBar == SB_HORZ )
  276. else
  277. {
  278. if( m_wndScrollBarV.GetSafeHwnd() != NULL )
  279. return ( const_cast < CExtScrollBar * > ( &m_wndScrollBarV ) );
  280. } // else from if( nBar == SB_HORZ )
  281. return NULL;
  282. }
  283. void CChildView::PostNcDestroy() 
  284. {
  285. m_rcHelperDrawZoomRect.SetRect( 0, 0, 0, 0 );
  286. m_nHT = -1;
  287. m_wndCoolTip.Hide();
  288. _StatusLL_Clear();
  289. m_bmpCache.Empty();
  290. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  291. CExtWRB < CExtScrollWnd > :: PostNcDestroy();
  292. }
  293. void CChildView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  294. {
  295. m_nHT = -1;
  296. m_wndCoolTip.Hide();
  297. _StatusLL_Clear();
  298. if( pScrollBar == (&m_wndZoomer) )
  299. {
  300. _SetZoomFromZoomer(
  301. ( nSBCode == SB_THUMBTRACK ) ? true : false
  302. );
  303. return;
  304. } // if( pScrollBar == (&m_wndZoomer) )
  305. m_bmpCache.Empty();
  306. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  307. CExtWRB < CExtScrollWnd > :: OnHScroll( nSBCode, nPos, pScrollBar );
  308. }
  309. void CChildView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  310. {
  311. m_nHT = -1;
  312. m_wndCoolTip.Hide();
  313. _StatusLL_Clear();
  314. if( pScrollBar == (&m_wndZoomer) )
  315. {
  316. _SetZoomFromZoomer(
  317. ( nSBCode == SB_THUMBTRACK ) ? true : false
  318. );
  319. return;
  320. } // if( pScrollBar == (&m_wndZoomer) )
  321. m_bmpCache.Empty();
  322. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  323. CExtWRB < CExtScrollWnd > :: OnVScroll( nSBCode, nPos, pScrollBar );
  324. }
  325. void CChildView::OnSize(UINT nType, int cx, int cy) 
  326. {
  327. m_bmpCache.Empty();
  328. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  329. CExtWRB < CExtScrollWnd > :: OnSize( nType, cx, cy );
  330. OnSwRecalcLayout( true );
  331. OnSwUpdateWindow();
  332. }
  333. void CChildView::OnTimer(__EXT_MFC_UINT_PTR nIDEvent) 
  334. {
  335. if( nIDEvent == 123 )
  336. {
  337. CPoint pt;
  338. if( ! ::GetCursorPos( &pt ) )
  339. {
  340. KillTimer( nIDEvent );
  341. _StatusLL_Clear();
  342. return;
  343. }
  344. HWND hWndFromPoint = ::WindowFromPoint( pt );
  345. if( hWndFromPoint != m_hWnd
  346. && hWndFromPoint != m_wndCoolTip.m_hWnd
  347. )
  348. {
  349. KillTimer( nIDEvent );
  350. _StatusLL_Clear();
  351. return;
  352. }
  353. //  if( ( ! ::ScreenToClient( m_hWnd, &pt ) )
  354. //  || ( ! _StatusLL_Set( NULL, pt ) )
  355. //  )
  356. //  {
  357. //  KillTimer( nIDEvent );
  358. //  _StatusLL_Clear();
  359. //  return;
  360. //  }
  361. return;
  362. } // if( nIDEvent == 123 )
  363. CExtWRB < CExtScrollWnd > :: OnTimer(nIDEvent);
  364. }
  365. void CChildView::OnLButtonDown(UINT nFlags, CPoint point) 
  366. {
  367. // CExtWRB < CExtScrollWnd > :: OnLButtonDown(nFlags, point);
  368. nFlags;
  369. _AdjustHT( point );
  370. if( m_nHT >= 0 )
  371. {
  372. const GEODESIC_OBJECT & _object = GetObjectAt( m_nHT );
  373. if( ! _object.m_strURL.IsEmpty() )
  374. {
  375. CExtHyperLinkButton::stat_HyperLinkOpen(
  376. LPCTSTR(_object.m_strURL)
  377. );
  378. ::SetCursor( ::LoadCursor( NULL, IDC_ARROW ) );
  379. return;
  380. }
  381. } // if( m_nHT >= 0 )
  382. double lfMax = double( __ZOOM_EXTENT_PX - __ZOOM_EXTENT_PX/2 ) / double( __ZOOM_EXTENT_PX/2 + 1 );
  383. lfMax *= lfMax;
  384. lfMax *= __ZOOM_FACTOR_MULTIPLIER;
  385. lfMax += 1.0;
  386. if( m_lfZoomFactor > lfMax )
  387. return;
  388. CRect rcAvailableRectTrackSpace = _AvailableRectTrackSpaceGet();
  389. ::SetCursor( ::AfxGetApp()->LoadCursor( IDC_EXT_ZOOM_PLUS ) );
  390. CRect rcTracked = _TrackZoomRect( point, rcAvailableRectTrackSpace, false );
  391. ::SetCursor( ::LoadCursor( NULL, IDC_ARROW ) );
  392. if( rcTracked.IsRectEmpty() )
  393. return;
  394. CSize sizeScrollOld = OnSwGetTotalSize();
  395. CRect rcClient = OnSwGetClientRect();
  396. rcClient.OffsetRect( -rcClient.TopLeft() );
  397. CSize _sizeClient = rcClient.Size();
  398. double lfZoomChangingX = double( rcClient.Width() ) / double( rcTracked.Width() );
  399. double lfZoomChangingY = double( rcClient.Height() ) / double( rcTracked.Height() );
  400. double lfZoomChanging = min( lfZoomChangingX, lfZoomChangingY );
  401. CPoint ptTrackedCenter = rcTracked.CenterPoint() + OnSwGetScrollPos();
  402. m_lfZoomFactor *= lfZoomChanging; 
  403. if( m_lfZoomFactor > lfMax )
  404. m_lfZoomFactor = lfMax;
  405. m_bmpCache.Empty();
  406. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  407. OnSwUpdateScrollBars();
  408. CSize sizeScrollNew = OnSwGetTotalSize();
  409. CPoint ptScrollPosNew(
  410. ( m_lfZoomFactor < 1.0 )
  411. ? 0
  412. : ( ::MulDiv(
  413. ptTrackedCenter.x, // + _sizeClient.cx / 2,
  414. sizeScrollNew.cx,
  415. sizeScrollOld.cx
  416. )
  417. - _sizeClient.cx / 2
  418. ),
  419. ( m_lfZoomFactor < 1.0 )
  420. ? 0
  421. : ( ::MulDiv(
  422. ptTrackedCenter.y, // + _sizeClient.cy / 2,
  423. sizeScrollNew.cy,
  424. sizeScrollOld.cy
  425. )
  426. - _sizeClient.cy / 2
  427. )
  428. );
  429. ptScrollPosNew.x = max( ptScrollPosNew.x, 0 );
  430. ptScrollPosNew.y = max( ptScrollPosNew.y, 0 );
  431. ptScrollPosNew.x = min( ptScrollPosNew.x, sizeScrollNew.cx );
  432. ptScrollPosNew.y = min( ptScrollPosNew.y, sizeScrollNew.cy );
  433. OnSwSetScrollPos( ptScrollPosNew );
  434. OnSwRecalcLayout( true );
  435. OnSwDoRedraw();
  436. UpdateWindow();
  437. // adjust zoomer finally
  438. double lfPos = ::sqrt( ( ::sqrt( ( m_lfZoomFactor - 1.0 ) / __ZOOM_FACTOR_MULTIPLIER ) ) ) * double( __ZOOM_EXTENT_PX/2 + 1 ) + double( __ZOOM_EXTENT_PX/2 );;
  439. INT nPos = UINT( lfPos );
  440. if( nPos < 0 )
  441. nPos = 0;
  442. else if( nPos > __ZOOM_EXTENT_PX )
  443. nPos = __ZOOM_EXTENT_PX;
  444. m_wndZoomer.SetScrollPos( nPos );
  445. }
  446. void CChildView::OnMouseMove(UINT nFlags, CPoint point) 
  447. {
  448. CExtWRB < CExtScrollWnd > :: OnMouseMove(nFlags, point);
  449. _AdjustHT( point );
  450. }
  451. void CChildView::_AdjustHT( CPoint point )
  452. {
  453. ASSERT_VALID( this );
  454. CRect rcObject;
  455. INT nHT = CChildView::_HitTestObject( point, &rcObject );
  456. if( m_nHT != nHT )
  457. {
  458. m_wndCoolTip.Hide();
  459. m_nHT = nHT;
  460. if( m_nHT >= 0 )
  461. {
  462. const GEODESIC_OBJECT & _object = GetObjectAt( m_nHT );
  463. CExtSafeString strTipText;
  464. strTipText.Format(
  465. _T("Name: %sn%s%s%sLongitude: %lfnLatitude: %lf"),
  466. LPCTSTR( _object.m_strName ),
  467. _object.m_strURL.IsEmpty() ? _T("") : _T("URL: "),
  468. _object.m_strURL.IsEmpty() ? _T("") : LPCTSTR( _object.m_strURL ),
  469. _object.m_strURL.IsEmpty() ? _T("") : _T("n"),
  470. _object.m_gp.lfLongitude,
  471. _object.m_gp.lfLatitude
  472. );
  473. ClientToScreen( &rcObject );
  474. m_wndCoolTip.SetIcon( NULL );
  475. m_wndCoolTip.SetText( LPCTSTR(strTipText) );
  476. if( ! _object.m_bmp.IsEmpty() )
  477. {
  478. CExtCmdIcon _icon;
  479. _icon.m_bmpNormal = _object.m_bmp;
  480. m_wndCoolTip.SetIcon( _icon );
  481. } // if( ! _object.m_bmp.IsEmpty() )
  482. m_wndCoolTip.Show( this, rcObject );
  483. _StatusLL_Set( _object );
  484. } // if( m_nHT >= 0 )
  485. else
  486. _StatusLL_Set( NULL, point );
  487. } // if( m_nHT != nHT )
  488. else
  489. {
  490. if( m_nHT >= 0 )
  491. {
  492. const GEODESIC_OBJECT & _object = GetObjectAt( m_nHT );
  493. _StatusLL_Set( _object );
  494. } // if( m_nHT >= 0 )
  495. else
  496. _StatusLL_Set( NULL, point );
  497. } // else from if( m_nHT != nHT )
  498. SetTimer( 123, 100, NULL );
  499. }
  500. void CChildView::_StatusLL_Clear()
  501. {
  502. ASSERT_VALID( this );
  503. if( GetSafeHwnd() == NULL )
  504. return;
  505. CMainFrame * pMainFrame = _GetMainFrame();
  506. ASSERT_VALID( pMainFrame );
  507. if( pMainFrame->m_wndStatusBar.GetSafeHwnd() == NULL )
  508. return;
  509. INT nPaneIndex = pMainFrame->m_wndStatusBar.CommandToIndex( ID_INDICATOR_LOCATION );
  510. if( nPaneIndex < 0 )
  511. return;
  512. pMainFrame->m_wndStatusBar.SetPaneText( nPaneIndex, LPCTSTR(m_strEmptyLocationStatusText) );
  513. pMainFrame->m_wndStatusBar.WidthFromContent( nPaneIndex );
  514. }
  515. bool CChildView::_StatusLL_Set(
  516. const CChildView::GEODESIC_OBJECT & _object
  517. )
  518. {
  519. ASSERT_VALID( this );
  520. return
  521. _StatusLL_Set(
  522. LPCTSTR( _object.m_strName ),
  523. _object.m_gp.lfLongitude,
  524. _object.m_gp.lfLatitude
  525. );
  526. }
  527. bool CChildView::_StatusLL_Set(
  528. LPCTSTR strName,
  529. double lfLongitude,
  530. double lfLatitude
  531. )
  532. {
  533. ASSERT_VALID( this );
  534. if( GetSafeHwnd() == NULL )
  535. return false;
  536. CMainFrame * pMainFrame = _GetMainFrame();
  537. ASSERT_VALID( pMainFrame );
  538. if( pMainFrame->m_wndStatusBar.GetSafeHwnd() == NULL )
  539. return false;
  540. INT nPaneIndex = pMainFrame->m_wndStatusBar.CommandToIndex( ID_INDICATOR_LOCATION );
  541. if( nPaneIndex < 0 )
  542. return false;
  543. CString strPaneTextOld = pMainFrame->m_wndStatusBar.GetPaneText( nPaneIndex );
  544. CString strPaneTextNew;
  545. if( strName != NULL )
  546. strPaneTextNew.Format(
  547. _T("  Name: %s   Longitude: %lf   Latitude: %lf"),
  548. strName,
  549. lfLongitude,
  550. lfLatitude
  551. );
  552. else
  553. strPaneTextNew.Format(
  554. _T("  Longitude: %lf   Latitude: %lf"),
  555. lfLongitude,
  556. lfLatitude
  557. );
  558. if( strPaneTextNew == strPaneTextOld )
  559. return true;
  560. pMainFrame->m_wndStatusBar.SetPaneText( nPaneIndex, LPCTSTR(strPaneTextNew) );
  561. pMainFrame->m_wndStatusBar.WidthFromContent( nPaneIndex );
  562. return true;
  563. }
  564. bool CChildView::_StatusLL_Set(
  565. LPCTSTR strName,
  566. CPoint ptClient
  567. )
  568. {
  569. ASSERT_VALID( this );
  570. if( GetSafeHwnd() == NULL )
  571. return false;
  572. if( m_bmp.IsEmpty() )
  573. {
  574. _StatusLL_Clear();
  575. return false;
  576. }
  577. if( m_ptLastStatusLL == ptClient )
  578. return true;
  579. CPoint ptScrollPos = OnSwGetScrollPos();
  580. CSize _sizeSrc = m_bmp.GetSize();
  581. CSize _sizeDst(
  582. INT( double(_sizeSrc.cx) * m_lfZoomFactor ),
  583. INT( double(_sizeSrc.cy) * m_lfZoomFactor )
  584. );
  585. CRect rcDst( 0, 0, _sizeDst.cx, _sizeDst.cy );
  586. rcDst.OffsetRect( - ptScrollPos );
  587. if( ! rcDst.PtInRect( ptClient  ) )
  588. {
  589. _StatusLL_Clear();
  590. return false;
  591. }
  592. GEODESIC_POINT gp = ClientToGeodesic( ptClient + ptScrollPos );
  593. if( ! _StatusLL_Set( strName, gp.lfLongitude, gp.lfLatitude ) )
  594. return false;
  595. m_ptLastStatusLL = ptClient;
  596. return true;
  597. }
  598. INT CChildView::_HitTestObject(
  599. CPoint ptClient,
  600. RECT * pRectObject // = NULL
  601. ) const
  602. {
  603. ASSERT_VALID( this );
  604. CRect rcClient = OnSwGetClientRect();
  605. if( ! rcClient.PtInRect( ptClient ) )
  606. return -1;
  607. rcClient.OffsetRect( -rcClient.TopLeft() );
  608. CPoint ptScrollPos = OnSwGetScrollPos();
  609. INT nObjectIndex, nObjectCount = GetObjectCount();
  610. for( nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex ++ )
  611. {
  612. const GEODESIC_OBJECT & _object = GetObjectAt( nObjectIndex );
  613. ASSERT( 0 <= _object.m_nLevel && _object.m_nLevel <= 3 );
  614. CPoint ptObject( GeodesicToClient( _object.m_gp ) );
  615. ptObject -= ptScrollPos;
  616. INT nRadius = g_arrRadiuses[_object.m_nLevel];
  617. CRect rcObject( ptObject, ptObject );
  618. rcObject.InflateRect( nRadius, nRadius );
  619. if( rcObject.PtInRect( ptClient ) )
  620. {
  621. if( pRectObject != NULL )
  622. ::CopyRect( pRectObject, &rcObject );
  623. return nObjectIndex;
  624. } // if( rcObject.PtInRect( ptClient ) )
  625. } // for( nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex ++ )
  626. return -1;
  627. }
  628. void CChildView::_UpdateZoomerTT()
  629. {
  630. ASSERT_VALID( this );
  631. if( ! m_wndZoomer.m_bEnabledTrackingToolTips )
  632. {
  633. m_wndZoomer.m_strTipTextForThumbButton = _T("Zoom");
  634. return;
  635. }
  636. INT nZoomPaneValue = INT( m_lfZoomFactor * 100.0 );
  637. m_wndZoomer.m_strTipTextForThumbButton.Format(
  638. _T("Zoom %3d %%"),
  639. nZoomPaneValue
  640. );
  641. }
  642. void CChildView::_SetZoomFromZoomer(
  643. bool bTrackPos
  644. )
  645. {
  646. ASSERT_VALID( this );
  647. CPoint ptScrollPosOld = OnSwGetScrollPos();
  648. CSize sizeScrollOld = OnSwGetTotalSize();
  649. CRect rcClient = OnSwGetClientRect();
  650. rcClient.OffsetRect( -rcClient.TopLeft() );
  651. CSize _sizeClient = rcClient.Size();
  652. SCROLLINFO _scroll_info;
  653. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  654. _scroll_info.cbSize = sizeof(SCROLLINFO);
  655. if( ! m_wndZoomer.GetScrollInfo(
  656. &_scroll_info,
  657. SIF_ALL // SIF_POS|SIF_TRACKPOS
  658. )
  659. )
  660. {
  661. m_wndZoomer.GetScrollRange(
  662. &_scroll_info.nMin,
  663. &_scroll_info.nMax
  664. );
  665. _scroll_info.nPage = 0;
  666. _scroll_info.nTrackPos
  667. = _scroll_info.nPos
  668. = m_wndZoomer.GetScrollPos();
  669. }
  670. INT nScrollPos = bTrackPos ? _scroll_info.nTrackPos : _scroll_info.nPos;
  671. if( nScrollPos < 0 )
  672. nScrollPos = 0;
  673. else if( nScrollPos > __ZOOM_EXTENT_PX )
  674. nScrollPos = __ZOOM_EXTENT_PX;
  675. nScrollPos -= __ZOOM_EXTENT_PX/2;
  676. double lfZoomFactorOld = m_lfZoomFactor;
  677. m_lfZoomFactor = double( nScrollPos ) / double( __ZOOM_EXTENT_PX/2 + 1 );
  678. if( m_lfZoomFactor > 0.0 )
  679. {
  680. m_lfZoomFactor *= m_lfZoomFactor;
  681. m_lfZoomFactor *= m_lfZoomFactor;
  682. m_lfZoomFactor *= __ZOOM_FACTOR_MULTIPLIER;
  683. }
  684. else
  685. m_lfZoomFactor /= 1.5;
  686. m_lfZoomFactor += 1.0;
  687. // TRACE3( "m_lfZoomFactor = %lf,    _scroll_info.nTrackPos = %d,    _scroll_info.nPos = %drn", m_lfZoomFactor, _scroll_info.nTrackPos, _scroll_info.nPos );
  688. if( lfZoomFactorOld == m_lfZoomFactor )
  689. return;
  690. CSize sizeScrollNew = m_bmp.GetSize();
  691. sizeScrollNew.cx = INT( double(sizeScrollNew.cx) * m_lfZoomFactor );
  692. sizeScrollNew.cy = INT( double(sizeScrollNew.cy) * m_lfZoomFactor );
  693. CPoint ptScrollPosNew(
  694.  ::MulDiv(
  695. ptScrollPosOld.x + _sizeClient.cx / 2,
  696. sizeScrollNew.cx,
  697. sizeScrollOld.cx
  698. )
  699. - _sizeClient.cx / 2
  700. ,
  701.  ::MulDiv(
  702. ptScrollPosOld.y + _sizeClient.cy / 2,
  703. sizeScrollNew.cy,
  704. sizeScrollOld.cy
  705. )
  706. - _sizeClient.cy / 2
  707. );
  708. ptScrollPosNew.x = max( ptScrollPosNew.x, 0 );
  709. ptScrollPosNew.y = max( ptScrollPosNew.y, 0 );
  710. ptScrollPosNew.x = min( ptScrollPosNew.x, sizeScrollNew.cx );
  711. ptScrollPosNew.y = min( ptScrollPosNew.y, sizeScrollNew.cy );
  712. OnSwUpdateScrollBars();
  713. OnSwSetScrollPos( ptScrollPosNew );
  714. OnSwRecalcLayout( true );
  715. m_wndScrollBarH.Invalidate( TRUE );
  716. m_wndScrollBarV.Invalidate( TRUE );
  717. m_wndScrollBarH.UpdateWindow();
  718. m_wndScrollBarV.UpdateWindow();
  719. OnSwInvalidate( true );
  720. //OnSwUpdateWindow();
  721. CMainFrame * pMainFrame = _GetMainFrame();
  722. ASSERT_VALID( pMainFrame );
  723. INT nPaneIndex = pMainFrame->m_wndStatusBar.CommandToIndex( ID_ZOOM_VALUE_PANE );
  724. if( nPaneIndex > 0 )
  725. {
  726. INT nZoomPaneValue = INT( m_lfZoomFactor * 100.0 );
  727. CString strZoomPaneValue;
  728. strZoomPaneValue.Format( _T(" %3d %%"), nZoomPaneValue );
  729. pMainFrame->m_wndStatusBar.SetPaneText( nPaneIndex, LPCTSTR(strZoomPaneValue) );
  730. //pMainFrame->m_wndStatusBar.WidthFromContent( nPaneIndex );
  731. }
  732. _UpdateZoomerTT();
  733. }
  734. CMainFrame * CChildView::_GetMainFrame() const
  735. {
  736. ASSERT_VALID( this );
  737. ASSERT( GetSafeHwnd() != NULL );
  738. CFrameWnd * pFrame = GetParentFrame();
  739. if( pFrame == NULL )
  740. return NULL;
  741. CMainFrame * pMainFrame = DYNAMIC_DOWNCAST( CMainFrame, pFrame );
  742. if( pMainFrame != NULL )
  743. return pMainFrame;
  744. pFrame = pFrame->GetParentFrame();
  745. pMainFrame = DYNAMIC_DOWNCAST( CMainFrame, pFrame );
  746. return pMainFrame;
  747. }
  748. CRect CChildView::_AvailableRectTrackSpaceGet() const
  749. {
  750. ASSERT_VALID( this );
  751. ASSERT( GetSafeHwnd() != NULL );
  752. CRect rcClient = OnSwGetClientRect();
  753. rcClient.OffsetRect( -rcClient.TopLeft() );
  754. CRect rcMax( -OnSwGetScrollPos(), OnSwGetTotalSize() );
  755. CRect rc(
  756. max( rcClient.left, rcMax.left ),
  757. max( rcClient.top, rcMax.top ),
  758. min( rcClient.right, rcMax.right ),
  759. min( rcClient.bottom, rcMax.bottom )
  760. );
  761. return rc;
  762. }
  763. HBRUSH CChildView::stat_GetHalftoneLightBrush(
  764. int nLighterSpec
  765. )
  766. {
  767. WORD _patternChashHalftone[8];
  768. if( nLighterSpec == 0 )
  769. {
  770. for( int nHTIdx = 0; nHTIdx < 8; nHTIdx++ )
  771. _patternChashHalftone[nHTIdx] =
  772. ( (nHTIdx & 1) == 0 )
  773. ? ( (WORD) 0 )
  774. : ( (WORD) (0x1111 << (nHTIdx & 0x03)) )
  775. ;
  776. } // if( nLighterSpec == 0 )
  777. else if( nLighterSpec == 1 )
  778. {
  779. for( int nHTIdx = 0; nHTIdx < 8; nHTIdx++ )
  780. _patternChashHalftone[nHTIdx] =
  781. ( (WORD) (0x1111 << (nHTIdx & 0x03)) )
  782. ;
  783. } // else if( nLighterSpec == 1 )
  784. else
  785. {
  786. for( int nHTIdx = 0; nHTIdx < 8; nHTIdx++ )
  787. _patternChashHalftone[nHTIdx] =
  788. ( (WORD) (0x5555 << (nHTIdx & 0x01)) )
  789. ;
  790. } // else 
  791. HBITMAP _bitmapChashHalftone =
  792. ::CreateBitmap(
  793. 8, 8, 1, 1,
  794. &_patternChashHalftone
  795. );
  796. if( _bitmapChashHalftone == NULL )
  797. {
  798. ASSERT( FALSE );
  799. return NULL;
  800. }
  801. HBRUSH hHalftoneBrush =
  802. ::CreatePatternBrush( _bitmapChashHalftone );
  803. ::DeleteObject( _bitmapChashHalftone );
  804. if( hHalftoneBrush == NULL )
  805. {
  806. ASSERT( FALSE );
  807. return NULL;
  808. }
  809. return hHalftoneBrush;
  810. }
  811. CRect CChildView::_TrackZoomRect(
  812. CPoint ptStartTracking,
  813. CRect rcAvailableRectTrackSpace,
  814. bool bUseHalftone // = false
  815. )
  816. {
  817. ASSERT_VALID( this );
  818. HWND hWndOwn = GetSafeHwnd();
  819. ASSERT( hWndOwn != NULL );
  820. if( rcAvailableRectTrackSpace.left >= rcAvailableRectTrackSpace.right
  821. || rcAvailableRectTrackSpace.top >= rcAvailableRectTrackSpace.bottom
  822. )
  823. return CRect( 0, 0, 0, 0 );
  824. bool bStopFlag = false;
  825. CRect rcResult( 0, 0, 0, 0 );
  826. rcResult.left = max( rcAvailableRectTrackSpace.left, ptStartTracking.x );
  827. rcResult.left = min( rcAvailableRectTrackSpace.right, rcResult.left );
  828. rcResult.top = max( rcAvailableRectTrackSpace.top, ptStartTracking.y );
  829. rcResult.top = min( rcAvailableRectTrackSpace.bottom, rcResult.top );
  830. rcResult.right = rcResult.left;
  831. rcResult.bottom = rcResult.top;
  832. SetFocus();
  833. CExtMouseCaptureSink::SetCapture( hWndOwn );
  834. CBrush _brushHalftone;
  835. if( bUseHalftone )
  836. {
  837. _brushHalftone.Attach( stat_GetHalftoneLightBrush( 1 ) );
  838. ASSERT( _brushHalftone.GetSafeHandle() != NULL );
  839. } // if( bUseHalftone )
  840. static const DWORD dwDCX = DCX_CACHE|DCX_LOCKWINDOWUPDATE|DCX_CLIPSIBLINGS|DCX_CLIPCHILDREN;
  841. for( MSG msg; ::IsWindow( hWndOwn ) && ( ! bStopFlag ) ; )
  842. { // message loop
  843. if( ! ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  844. {
  845. if( ( ! ::IsWindow( hWndOwn ) )
  846. || bStopFlag
  847. )
  848. break;
  849. for( LONG nIdleCounter = 0L;
  850. ::AfxGetThread()->OnIdle( nIdleCounter );
  851. nIdleCounter ++
  852. );
  853. ::WaitMessage();
  854. continue;
  855. } // if( ! ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  856. switch( msg.message )
  857. {
  858. case WM_KILLFOCUS:
  859. if( msg.hwnd == hWndOwn )
  860. bStopFlag = true;
  861. case WM_CANCELMODE:
  862. case WM_ACTIVATEAPP:
  863. case WM_SYSCOMMAND:
  864. case WM_SETTINGCHANGE:
  865. case WM_SYSCOLORCHANGE:
  866. bStopFlag = true;
  867. break;
  868. case WM_COMMAND:
  869. if( (HIWORD(msg.wParam)) == 0
  870. || (HIWORD(msg.wParam)) == 1
  871. )
  872. bStopFlag = true;
  873. break;
  874. case WM_CAPTURECHANGED:
  875. if( (HWND)msg.wParam != hWndOwn )
  876. bStopFlag = true;
  877. break;
  878. case WM_MOUSEWHEEL:
  879. if( msg.hwnd != hWndOwn )
  880. bStopFlag = true;
  881. else
  882. {
  883. ::PeekMessage( &msg, NULL, msg.message, msg.message, PM_REMOVE );
  884. continue;
  885. } // else from if( msg.hwnd != hWndOwn )
  886. break;
  887. case WM_MOUSEMOVE:
  888. if( msg.hwnd != hWndOwn )
  889. bStopFlag = true;
  890. else
  891. {
  892. ASSERT_VALID( this );
  893. ::PeekMessage( &msg, NULL, msg.message, msg.message, PM_REMOVE );
  894. CPoint point;
  895. point = DWORD( msg.lParam );
  896. _StatusLL_Set( NULL, point );
  897. CRect rcNew = rcResult;
  898. rcNew.right = max( rcAvailableRectTrackSpace.left, point.x );
  899. rcNew.right = min( rcAvailableRectTrackSpace.right, rcNew.right );
  900. rcNew.bottom = max( rcAvailableRectTrackSpace.top, point.y );
  901. rcNew.bottom = min( rcAvailableRectTrackSpace.bottom, rcNew.bottom );
  902. if( rcResult != rcNew )
  903. {
  904. CRect rcDraw = rcResult;
  905. rcDraw.NormalizeRect();
  906. if( ! rcDraw.IsRectEmpty() )
  907. {
  908. if( bUseHalftone )
  909. {
  910. CDC * pDC = GetDCEx( NULL, dwDCX );
  911. ASSERT( pDC->GetSafeHdc() != NULL );
  912. CBrush * pBrushOld = pDC->SelectObject( &_brushHalftone );
  913. pDC->PatBlt(
  914. rcDraw.left, rcDraw.top, rcDraw.Width(), rcDraw.Height(),
  915. PATINVERT
  916. );
  917. pDC->SelectObject( pBrushOld );
  918. ReleaseDC( pDC );
  919. } // if( bUseHalftone )
  920. else
  921. {
  922. m_rcHelperDrawZoomRect = rcDraw;
  923. m_rcHelperDrawZoomRect.OffsetRect( OnSwGetScrollPos() );
  924. OnSwDoRedraw();
  925. OnSwUpdateWindow();
  926. } // else from if( bUseHalftone )
  927. } // if( ! rcDraw.IsRectEmpty() )
  928. rcResult = rcNew;
  929. rcDraw = rcResult;
  930. rcDraw.NormalizeRect();
  931. if( ! rcDraw.IsRectEmpty() )
  932. {
  933. if( bUseHalftone )
  934. {
  935. CDC * pDC = GetDCEx( NULL, dwDCX );
  936. ASSERT( pDC->GetSafeHdc() != NULL );
  937. CBrush * pBrushOld = pDC->SelectObject( &_brushHalftone );
  938. pDC->PatBlt(
  939. rcDraw.left, rcDraw.top, rcDraw.Width(), rcDraw.Height(),
  940. PATINVERT
  941. );
  942. pDC->SelectObject( pBrushOld );
  943. ReleaseDC( pDC );
  944. } // if( bUseHalftone )
  945. else
  946. {
  947. m_rcHelperDrawZoomRect = rcDraw;
  948. m_rcHelperDrawZoomRect.OffsetRect( OnSwGetScrollPos() );
  949. OnSwDoRedraw();
  950. OnSwUpdateWindow();
  951. } // else from if( bUseHalftone )
  952. } // if( ! rcDraw.IsRectEmpty() )
  953. } // if( rcResult != rcNew )
  954. continue;
  955. } // else from if( msg.hwnd != hWndOwn )
  956. break;
  957. case WM_LBUTTONUP:
  958. case WM_RBUTTONUP:
  959. case WM_MBUTTONUP:
  960. bStopFlag = true;
  961. if( msg.hwnd == hWndOwn )
  962. {
  963. ASSERT_VALID( this );
  964. ::PeekMessage( &msg, NULL, msg.message, msg.message, PM_REMOVE );
  965. continue;
  966. } // if( msg.hwnd == hWndOwn )
  967. break;
  968. case WM_LBUTTONDBLCLK:
  969. case WM_LBUTTONDOWN:
  970. case WM_RBUTTONDBLCLK:
  971. case WM_RBUTTONDOWN:
  972. case WM_MBUTTONDBLCLK:
  973. case WM_MBUTTONDOWN:
  974. case WM_CONTEXTMENU:
  975. case WM_NCLBUTTONUP:
  976. case WM_NCLBUTTONDBLCLK:
  977. case WM_NCLBUTTONDOWN:
  978. case WM_NCRBUTTONUP:
  979. case WM_NCRBUTTONDBLCLK:
  980. case WM_NCRBUTTONDOWN:
  981. case WM_NCMBUTTONUP:
  982. case WM_NCMBUTTONDBLCLK:
  983. case WM_NCMBUTTONDOWN:
  984. bStopFlag = true;
  985. break;
  986. default:
  987. if(    WM_KEYFIRST <= msg.message
  988. && msg.message <= WM_KEYLAST
  989. )
  990. {
  991. Invalidate();
  992. if( msg.message == WM_KEYDOWN || msg.message == WM_KEYUP )
  993. {
  994. if( msg.wParam == VK_SHIFT || msg.wParam == VK_CONTROL )
  995. {
  996. ::PeekMessage( &msg, NULL, msg.message, msg.message, PM_REMOVE );
  997. continue;
  998. } // if( msg.wParam == VK_SHIFT || msg.wParam == VK_CONTROL )
  999. } // if( msg.message == WM_KEYDOWN || msg.message == WM_KEYUP )
  1000. bStopFlag = true;
  1001. }
  1002. break;
  1003. } // switch( msg.message )
  1004. if( bStopFlag )
  1005. {
  1006. rcResult.SetRect( 0, 0, 0, 0 );
  1007. break;
  1008. }
  1009. if( ! ::AfxGetThread() -> PumpMessage() )
  1010. break;
  1011. } // message loop
  1012. if( ! ::IsWindow( hWndOwn ) )
  1013. return CRect( 0, 0, 0, 0 );
  1014. _StatusLL_Clear();
  1015. CExtMouseCaptureSink::ReleaseCapture();
  1016. rcResult.NormalizeRect();
  1017. m_rcHelperDrawZoomRect.SetRectEmpty();
  1018. if( rcResult.IsRectEmpty() )
  1019. rcResult.SetRect( 0, 0, 0, 0 );
  1020. else
  1021. {
  1022. if( bUseHalftone )
  1023. {
  1024. CDC * pDC = GetDCEx( NULL, dwDCX );
  1025. ASSERT( pDC->GetSafeHdc() != NULL );
  1026. CBrush * pBrushOld = pDC->SelectObject( &_brushHalftone );
  1027. pDC->PatBlt(
  1028. rcResult.left, rcResult.top, rcResult.Width(), rcResult.Height(),
  1029. PATINVERT
  1030. );
  1031. pDC->SelectObject( pBrushOld );
  1032. ReleaseDC( pDC );
  1033. } // if( bUseHalftone )
  1034. } // else from if( ! rcResult.IsRectEmpty() )
  1035. OnSwDoRedraw();
  1036. OnSwUpdateWindow();
  1037. return rcResult;
  1038. }
  1039. INT CChildView::GetObjectCount() const
  1040. {
  1041. ASSERT_VALID( this );
  1042. INT nObjectCount = INT( m_arrObjects.GetSize() );
  1043. return nObjectCount;
  1044. }
  1045. const CChildView::GEODESIC_OBJECT & CChildView::GetObjectAt( INT nObjectIndex ) const
  1046. {
  1047. ASSERT_VALID( this );
  1048. return ( const_cast < CChildView * > ( this ) ) -> GetObjectAt( nObjectIndex );
  1049. }
  1050. CChildView::GEODESIC_OBJECT & CChildView::GetObjectAt( INT nObjectIndex )
  1051. {
  1052. ASSERT_VALID( this );
  1053. ASSERT(
  1054. 0 <= nObjectIndex
  1055. && nObjectIndex < INT( m_arrObjects.GetSize() )
  1056. );
  1057. GEODESIC_OBJECT & _object = m_arrObjects.ElementAt( nObjectIndex );
  1058. return _object;
  1059. }
  1060. CSize CChildView::OnSwGetTotalSize() const
  1061. {
  1062. CSize _size = m_bmp.GetSize();
  1063. _size.cx = INT( double(_size.cx) * m_lfZoomFactor );
  1064. _size.cy = INT( double(_size.cy) * m_lfZoomFactor );
  1065. return _size;
  1066. }
  1067. void CChildView::OnSwSetScrollPos( POINT pt )
  1068. {
  1069. m_bmpCache.Empty();
  1070. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  1071. CExtWRB < CExtScrollWnd > :: OnSwSetScrollPos( pt );
  1072. }
  1073. bool CChildView::OnSwDoScrollBy(
  1074. CSize sizeScroll,
  1075. bool bDoScroll // = true
  1076. )
  1077. {
  1078. m_bmpCache.Empty();
  1079. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  1080. CExtWRB < CExtScrollWnd > :: OnSwDoScrollBy( sizeScroll, bDoScroll );
  1081. return true;
  1082. }
  1083. CRect CChildView::OnSwRecalcLayout(
  1084. bool bDoLayout,
  1085. LPCRECT pRectClientSrc
  1086. )
  1087. {
  1088. CRect rc = CExtWRB < CExtScrollWnd > :: OnSwRecalcLayout( bDoLayout, pRectClientSrc ); 
  1089. return rc;
  1090. }
  1091. void CChildView::OnSwPaintAreaBetweenScrollBarWindows(
  1092. CDC & dc,
  1093. const RECT & rcAreaBetweenScrollBarWindows
  1094. )
  1095. {
  1096. dc.FillSolidRect(
  1097. &rcAreaBetweenScrollBarWindows,
  1098. g_PaintManager->GetColor( COLOR_3DFACE )
  1099. );
  1100. }
  1101. void CChildView::OnSwPaint( CDC & dc )
  1102. {
  1103. CRect rcClient;
  1104. GetClientRect( &rcClient );
  1105. if( ! m_bmpCache.IsEmpty() )
  1106. {
  1107. CSize _sizeBmp = m_bmpCache.GetSize();
  1108. CSize _sizeClient = rcClient.Size();
  1109. if( _sizeBmp != _sizeClient )
  1110. {
  1111. m_bmpCache.Empty();
  1112. m_ptLastStatusLL.x = m_ptLastStatusLL.y = -1;
  1113. }
  1114. } // if( ! m_bmpCache.IsEmpty() )
  1115. if( m_bmpCache.IsEmpty() )
  1116. {
  1117. CRect rcClipBox;
  1118. dc.GetClipBox( &rcClipBox );
  1119. COLORREF clrBk =
  1120. g_PaintManager->GetColor(
  1121. CExtPaintManager::CLR_3DFACE_OUT
  1122. );
  1123. CPoint ptVpRestore = dc.SetViewportOrg( 0, 0 );
  1124. // if( ! g_PaintManager->PaintDocumentClientAreaBkgnd(
  1125. // dc,
  1126. // this
  1127. // )
  1128. // )
  1129. if( ! g_PaintManager->PaintDockerBkgnd(
  1130. true,
  1131. dc,
  1132. this
  1133. )
  1134. )
  1135. {
  1136. CPoint ptScrollPos = OnSwGetScrollPos();
  1137. dc.FillSolidRect(
  1138. &rcClipBox,
  1139. clrBk
  1140. );
  1141. }
  1142. dc.SetViewportOrg( ptVpRestore );
  1143. if( ! m_bmp.IsEmpty() )
  1144. {
  1145. CSize _sizeSrc = m_bmp.GetSize();
  1146. CSize _sizeDst(
  1147. INT( double(_sizeSrc.cx) * m_lfZoomFactor ),
  1148. INT( double(_sizeSrc.cy) * m_lfZoomFactor )
  1149. );
  1150. CRect rcSrc( 0, 0, _sizeSrc.cx, _sizeSrc.cy );
  1151. CRect rcDst( 0, 0, _sizeDst.cx, _sizeDst.cy );
  1152. int nOldStretchBltMode = ::GetStretchBltMode( dc.m_hDC );
  1153. ::SetStretchBltMode(
  1154. dc.m_hDC,
  1155. ( m_bEnableHalftoning && g_PaintManager.m_bIsWinNT )
  1156. ? HALFTONE
  1157. : COLORONCOLOR
  1158. );
  1159. m_bmp.Draw( dc.m_hDC, rcDst, rcSrc );
  1160. ::SetStretchBltMode(
  1161. dc.m_hDC,
  1162. nOldStretchBltMode
  1163. );
  1164. CPoint ptScrollPos = OnSwGetScrollPos();
  1165. CRect rcRenderArea( 0, 0, min(rcClient.Width(),_sizeDst.cx), min(rcClient.Height(),_sizeDst.cy) );
  1166. rcRenderArea.OffsetRect( ptScrollPos );
  1167. GEODESIC_RECT grVisibleArea = ClientToGeodesic( rcRenderArea );
  1168. INT nObjectIndex, nObjectCount = GetObjectCount();
  1169. COLORREF arrClrShadeAccentLightOuter[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ];
  1170. COLORREF arrClrShadeAccentDarkOuter[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ];
  1171. COLORREF arrClrShadeAccentLightInner[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ];
  1172. COLORREF arrClrShadeAccentDarkInner[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ];
  1173. CBrush arrBrushes[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ];
  1174. INT nColorIndex, nColorCount = INT( sizeof(arrBrushes)/sizeof(arrBrushes[0]) );
  1175. for( nColorIndex = 0; nColorIndex < nColorCount; nColorIndex ++ )
  1176. {
  1177. arrBrushes[nColorIndex].CreateSolidBrush( g_arrClrBk[nColorIndex] );
  1178. arrClrShadeAccentLightOuter[nColorIndex] = CExtBitmap::stat_HLS_Adjust( g_arrClrBk[nColorIndex], 0.0, 0.25, 0.0 );
  1179. arrClrShadeAccentDarkOuter[nColorIndex] = CExtBitmap::stat_HLS_Adjust( g_arrClrBk[nColorIndex], 0.0, -0.35, 0.0 );
  1180. if( g_arrRadiuses[nColorIndex >= 5] )
  1181. {
  1182. arrClrShadeAccentLightInner[nColorIndex] = CExtBitmap::stat_HLS_Adjust( g_arrClrBk[nColorIndex], 0.0, 0.15, 0.0 );
  1183. arrClrShadeAccentDarkInner[nColorIndex] = CExtBitmap::stat_HLS_Adjust( g_arrClrBk[nColorIndex], 0.0, -0.15, 0.0 );
  1184. }
  1185. else
  1186. {
  1187. arrClrShadeAccentLightInner[nColorIndex] = COLORREF(-1L);
  1188. arrClrShadeAccentDarkInner[nColorIndex] = COLORREF(-1L);
  1189. }
  1190. } // for( nColorIndex = 0; nColorIndex < nColorCount; nColorIndex ++ )
  1191. if( m_eSTOT != __ESTOT_HIDE_ALL )
  1192. {
  1193. HGDIOBJ hOldPen = ::SelectObject( dc.m_hDC, ::GetStockObject( NULL_PEN ) );
  1194. CBrush * pOldBrush = NULL;
  1195. for( nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex ++ )
  1196. {
  1197. const GEODESIC_OBJECT & _object = GetObjectAt( nObjectIndex );
  1198. ASSERT( 0 <= _object.m_nLevel && _object.m_nLevel <= 3 );
  1199. if( ! grVisibleArea.PtInRect( _object.m_gp ) )
  1200. continue;
  1201. CPoint ptObject( GeodesicToClient( _object.m_gp ) );
  1202. if( m_eSTOT == __ESTOT_ALPHA_BMP )
  1203. {
  1204. CExtBitmap & _bmp = m_arrObjectBmps[_object.m_nLevel];
  1205. CPoint & _ptBmpOffset = m_arrObjectBmpOffsets[_object.m_nLevel];
  1206. CSize & _sizeBmp = m_arrObjectBmpSize[_object.m_nLevel];
  1207. CRect rcDst( CPoint( ptObject - _ptBmpOffset ), _sizeBmp );
  1208. _bmp.AlphaBlend(
  1209. dc.m_hDC,
  1210. rcDst
  1211. );
  1212. } // if( m_eSTOT == __ESTOT_ALPHA_BMP )
  1213. else
  1214. {
  1215. INT nRadius = g_arrRadiuses[_object.m_nLevel];
  1216. if( m_eSTOT == __ESTOT_ELLIPSE_FLAT
  1217. || m_eSTOT == __ESTOT_ELLIPSE_SOLID
  1218. )
  1219. {
  1220. pOldBrush = dc.SelectObject( &(arrBrushes[_object.m_nLevel]) );
  1221. dc.Ellipse(
  1222. ptObject.x - nRadius,
  1223. ptObject.y - nRadius,
  1224. ptObject.x + nRadius + 1,
  1225. ptObject.y + nRadius + 1
  1226. );
  1227. dc.SelectObject( pOldBrush );
  1228. }
  1229. if( m_eSTOT != __ESTOT_ELLIPSE_FLAT )
  1230. CExtPaintManager::stat_PaintShadedEllipse(
  1231. dc.m_hDC,
  1232. ptObject,
  1233. nRadius,
  1234. nRadius,
  1235. arrClrShadeAccentLightOuter[_object.m_nLevel],
  1236. arrClrShadeAccentDarkOuter[_object.m_nLevel]
  1237. );
  1238. if( m_eSTOT == __ESTOT_ELLIPSE_SOLID )
  1239. {
  1240. if( arrClrShadeAccentLightInner[_object.m_nLevel] != COLORREF(-1L) )
  1241. {
  1242. ASSERT( arrClrShadeAccentDarkInner[_object.m_nLevel] != COLORREF(-1L) );
  1243. CExtPaintManager::stat_PaintShadedEllipse(
  1244. dc.m_hDC,
  1245. ptObject,
  1246. nRadius - 1,
  1247. nRadius - 1,
  1248. arrClrShadeAccentLightInner[_object.m_nLevel],
  1249. arrClrShadeAccentDarkInner[_object.m_nLevel]
  1250. );
  1251. } // if( arrClrShadeAccentLightInner[_object.m_nLevel] != COLORREF(-1L) )
  1252. }
  1253. } // else from if( m_eSTOT == __ESTOT_ALPHA_BMP )
  1254. } // for( nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex ++ )
  1255. ::SelectObject( dc.m_hDC, hOldPen );
  1256. } // if( m_eSTOT != __ESTOT_HIDE_ALL )
  1257. if( ( m_lfZoomFactor >= (0.5)
  1258. && m_eSTLT == CChildView::__ESTLT_BY_ZOOM
  1259. )
  1260. || m_eSTLT == CChildView::__ESTLT_SHOW_ALL
  1261. )
  1262. { // if show at least any text labels
  1263. int nBkMode = dc.SetBkMode( TRANSPARENT );
  1264. LOGFONT _lf = { 0 };
  1265. g_PaintManager->m_FontNormal.GetLogFont( &_lf );
  1266. CFont arrFonts[ sizeof(g_arrClrBk)/sizeof(g_arrClrBk[0]) ];
  1267. INT nFontIndex, nFontCount = sizeof(arrFonts)/sizeof(arrFonts[0]);
  1268. for( nFontIndex = 0; nFontIndex < nFontCount; nFontIndex ++ )
  1269. {
  1270. if( nFontIndex > 0 )
  1271. {
  1272. _lf.lfWidth  = ::MulDiv( _lf.lfWidth,  nFontIndex + 5, nFontIndex + 4 );
  1273. _lf.lfHeight = ::MulDiv( _lf.lfHeight, nFontIndex + 5, nFontIndex + 4 );
  1274. if( nFontIndex >= 3 )
  1275. _lf.lfWeight = 900;
  1276. else if( nFontIndex >= 2 )
  1277. _lf.lfWeight = 500;
  1278. }
  1279. arrFonts[nFontIndex].CreateFontIndirect( &_lf );
  1280. } // for( nFontIndex = 0; nFontIndex < nFontCount; nFontIndex ++ )
  1281. bool bDwmMode = false;
  1282. if( m_bEnableVistaTextRendering
  1283. && g_PaintManager.m_bIsWinVistaOrLater
  1284. && g_PaintManager.m_DWM.IsCompositionEnabled()
  1285. && g_PaintManager.m_pfnMsImgAlphaBlend != NULL
  1286. && g_PaintManager.m_UxTheme.OpenThemeDataEx(
  1287. m_hWnd,
  1288. __EXT_UX_LPCWSTR( VSCLASS_WINDOW ),
  1289. 0
  1290. ) != NULL
  1291. )
  1292. bDwmMode = true;
  1293. for( nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex ++ )
  1294. {
  1295. const GEODESIC_OBJECT & _object = GetObjectAt( nObjectIndex );
  1296. ASSERT( 0 <= _object.m_nLevel && _object.m_nLevel <= 3 );
  1297. if( _object.m_strName.IsEmpty() )
  1298. continue;
  1299. if( ! grVisibleArea.PtInRect( _object.m_gp ) )
  1300. continue;
  1301. CPoint ptObject( GeodesicToClient( _object.m_gp ) );
  1302. if( m_eSTLT == CChildView::__ESTLT_BY_ZOOM
  1303. && m_lfZoomFactor < g_arrVZF[_object.m_nLevel]
  1304. )
  1305. continue;
  1306. INT nRadius = g_arrRadiuses[_object.m_nLevel];
  1307. CRect rcText(
  1308. ptObject.x + nRadius,
  1309. ptObject.y + nRadius,
  1310. ptObject.x + nRadius + 1000,
  1311. ptObject.y + nRadius + 1000
  1312. );
  1313. if( bDwmMode )
  1314. {
  1315. CExtUxTheme::__EXT_UX_DTTOPTS dtoMeasure = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  1316. dtoMeasure.dwFlags = __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE;
  1317. dtoMeasure.iGlowSize = g_arrDwmGlowSizes[_object.m_nLevel];
  1318. CRect rcTextMeasure;
  1319. rcTextMeasure.SetRect( 0, 0, 0, 0 );
  1320. CFont * pOldFont = dc.SelectObject( &(arrFonts[_object.m_nLevel]) );
  1321. g_PaintManager.m_UxTheme.GetThemeTextExtent(
  1322. dc.m_hDC,
  1323. 0,
  1324. 0,
  1325. _object.m_strName,
  1326. -1,
  1327. DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX|DT_CALCRECT,
  1328. NULL,
  1329. &rcTextMeasure
  1330. );
  1331. dc.SelectObject( pOldFont );
  1332. rcText.right = rcText.left + rcTextMeasure.Width();
  1333. rcText.bottom = rcText.top + rcTextMeasure.Height();
  1334. rcText.InflateRect( g_arrDwmGlowSizes[_object.m_nLevel], g_arrDwmGlowSizes[_object.m_nLevel] );
  1335. CExtMemoryDC dc32(
  1336. &dc,
  1337. &rcText,
  1338. CExtMemoryDC::MDCOPT_TO_MEMORY
  1339. | CExtMemoryDC::MDCOPT_FORCE_DIB
  1340. | CExtMemoryDC::MDCOPT_DIB_NEGATIVE_HEIGHT
  1341. );
  1342. ASSERT( dc32.GetSafeHdc() != NULL );
  1343. dc32.BitBlt(
  1344. rcText.left,
  1345. rcText.top,
  1346. rcText.Width(),
  1347. rcText.Height(),
  1348. &dc,
  1349. rcText.left,
  1350. rcText.top,
  1351. SRCCOPY
  1352. );
  1353. pOldFont = dc32.SelectObject( &(arrFonts[_object.m_nLevel]) );
  1354. CExtUxTheme::__EXT_UX_DTTOPTS dto = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  1355. dto.dwFlags = __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE | __EXT_UX_DTT_TEXTCOLOR;
  1356. dto.iGlowSize = g_arrDwmGlowSizes[_object.m_nLevel];
  1357. dto.crText = RGB(0,0,0);
  1358. g_PaintManager.m_UxTheme.DrawThemeTextEx(
  1359. dc32.m_hDC,
  1360. 0,
  1361. 0,
  1362. _object.m_strName,
  1363. -1,
  1364. DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX,
  1365. rcText,
  1366. &dto
  1367. );
  1368. if( _object.m_nLevel == 3 )
  1369. {
  1370. g_PaintManager.m_UxTheme.DrawThemeTextEx(
  1371. dc32.m_hDC,
  1372. 0,
  1373. 0,
  1374. _object.m_strName,
  1375. -1,
  1376. DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX,
  1377. rcText,
  1378. &dto
  1379. );
  1380. } // if( _object.m_nLevel == 3 )
  1381. dc32.SelectObject( pOldFont );
  1382. } // if( bDwmMode )
  1383. else
  1384. {
  1385. CFont * pOldFont = dc.SelectObject( &(arrFonts[_object.m_nLevel]) );
  1386. COLORREF clrText1 = RGB(255,255,255);
  1387. COLORREF clrTextOld = dc.SetTextColor( clrText1 );
  1388. rcText.OffsetRect( -1, -1 );
  1389. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1390. rcText.OffsetRect( 1, 0 );
  1391. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1392. rcText.OffsetRect( 1, 0 );
  1393. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1394. rcText.OffsetRect( 0, 1 );
  1395. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1396. rcText.OffsetRect( 0, 1 );
  1397. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1398. rcText.OffsetRect( -1, 0 );
  1399. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1400. rcText.OffsetRect( -1, 0 );
  1401. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1402. rcText.OffsetRect( 0, -1 );
  1403. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1404. rcText.OffsetRect( 1, 0 );
  1405. COLORREF clrText2 = RGB(0,0,0);
  1406. dc.SetTextColor( clrText2 );
  1407. dc.DrawText( LPCTSTR(_object.m_strName), _object.m_strName.GetLength(), rcText, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOCLIP );
  1408. dc.SetTextColor( clrTextOld );
  1409. dc.SelectObject( pOldFont );
  1410. } // else from if( bDwmMode )
  1411. } // for( nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex ++ )
  1412. if( bDwmMode )
  1413. g_PaintManager.m_UxTheme.CloseThemeData();
  1414. dc.SetBkMode( nBkMode );
  1415. } // if show at least any text labels
  1416. } // if( ! m_bmp.IsEmpty() )
  1417. ptVpRestore = dc.SetViewportOrg( 0, 0 );
  1418. m_bmpCache.FromSurface( dc.m_hDC, rcClient );
  1419. dc.SetViewportOrg( ptVpRestore );
  1420. } // if( m_bmpCache.IsEmpty() )
  1421. else
  1422. {
  1423. CPoint ptVpRestore = dc.SetViewportOrg( 0, 0 );
  1424. m_bmpCache.Draw(
  1425. dc.m_hDC,
  1426. rcClient
  1427. );
  1428. dc.SetViewportOrg( ptVpRestore );
  1429. } // else from if( m_bmpCache.IsEmpty() )
  1430. if( ! m_rcHelperDrawZoomRect.IsRectEmpty() )
  1431. {
  1432. CRect rcDraw = m_rcHelperDrawZoomRect;
  1433. rcDraw.InflateRect( &m_rcHelperZoomRectPadding );
  1434. m_bmpHelperZoomRectHighlight.AlphaBlendSkinParts(
  1435. dc.m_hDC,
  1436. rcDraw,
  1437. m_rcHelperZoomRectPadding,
  1438. CExtBitmap::__EDM_STRETCH
  1439. );
  1440. }
  1441. }
  1442. void CChildView::OnHideAllTextLabels()
  1443. {
  1444. if( m_bmp.IsEmpty() )
  1445. return;
  1446. m_eSTLT = CChildView::__ESTLT_HIDE_ALL;
  1447. m_bmpCache.Empty();
  1448. OnSwDoRedraw();
  1449. }
  1450. void CChildView::OnUpdateHideAllTextLabels( CCmdUI * pCmdUI )
  1451. {
  1452. if( m_bmp.IsEmpty() )
  1453. {
  1454. pCmdUI->Enable( FALSE );
  1455. pCmdUI->SetRadio( 0 );
  1456. return;
  1457. }
  1458. pCmdUI->Enable();
  1459. pCmdUI->SetRadio( ( m_eSTLT == CChildView::__ESTLT_HIDE_ALL ) ? 1 : 0 );
  1460. }
  1461. void CChildView::OnShowTextLabelsWithZooming()
  1462. {
  1463. if( m_bmp.IsEmpty() )
  1464. return;
  1465. m_eSTLT = CChildView::__ESTLT_BY_ZOOM;
  1466. m_bmpCache.Empty();
  1467. OnSwDoRedraw();
  1468. }
  1469. void CChildView::OnUpdateShowTextLabelsZooming( CCmdUI * pCmdUI )
  1470. {
  1471. if( m_bmp.IsEmpty() )
  1472. {
  1473. pCmdUI->Enable( FALSE );
  1474. pCmdUI->SetRadio( 0 );
  1475. return;
  1476. }
  1477. pCmdUI->Enable();
  1478. pCmdUI->SetRadio( ( m_eSTLT == CChildView::__ESTLT_BY_ZOOM ) ? 1 : 0 );
  1479. }
  1480. void CChildView::OnShowAllTextLabels()
  1481. {
  1482. if( m_bmp.IsEmpty() )
  1483. return;
  1484. m_eSTLT = CChildView::__ESTLT_SHOW_ALL;
  1485. m_bmpCache.Empty();
  1486. OnSwDoRedraw();
  1487. }
  1488. void CChildView::OnUpdateShowAllTextLabels( CCmdUI * pCmdUI )
  1489. {
  1490. if( m_bmp.IsEmpty() )
  1491. {
  1492. pCmdUI->Enable( FALSE );
  1493. pCmdUI->SetRadio( 0 );
  1494. return;
  1495. }
  1496. pCmdUI->Enable();
  1497. pCmdUI->SetRadio( ( m_eSTLT == CChildView::__ESTLT_SHOW_ALL ) ? 1 : 0 );
  1498. }
  1499. BOOL CChildView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  1500. {
  1501. // return CExtScrollWnd ::OnSetCursor(pWnd, nHitTest, message);
  1502. pWnd;
  1503. nHitTest;
  1504. message;
  1505. if( m_nHT >= 0 )
  1506. {
  1507. const GEODESIC_OBJECT & _object = GetObjectAt( m_nHT );
  1508. if( ! _object.m_strURL.IsEmpty() )
  1509. {
  1510. ::SetCursor( ::AfxGetApp()->LoadCursor( IDC_EXT_HAND ) );
  1511. return TRUE;
  1512. }
  1513. }
  1514. ::SetCursor( ::LoadCursor( NULL, IDC_ARROW ) );
  1515. return TRUE;
  1516. }
  1517. void CChildView::OnVistaTextRendering() 
  1518. {
  1519. if( g_PaintManager.m_bIsWinVistaOrLater && g_PaintManager.m_DWM.IsCompositionEnabled() )
  1520. {
  1521. m_bEnableVistaTextRendering = ( ! m_bEnableVistaTextRendering );
  1522. m_bmpCache.Empty();
  1523. OnSwDoRedraw();
  1524. }
  1525. }
  1526. void CChildView::OnUpdateVistaTextRendering(CCmdUI* pCmdUI) 
  1527. {
  1528. if( g_PaintManager.m_bIsWinVistaOrLater && g_PaintManager.m_DWM.IsCompositionEnabled() )
  1529. {
  1530. pCmdUI->Enable();
  1531. pCmdUI->SetCheck( m_bEnableVistaTextRendering ? 1 : 0 );
  1532. }
  1533. else
  1534. {
  1535. pCmdUI->Enable( FALSE );
  1536. }
  1537. }
  1538. void CChildView::OnHalftoning() 
  1539. {
  1540. if( g_PaintManager.m_bIsWinNT )
  1541. {
  1542. m_bEnableHalftoning = ( ! m_bEnableHalftoning );
  1543. m_bmpCache.Empty();
  1544. OnSwDoRedraw();
  1545. }
  1546. }
  1547. void CChildView::OnUpdateHalftoning(CCmdUI* pCmdUI) 
  1548. {
  1549. if( g_PaintManager.m_bIsWinNT )
  1550. {
  1551. pCmdUI->Enable();
  1552. pCmdUI->SetCheck( m_bEnableHalftoning ? 1 : 0 );
  1553. }
  1554. else
  1555. {
  1556. pCmdUI->Enable( FALSE );
  1557. }
  1558. }
  1559. void CChildView::OnObjectHideAll() 
  1560. {
  1561. if( m_eSTOT == __ESTOT_HIDE_ALL )
  1562. return;
  1563. m_eSTOT = __ESTOT_HIDE_ALL;
  1564. m_bmpCache.Empty();
  1565. OnSwDoRedraw();
  1566. }
  1567. void CChildView::OnUpdateObjectHideAll(CCmdUI* pCmdUI) 
  1568. {
  1569. pCmdUI->Enable();
  1570. pCmdUI->SetRadio( ( m_eSTOT == __ESTOT_HIDE_ALL ) ? TRUE : FALSE );
  1571. }
  1572. void CChildView::OnObjectEllipseFlat() 
  1573. {
  1574. if( m_eSTOT == __ESTOT_ELLIPSE_FLAT )
  1575. return;
  1576. m_eSTOT = __ESTOT_ELLIPSE_FLAT;
  1577. m_bmpCache.Empty();
  1578. OnSwDoRedraw();
  1579. }
  1580. void CChildView::OnUpdateObjectEllipseFlat(CCmdUI* pCmdUI) 
  1581. {
  1582. pCmdUI->Enable();
  1583. pCmdUI->SetRadio( ( m_eSTOT == __ESTOT_ELLIPSE_FLAT ) ? TRUE : FALSE );
  1584. }
  1585. void CChildView::OnObjectEllipseCircle() 
  1586. {
  1587. if( m_eSTOT == __ESTOT_ELLIPSE_CIRCLE )
  1588. return;
  1589. m_eSTOT = __ESTOT_ELLIPSE_CIRCLE;
  1590. m_bmpCache.Empty();
  1591. OnSwDoRedraw();
  1592. }
  1593. void CChildView::OnUpdateObjectEllipseCircle(CCmdUI* pCmdUI) 
  1594. {
  1595. pCmdUI->Enable();
  1596. pCmdUI->SetRadio( ( m_eSTOT == __ESTOT_ELLIPSE_CIRCLE ) ? TRUE : FALSE );
  1597. }
  1598. void CChildView::OnObjectEllipseSolid() 
  1599. {
  1600. if( m_eSTOT == __ESTOT_ELLIPSE_SOLID )
  1601. return;
  1602. m_eSTOT = __ESTOT_ELLIPSE_SOLID;
  1603. m_bmpCache.Empty();
  1604. OnSwDoRedraw();
  1605. }
  1606. void CChildView::OnUpdateObjectEllipseSolid(CCmdUI* pCmdUI) 
  1607. {
  1608. pCmdUI->Enable();
  1609. pCmdUI->SetRadio( ( m_eSTOT == __ESTOT_ELLIPSE_SOLID ) ? TRUE : FALSE );
  1610. }
  1611. void CChildView::OnObjectAlphaBmp() 
  1612. {
  1613. if( m_eSTOT == __ESTOT_ALPHA_BMP )
  1614. return;
  1615. m_eSTOT = __ESTOT_ALPHA_BMP;
  1616. m_bmpCache.Empty();
  1617. OnSwDoRedraw();
  1618. }
  1619. void CChildView::OnUpdateObjectAlphaBmp(CCmdUI* pCmdUI) 
  1620. {
  1621. pCmdUI->Enable();
  1622. pCmdUI->SetRadio( ( m_eSTOT == __ESTOT_ALPHA_BMP ) ? TRUE : FALSE );
  1623. }
  1624. void CChildView::OnShowTrackingTooltipOnZoomScrollbar() 
  1625. {
  1626. m_wndZoomer.m_bEnabledTrackingToolTips = (! m_wndZoomer.m_bEnabledTrackingToolTips );
  1627. _UpdateZoomerTT();
  1628. }
  1629. void CChildView::OnUpdateShowTrackingTooltipOnZoomScrollbar(CCmdUI* pCmdUI) 
  1630. {
  1631. pCmdUI->Enable();
  1632. pCmdUI->SetCheck( m_wndZoomer.m_bEnabledTrackingToolTips ? 1 : 0 );
  1633. }