XTPPreviewView.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:23k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPPreviewView.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPResourceManager.h"
  24. #include "XTPPreviewView.h"
  25. #include "XTPControlExt.h"
  26. #include "XTPControls.h"
  27. #include "XTPControlPopup.h"
  28. #include "XTPControlEdit.h"
  29. #include "XTPControlComboBox.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. //////////////////////////////////////////////////////////////////////////
  36. // CControlPageSelector
  37. class CControlPageSelector : public CXTPControlSelector
  38. {
  39. public:
  40. CControlPageSelector();
  41. void OnDrawItem(CDC* pDC, CRect rcItem, COLORREF clrText);
  42. };
  43. CControlPageSelector::CControlPageSelector()
  44. {
  45. m_szItemsCount = CSize(3, 3);
  46. m_szItemsMax = CSize(3, 3);
  47. m_szItem = CSize(32, 32);
  48. }
  49. void CControlPageSelector::OnDrawItem(CDC* pDC, CRect rcItem, COLORREF clrText)
  50. {
  51. rcItem.DeflateRect(3, 4, 3, 4);
  52. for (int y = rcItem.top, i = 0; y < rcItem.bottom; y += 3, i++)
  53. {
  54. pDC->FillSolidRect(rcItem.left, y, (i + 1) % 5 == 0? rcItem.Width() / 2: rcItem.Width(), 1, clrText);
  55. }
  56. }
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CXTPPreviewView
  59. IMPLEMENT_DYNCREATE(CXTPPreviewView, CPreviewView)
  60. CXTPPreviewView::CXTPPreviewView()
  61. {
  62. // replace the PAGE_INFO array with our one to make sure its large enough
  63. m_pPageInfo = m_pageInfoArray2;
  64. m_Across = 1;           // default number of pages across the screen
  65. m_Down = 1;         // default number of pages down the screen
  66. m_nPages = 1;
  67. AfxGetApp()->m_nNumPreviewPages = 1;
  68. m_nZoomOutPages = 1;
  69. HWND hWnd = ::GetDesktopWindow();
  70. HDC hDCScreen = ::GetDC(hWnd);
  71. ASSERT(hDCScreen != NULL);
  72. m_cxPixelsPerInch = GetDeviceCaps(hDCScreen, LOGPIXELSX);
  73. m_cyPixelsPerInch = GetDeviceCaps(hDCScreen, LOGPIXELSY);
  74. ::ReleaseDC(hWnd, hDCScreen);
  75. }
  76. BEGIN_MESSAGE_MAP(CXTPPreviewView, CPreviewView)
  77. //{{AFX_MSG_MAP(CXTPPreviewView)
  78. ON_WM_CREATE()
  79. ON_WM_WINDOWPOSCHANGED()
  80. ON_WM_PAINT()
  81. ON_WM_ERASEBKGND()
  82. ON_WM_LBUTTONDOWN()
  83. ON_WM_SETCURSOR()
  84. ON_WM_VSCROLL()
  85. ON_WM_SIZE()
  86. ON_COMMAND(AFX_ID_PREVIEW_NUMPAGE, OnNumPageChange)
  87. ON_COMMAND(XTP_ID_PREVIEW_ZOOMIN, OnZoomIn)
  88. ON_COMMAND(XTP_ID_PREVIEW_ZOOMOUT, OnZoomOut)
  89. ON_COMMAND(XTP_ID_PREVIEW_CLOSE, CPreviewView::OnPreviewClose)
  90. ON_COMMAND(XTP_ID_PREVIEW_NEXT, CPreviewView::OnNextPage)
  91. ON_COMMAND(XTP_ID_PREVIEW_PREV, CPreviewView::OnPrevPage)
  92. ON_COMMAND(XTP_ID_PREVIEW_PRINT, CPreviewView::OnPreviewPrint)
  93. ON_COMMAND(XTP_ID_PREVIEW_ONEPAGE, OnOnePage)
  94. ON_UPDATE_COMMAND_UI(AFX_ID_PREVIEW_NUMPAGE, OnUpdateNumPageChange)
  95. ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_ZOOMIN, OnUpdateZoomIn)
  96. ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_ZOOMOUT, OnUpdateZoomOut)
  97. ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_NEXT, CPreviewView::OnUpdateNextPage)
  98. ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_PREV, CPreviewView::OnUpdatePrevPage)
  99. ON_NOTIFY(EN_SETFOCUS, XTP_ID_PREVIEW_GOTOPAGE, OnGotoPageSetFocus)
  100. ON_NOTIFY(EN_KILLFOCUS, XTP_ID_PREVIEW_GOTOPAGE, OnGotoPageKillFocus)
  101. ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_GOTOPAGE, OnUpdateGotoPage)
  102. ON_XTP_EXECUTE(XTP_ID_PREVIEW_ZOOMCOMBO, OnZoomCombo)
  103. ON_XTP_EXECUTE(XTP_ID_PREVIEW_TWOPAGE, OnTwoPage)
  104. //}}AFX_MSG_MAP
  105. END_MESSAGE_MAP()
  106. UINT nDefaultZooms[] = {10, 25, 50, 75, 100, 150, 200, 500};
  107. int CXTPPreviewView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  108. {
  109. if (CPreviewView::OnCreate(lpCreateStruct) == -1)
  110. return -1;
  111. ASSERT_VALID (m_pToolBar); // dialog bar must be valid.
  112. // Create the toolbar that is used in the dialog bar.
  113. if (!m_wndToolBar.CreateToolBar( WS_CHILD | WS_VISIBLE | CBRS_TOP
  114. | CBRS_GRIPPER | CBRS_TOOLTIPS, m_pToolBar) ||
  115. !m_wndToolBar.LoadToolBar( XTP_IDR_PREVIEW_TOOLBAR ) )
  116. {
  117. TRACE0("Failed to create toolbarn");
  118. return -1;      // fail to create
  119. }
  120. m_wndToolBar.SetOwner(this);
  121. // display text for print and close buttons.
  122. FindToolbarButton(XTP_ID_PREVIEW_PRINT)->SetStyle(xtpButtonIconAndCaption);
  123. FindToolbarButton(XTP_ID_PREVIEW_CLOSE)->SetStyle(xtpButtonIconAndCaption);
  124. CXTPControlPopup* pTwoPages = (CXTPControlPopup*)m_wndToolBar.GetControls()->SetControlType(FindToolbarButton(XTP_ID_PREVIEW_TWOPAGE), xtpControlButtonPopup);
  125. pTwoPages->GetCommandBar()->GetControls()->Add(new CControlPageSelector(), XTP_ID_PREVIEW_TWOPAGE);
  126. pTwoPages->GetCommandBar()->SetShowGripper(FALSE);
  127. CXTPControlEdit* pControlGotoPage = (CXTPControlEdit*)m_wndToolBar.GetControls()->SetControlType(FindToolbarButton(XTP_ID_PREVIEW_GOTOPAGE), xtpControlEdit);
  128. pControlGotoPage->SetWidth(100);
  129. CXTPControlComboBox* pControlZoom = (CXTPControlComboBox*)m_wndToolBar.GetControls()->SetControlType(FindToolbarButton(XTP_ID_PREVIEW_ZOOMCOMBO), xtpControlComboBox);
  130. pControlZoom->SetWidth(100);
  131. pControlZoom->SetDropDownListStyle();
  132. pControlZoom->AddString(XTPResourceManager()->LoadString(XTP_IDS_PREVIEW_WHOLEPAGE));
  133. pControlZoom->AddString(XTPResourceManager()->LoadString(XTP_IDS_PREVIEW_PAGEWIDTH));
  134. for (int i = 0; i < _countof(nDefaultZooms); i++)
  135. {
  136. CString strZoom;
  137. strZoom.Format(_T("%i%%"), nDefaultZooms[i]);
  138. int nIndex = pControlZoom->AddString(strZoom);
  139. pControlZoom->SetItemData(nIndex, nDefaultZooms[i]);
  140. }
  141. pControlZoom->SetCurSel(0);
  142. return 0;
  143. }
  144. CXTPControl* CXTPPreviewView::FindToolbarButton(UINT nCommandID)
  145. {
  146. return m_wndToolBar.GetControls()->FindControl(nCommandID);
  147. }
  148. void CXTPPreviewView::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
  149. {
  150. CPreviewView::OnWindowPosChanged(lpwndpos);
  151. // If the toolbar is a window...
  152. if ( ::IsWindow( m_wndToolBar.m_hWnd ) )
  153. {
  154. // Get a pointer to the parent frame.
  155. CFrameWnd* pFrameWnd = m_pToolBar->GetDockingFrame( );
  156. ASSERT_VALID( pFrameWnd );
  157. // Get the size of the client area for the docking frame.
  158. CRect r;
  159. pFrameWnd->GetClientRect( &r );
  160. // Calculate the actual size of the toolbar.
  161. CSize size = m_wndToolBar.CalcDockingLayout(r.Width(), /*LM_HIDEWRAP| */ LM_HORZDOCK | LM_HORZ | LM_COMMIT);
  162. size.cx = r.Width( );
  163. // Set the height of the dialog bar equal to the
  164. // toolbar's height.
  165. m_pToolBar->m_sizeDefault.cy = size.cy;
  166. // Reposition the toolbar.
  167. m_wndToolBar.MoveWindow( 0, 0, size.cx, size.cy );
  168. m_wndToolBar.Invalidate(FALSE);
  169. }
  170. }
  171. void CXTPPreviewView::OnPaint()
  172. {
  173. // standard paint routine
  174. CPaintDC dc(this);
  175. CXTPClientRect rc(this);
  176. CXTPBufferDC memDC(dc, rc);
  177. // Fill background with APPWORKSPACE
  178. memDC.FillSolidRect(rc, GetSysColor(COLOR_APPWORKSPACE));
  179. int nMapMode = memDC.GetMapMode();
  180. OnPrepareDC(&memDC);
  181. OnDraw(&memDC);
  182. memDC.SetViewportOrg(CPoint(0, 0));
  183. memDC.SetMapMode(nMapMode);
  184. }
  185. BOOL CXTPPreviewView::OnEraseBkgnd(CDC*)
  186. {
  187. return TRUE;
  188. }
  189. BOOL CXTPPreviewView::PreCreateWindow(CREATESTRUCT& cs)
  190. {
  191. return CPreviewView::PreCreateWindow(cs);
  192. }
  193. #ifdef _DEBUG
  194. void CXTPPreviewView::AssertValid() const
  195. {
  196. // Bug nearby Article ID: Q192853
  197. //  CPreviewView::AssertValid();
  198. }
  199. void CXTPPreviewView::Dump(CDumpContext& dc) const
  200. {
  201. CPreviewView::Dump(dc);
  202. }
  203. #endif //_DEBUG
  204. BOOL CXTPPreviewView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  205. {
  206. if (nHitTest != HTCLIENT)
  207. return CScrollView::OnSetCursor(pWnd, nHitTest, message);
  208. CPoint point;
  209. ::GetCursorPos(&point);
  210. ScreenToClient(&point);     // client coordinates of mouse position
  211. UINT nPage;
  212. if (m_nZoomState < 500 &&
  213. FindPageRect(point, nPage))
  214. {                       // On a page and not zoomed all the way in
  215. if (m_hMagnifyCursor == NULL)
  216. {
  217. HINSTANCE hInst = AfxFindResourceHandle(
  218. MAKEINTRESOURCE(AFX_IDC_MAGNIFY), RT_GROUP_CURSOR);
  219. m_hMagnifyCursor = ::LoadCursor(hInst,
  220. MAKEINTRESOURCE(AFX_IDC_MAGNIFY));
  221. }
  222. ::SetCursor(m_hMagnifyCursor);
  223. }
  224. else
  225. {
  226. ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
  227. }
  228. return 0;
  229. }
  230. void CXTPPreviewView::OnLButtonDown(UINT, CPoint point)
  231. {
  232. UINT nPage;
  233. if (!FindPageRect(point, nPage))
  234. {
  235. return;                         // Didn't click on a page
  236. }
  237. // Set new zoom state
  238. ZoomIn(nPage, point);
  239. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE)
  240. {
  241. // make sure the current page does not cause blank pages to be shown
  242. if (m_nCurrentPage >= m_pPreviewInfo->GetMaxPage() - m_nPages)
  243. m_nCurrentPage = m_pPreviewInfo->GetMaxPage() - m_nPages + 1;
  244. if (m_nCurrentPage < 0)
  245. m_nCurrentPage = 0 ;
  246. }
  247. }
  248. void CXTPPreviewView::SetZoomState(UINT nNewState, UINT nPage, CPoint point)
  249. {
  250. if (m_nZoomState != nNewState)
  251. {
  252. CXTPControlComboBox* pControlCombo = (CXTPControlComboBox*)FindToolbarButton(XTP_ID_PREVIEW_ZOOMCOMBO);
  253. if (nNewState == XPT_ZOOM_WHOLEPAGE)
  254. {
  255. pControlCombo->SetCurSel(0);
  256. }
  257. else
  258. {
  259. for (int i = 0; i < pControlCombo->GetCount(); i++)
  260. {
  261. if (pControlCombo->GetItemData(i) == nNewState)
  262. {
  263. pControlCombo->SetCurSel(i);
  264. break;
  265. }
  266. }
  267. }
  268. m_nZoomState = nNewState;
  269. DoZoom(nPage, point);
  270. }
  271. }
  272. // Actual zoom code.
  273. void CXTPPreviewView::DoZoom(UINT nPage, CPoint point)
  274. {
  275. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE)
  276. {
  277. // taking over scroll bars
  278. m_nPages = m_nZoomOutPages;
  279. ShowScrollBar(SB_HORZ, FALSE);      // hide the horizontal bar
  280. BOOL bShowBar = m_pPreviewInfo->GetMaxPage() < 0x8000 &&
  281. m_pPreviewInfo->GetMaxPage() -
  282. m_pPreviewInfo->GetMinPage() <= 32767U;
  283. ShowScrollBar(SB_VERT, bShowBar);       // Show the vertical bar
  284. if (bShowBar)
  285. {
  286. SCROLLINFO info;
  287. info.fMask = SIF_PAGE | SIF_RANGE;
  288. info.nMin = m_pPreviewInfo->GetMinPage();
  289. info.nMax = m_pPreviewInfo->GetMaxPage();
  290. info.nPage = 1;
  291. if (!SetScrollInfo(SB_VERT, &info, FALSE))
  292. SetScrollRange(SB_VERT, info.nMin, info.nMax, FALSE);
  293. }
  294. SetCurrentPage(m_nCurrentPage, TRUE);
  295. SetupScrollbar() ;
  296. }
  297. else
  298. {
  299. ShowScrollBar(SB_HORZ, FALSE);
  300. m_nPages = 1;       // only one page in zoomed states
  301. m_pPageInfo[0].sizeZoomOutRatio = m_pPageInfo[nPage].sizeZoomOutRatio;
  302. m_pPageInfo[0].sizeUnscaled = m_pPageInfo[nPage].sizeUnscaled;
  303. // Sets the printer page
  304. SetCurrentPage(m_nCurrentPage + nPage, FALSE);
  305. SetScaledSize(0);
  306. CSize* pRatio = &m_pPageInfo[nPage].sizeScaleRatio;
  307. // convert Hit Point from screen 1:1
  308. point.x = MulDiv(point.x, pRatio->cx, pRatio->cy);
  309. point.y = MulDiv(point.y, pRatio->cx, pRatio->cy);
  310. // Adjust point for page position
  311. point += (CSize)m_pPageInfo[0].rectScreen.TopLeft();
  312. // Scroll to center
  313. CenterOnPoint(point);
  314. }
  315. }
  316. void CXTPPreviewView::PositionPage(UINT nPage)
  317. {
  318. CSize windowSize = CalcPageDisplaySize();
  319. VERIFY(m_dcPrint.Escape(GETPHYSPAGESIZE, 0, NULL, (LPVOID)&m_pPageInfo[nPage].sizeUnscaled));
  320. CSize* pSize = &m_pPageInfo[nPage].sizeUnscaled;
  321. // Convert page size to screen coordinates
  322. pSize->cx = MulDiv(pSize->cx, m_cxPixelsPerInch, m_sizePrinterPPI.cx);
  323. pSize->cy = MulDiv(pSize->cy, m_cyPixelsPerInch, m_sizePrinterPPI.cy);
  324. m_pPageInfo[nPage].sizeZoomOutRatio = CalcScaleRatio(windowSize, *pSize);
  325. SetScaledSize(nPage);
  326. }
  327. #define PREVIEW_MARGIN  8
  328. #define PREVIEW_PAGEGAP 8
  329. void CXTPPreviewView::SetScaledSize(UINT nPage)
  330. {
  331. CSize* pSize = &m_pPageInfo[nPage].sizeUnscaled;
  332. CSize* pRatio = &m_pPageInfo[nPage].sizeScaleRatio;
  333. CSize* pZoomOutRatio = &m_pPageInfo[nPage].sizeZoomOutRatio;
  334. CSize windowSize = CalcPageDisplaySize();
  335. BOOL bPaperLarger = pZoomOutRatio->cx < pZoomOutRatio->cy;
  336. // whether the paper is larger than the screen, or vice versa
  337. switch (m_nZoomState)
  338. {
  339. case XPT_ZOOM_WHOLEPAGE:
  340. *pRatio = *pZoomOutRatio;
  341. break;
  342. case XPT_ZOOM_PAGEWIDTH:
  343. m_Across = 1;
  344. m_Down = 1;
  345. m_nPages = 1;
  346. m_nZoomOutPages = m_nPages;
  347. m_nMaxPages = 1;
  348. pRatio->cx = windowSize.cx - PREVIEW_MARGIN * 2 - 6;
  349. pRatio->cy = pSize->cx;
  350. break;
  351. case 100:
  352. if (bPaperLarger)
  353. {
  354. pRatio->cx = pRatio->cy = 1;
  355. }
  356. else
  357. {
  358. // if the paper is smaller than the screen space we're displaying
  359. // it in, then using a ratio of 1/1 will result in a smaller image
  360. // on the screen, not a larger one. To get a larger image in this
  361. // case we double the zoom out ratio.
  362. pRatio->cy = pZoomOutRatio->cy;
  363. pRatio->cx = 2*pZoomOutRatio->cx - pZoomOutRatio->cy;
  364. }
  365. break;
  366. default:
  367. pRatio->cx = m_nZoomState;
  368. pRatio->cy = 100;
  369. }
  370. // Convert to scaled size
  371. CSize scaledSize;
  372. scaledSize.cx = MulDiv(pSize->cx, pRatio->cx, pRatio->cy);
  373. scaledSize.cy = MulDiv(pSize->cy, pRatio->cx, pRatio->cy);
  374. CRect* pRect = &m_pPageInfo[nPage].rectScreen;
  375. pRect->SetRect(PREVIEW_MARGIN, PREVIEW_MARGIN,
  376. scaledSize.cx + PREVIEW_MARGIN + 3,
  377. scaledSize.cy + PREVIEW_MARGIN + 3);
  378. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE)
  379. {
  380. pRect->OffsetRect((windowSize.cx - pRect->Size().cx) / 2 - 1, (windowSize.cy - pRect->Size().cy) / 2 - 1);
  381. // we need to offste the page multiple times
  382. int local = nPage % m_Across ;
  383. while (local-- >= 1)
  384. {
  385. pRect->OffsetRect(m_PageOffset.x, 0);
  386. }
  387. local = nPage / m_Across ;
  388. while (local-- > 0)
  389. {
  390. pRect->OffsetRect(0, m_PageOffset.y);
  391. }
  392. }
  393. else
  394. {
  395. // set up scroll size
  396. SetScrollSizes(MM_TEXT, pRect->Size() +
  397. CSize(PREVIEW_MARGIN * 2, PREVIEW_MARGIN * 2), windowSize);
  398. }
  399. }
  400. /////////////////////////////////////////////////////////////////////////////
  401. // CXTPPreviewView
  402. void CXTPPreviewView::OnUpdateNumPageChange(CCmdUI* /*pCmdUI*/)
  403. {
  404. // button has been removed from toolbar
  405. //UINT nPages = m_nZoomState == XPT_ZOOM_WHOLEPAGE ? m_nPages : m_nZoomOutPages;
  406. //pCmdUI->Enable(m_nZoomState == XPT_ZOOM_WHOLEPAGE && m_nMaxPages != 1 && (m_pPreviewInfo->GetMaxPage() > 1 || m_nPages > 1));
  407. //  CPreviewView::OnUpdateNumPageChange(pCmdUI);
  408. }
  409. void CXTPPreviewView::OnUpdateZoomIn(CCmdUI* pCmdUI)
  410. {
  411. pCmdUI->Enable(m_nZoomState < 500);
  412. }
  413. void CXTPPreviewView::OnUpdateZoomOut(CCmdUI* pCmdUI)
  414. {
  415. pCmdUI->Enable(m_nZoomState > 10);
  416. }
  417. void CXTPPreviewView::OnNumPageChange()
  418. {
  419. // doesn't do anything any more
  420. // button has been removed from toolbar
  421. }
  422. void CXTPPreviewView::OnZoomIn()
  423. {
  424. ZoomIn(0, CPoint(0, 0));
  425. }
  426. void CXTPPreviewView::ZoomIn(UINT nPage, CPoint point)
  427. {
  428. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE || m_nZoomState == XPT_ZOOM_PAGEWIDTH)
  429. {
  430. SetZoomState(100, nPage, point);
  431. return;
  432. }
  433. for (int i = 0; i < _countof(nDefaultZooms); i++)
  434. {
  435. if (m_nZoomState < nDefaultZooms[i])
  436. {
  437. SetZoomState(nDefaultZooms[i], nPage, point);
  438. return;
  439. }
  440. }
  441. }
  442. void CXTPPreviewView::OnZoomOut()
  443. {
  444. for (int i = _countof(nDefaultZooms) - 1; i >= 0; i--)
  445. {
  446. if (m_nZoomState > nDefaultZooms[i])
  447. {
  448. SetZoomState(nDefaultZooms[i], 0, CPoint(0, 0));
  449. return;
  450. }
  451. }
  452. }
  453. CSize CXTPPreviewView::CalcPageDisplaySize()
  454. // calculate the current page size
  455. // MFC used to set 'm_nSecondPageOffset' to start of second page
  456. // as we have multiple pages we use m_PageOffset which holds the
  457. // diferences across and down the pages
  458. // return size of current page less margins
  459. {
  460. // just checking...
  461. ASSERT(m_Down >= 1) ;
  462. ASSERT(m_Across >= 1) ;
  463. ASSERT(m_nPages >= 1) ;
  464. CSize windowSize, scrollSize;
  465. GetTrueClientSize(windowSize, scrollSize);
  466. // subtract out vertical scrollbar if zoomed out and page range is known
  467. // and there is more than one page.
  468. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE && (m_pPreviewInfo->GetMaxPage() != 0xffff) && (m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() != 0))
  469. windowSize.cx -= scrollSize.cx;
  470. m_PageOffset.y = 0 ;
  471. if (m_Down > 1)
  472. {
  473. // we need to make room for more pages under the first
  474. windowSize.cy = (windowSize.cy - (PREVIEW_MARGIN * (m_Down - 1))) / m_Down ;
  475. m_PageOffset.y = windowSize.cy + PREVIEW_MARGIN ;
  476. }
  477. else
  478. {
  479. // its a single page down, it uses all the area previouslyy calculated
  480. }
  481. if (m_Across <= 2)
  482. m_PageOffset.x = (windowSize.cx - PREVIEW_MARGIN) / 2;
  483. else
  484. m_PageOffset.x = (windowSize.cx - PREVIEW_MARGIN) / m_Across ;
  485. // make sure all pages across fit in the screen area
  486. windowSize.cx = (windowSize.cx - ((m_Across + 1) * PREVIEW_MARGIN)) / m_Across ;
  487. //windowSize.cx = (m_nPages == 2) ? (windowSize.cx - 3*PREVIEW_MARGIN) / 2 :
  488. //                              windowSize.cx - 2*PREVIEW_MARGIN;
  489. windowSize.cy -= 2*PREVIEW_MARGIN;
  490. return windowSize;
  491. }
  492. void CXTPPreviewView::SetupScrollbar()
  493. {
  494. // this procedure makes sure that the scroll bar does not allow us to scroll the window
  495. // such that we end up displaying blank pages
  496. // correctly range the scroll bars
  497. if (m_pPreviewInfo->GetMaxPage() < 0x8000 && m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() <= 32767U)
  498. {
  499. SCROLLINFO info;
  500. info.fMask = SIF_PAGE|SIF_RANGE;
  501. info.nMin = m_pPreviewInfo->GetMinPage();
  502. info.nMax = m_pPreviewInfo->GetMaxPage() - (m_nPages - 1) ;
  503. info.nPage = 1;
  504. if (!SetScrollInfo(SB_VERT, &info, FALSE))
  505. SetScrollRange(SB_VERT, info.nMin, info.nMax, FALSE);
  506. }
  507. else
  508. ShowScrollBar(SB_VERT, FALSE);      // if no range specified, or too
  509. }
  510. void CXTPPreviewView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  511. {
  512. if (m_nZoomState != XPT_ZOOM_WHOLEPAGE)
  513. {
  514. CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
  515. return;
  516. }
  517. SetupScrollbar() ;
  518. switch (nSBCode)
  519. {
  520. case SB_BOTTOM:
  521. SetCurrentPage(m_pPreviewInfo->GetMaxPage(), TRUE);
  522. break;
  523. case SB_TOP:
  524. SetCurrentPage(m_pPreviewInfo->GetMinPage(), TRUE);
  525. break;
  526. case SB_PAGEDOWN:
  527. SetCurrentPage(m_nCurrentPage +
  528. (m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() + 9) / 10, TRUE);
  529. break;
  530. case SB_PAGEUP:
  531. SetCurrentPage(m_nCurrentPage -
  532. (m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() + 9) / 10, TRUE);
  533. break;
  534. case SB_LINEDOWN:
  535. if (m_nCurrentPage <= m_pPreviewInfo->GetMaxPage() - m_nPages)
  536. SetCurrentPage(m_nCurrentPage + 1, TRUE);
  537. break;
  538. case SB_LINEUP:
  539. if (m_nCurrentPage > 0)
  540. SetCurrentPage(m_nCurrentPage - 1, TRUE);
  541. break;
  542. case SB_THUMBPOSITION:
  543. SetCurrentPage(nPos, TRUE);
  544. break;
  545. }
  546. }
  547. void CXTPPreviewView::OnGotoPageSetFocus(NMHDR* pNMHDR, LRESULT* /*pRes*/)
  548. {
  549. NMXTPCONTROL* tagNMCONTROL = (NMXTPCONTROL*)pNMHDR;
  550. if (!tagNMCONTROL->pControl->GetEnabled())
  551. return;
  552. ((CXTPControlEdit*)tagNMCONTROL->pControl)->SetEditText(_T(""));
  553. }
  554. void CXTPPreviewView::OnGotoPageKillFocus(NMHDR* pNMHDR, LRESULT* /*pRes*/)
  555. {
  556. NMXTPCONTROL* tagNMCONTROL = (NMXTPCONTROL*)pNMHDR;
  557. if (!tagNMCONTROL->pControl->GetEnabled())
  558. return;
  559. CString strText = ((CXTPControlEdit*)tagNMCONTROL->pControl)->GetEditText();
  560. if (strText.IsEmpty())
  561. return;
  562. UINT nCurrentPage = _ttoi(strText);
  563. if (nCurrentPage > m_pPreviewInfo->GetMaxPage())
  564. nCurrentPage = m_pPreviewInfo->GetMaxPage();
  565. if (nCurrentPage < m_pPreviewInfo->GetMinPage())
  566. nCurrentPage = m_pPreviewInfo->GetMinPage();
  567. if (nCurrentPage != m_nCurrentPage)
  568. SetCurrentPage(nCurrentPage, TRUE);
  569. }
  570. void CXTPPreviewView::OnUpdateGotoPage(CCmdUI* pCmdUI)
  571. {
  572. CXTPControlEdit* pControl = DYNAMIC_DOWNCAST(CXTPControlEdit, CXTPControl::FromUI(pCmdUI));
  573. if (!pControl)
  574. return;
  575. if (!pControl->HasFocus())
  576. {
  577. CString strText, strFormat;
  578. if (m_pPreviewInfo->GetMaxPage() == 0xffff)
  579. {
  580. XTPResourceManager()->LoadString(&strFormat, XTP_IDS_PREVIEW_PAGEI);
  581. strText.Format(strFormat, m_nCurrentPage);
  582. }
  583. else
  584. {
  585. XTPResourceManager()->LoadString(&strFormat, XTP_IDS_PREVIEW_PAGEIOFI);
  586. strText.Format(strFormat, m_nCurrentPage, m_pPreviewInfo->GetMaxPage());
  587. }
  588. pControl->SetEditText(strText);
  589. }
  590. pCmdUI->Enable((m_nCurrentPage + m_nPages - 1 < m_pPreviewInfo->GetMaxPage()) || (m_nCurrentPage > m_pPreviewInfo->GetMinPage()));
  591. }
  592. void CXTPPreviewView::OnZoomCombo(NMHDR* pNMHDR, LRESULT* pRes)
  593. {
  594. CXTPControlComboBox* pControl = DYNAMIC_DOWNCAST(CXTPControlComboBox, ((NMXTPCONTROL*)pNMHDR)->pControl);
  595. if (!pControl)
  596. return;
  597. int nCurSel = pControl->GetCurSel();
  598. if (nCurSel != -1)
  599. {
  600. if (nCurSel == XPT_ZOOM_WHOLEPAGE || nCurSel == XPT_ZOOM_PAGEWIDTH)
  601. {
  602. SetZoomState(nCurSel, 0, CPoint(0, 0));
  603. }
  604. else if (nCurSel > 1)
  605. {
  606. SetZoomState((UINT)pControl->GetItemData(nCurSel), 0, CPoint(0, 0));
  607. }
  608. }
  609. else
  610. {
  611. int nZoom = _ttoi(pControl->GetEditText());
  612. if (nZoom > 0 && nZoom < 3000)
  613. {
  614. SetZoomState(nZoom, 0, CPoint(0, 0));
  615. CString strZoom;
  616. strZoom.Format(_T("%i%%"), m_nZoomState);
  617. pControl->SetEditText(strZoom);
  618. }
  619. }
  620. *pRes = TRUE;
  621. }
  622. void CXTPPreviewView::OnOnePage()
  623. {
  624. m_Across = 1;
  625. m_Down = 1;
  626. m_nPages = 1;
  627. AfxGetApp()->m_nNumPreviewPages = m_nPages;
  628. m_nZoomOutPages = m_nPages;
  629. m_nMaxPages = 1;
  630. SetZoomState(XPT_ZOOM_WHOLEPAGE, 0, CPoint(0, 0));
  631. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE)
  632. {
  633. // make sure the current page does not cause blank pages to be shown
  634. if (m_nCurrentPage >= m_pPreviewInfo->GetMaxPage() - m_nPages)
  635. m_nCurrentPage = m_pPreviewInfo->GetMaxPage() - m_nPages + 1;
  636. if (m_nCurrentPage < 0)
  637. m_nCurrentPage = 0 ;
  638. }
  639. // Just do this to set the status correctly and invalidate
  640. SetCurrentPage(m_nCurrentPage, TRUE);
  641. SetupScrollbar() ;
  642. }
  643. void CXTPPreviewView::OnTwoPage(NMHDR* pNMHDR, LRESULT* pRes)
  644. {
  645. CXTPControlSelector* pControl = DYNAMIC_DOWNCAST(CXTPControlSelector, ((NMXTPCONTROL*)pNMHDR)->pControl);
  646. if (!pControl)
  647. return;
  648. m_Across = pControl->m_szResult.cx;
  649. m_Down = pControl->m_szResult.cy;
  650. m_nPages = m_Across * m_Down;
  651. AfxGetApp()->m_nNumPreviewPages = m_nPages;
  652. m_nZoomOutPages = m_nPages;
  653. m_nMaxPages = m_nPages ;
  654. SetZoomState(XPT_ZOOM_WHOLEPAGE, 0, CPoint(0, 0));
  655. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE)
  656. {
  657. // make sure the current page does not cause blank pages to be shown
  658. if (m_nCurrentPage >= m_pPreviewInfo->GetMaxPage() - m_nPages)
  659. m_nCurrentPage = m_pPreviewInfo->GetMaxPage() - m_nPages + 1;
  660. if (m_nCurrentPage < 0)
  661. m_nCurrentPage = 0 ;
  662. }
  663. // Just do this to set the status correctly and invalidate
  664. SetCurrentPage(m_nCurrentPage, TRUE);
  665. SetupScrollbar() ;
  666. *pRes = TRUE;
  667. }
  668. void CXTPPreviewView::OnSize(UINT nType, int cx, int cy)
  669. {
  670. // CScrollView handles everything if zoomed in.
  671. if (m_nZoomState == XPT_ZOOM_WHOLEPAGE)
  672. {
  673. // Force recalc of scale ratios on next draw
  674. for (UINT i = 0; i < m_nMaxPages; i++)
  675. m_pPageInfo[i].sizeScaleRatio.cx = 0;           // zero scale ratios
  676. CView::OnSize(nType, cx, cy);       // No scroll functionality
  677. }
  678. else
  679. {
  680. // adjust scroll size to size of page
  681. m_pageDev.cx = cx;
  682. m_pageDev.cy = cy;
  683. m_lineDev.cx = cx / 10;
  684. m_lineDev.cy = cy / 10;
  685. if (m_nZoomState == XPT_ZOOM_PAGEWIDTH)
  686. {
  687. // Force recalc of scale ratios on next draw
  688. for (UINT i = 0; i < m_nMaxPages; i++)
  689. m_pPageInfo[i].sizeScaleRatio.cx = 0;           // zero scale ratios
  690. CView::OnSize(nType, cx, cy);       // No scroll functionality
  691. }
  692. else
  693. {
  694. CScrollView::OnSize(nType, cx, cy);
  695. }
  696. }
  697. }