VIEW.CXX
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //--------------------------------------------------------------------
  2. // File: View.Cxx
  3. //
  4. // Classes: 
  5. //      CClientCanvas - Device context for client area
  6. //      CPrintCanvas  - Device context for printing
  7. //
  8. //      CView          - Base class for Views 
  9. //      CScrollaleView - Scrollable View
  10. //      CFullPageView  - NonScrollable FullPage View
  11. //
  12. // History: 22-Jan-1993 Asmusf  Created
  13. //
  14. // Copyright (C) 1993-1997 Microsoft Corp. All Rights reserved
  15. //
  16. //--------------------------------------------------------------------
  17. #include <windows.h>
  18. #include <windowsx.h>
  19. #include <commdlg.h>
  20. #include "app.h"
  21. #include "view.hxx"
  22. #include "grid.hxx"
  23. //+--------------------------------------------------------
  24. // Class:       CView
  25. //
  26. // Purpose:     Standard fixed View for printing, or base class
  27. //
  28. // History:     22-Jan-1993     asmusf  created
  29. //----------------------------------------------------------
  30. CView::CView(int cx, int cy)
  31. {
  32.         _iScale = 100;        // percentage magnification
  33.         _ptOrg.x = 0;         // 0..(PAGEWIDTH - widht of window) 
  34.         _ptOrg.y = 0;         // 0..(PAGEHEIGHT - height of window)
  35.         _ptScroll.x = 0;      // 0..PAGEWIDTH
  36.         _ptScroll.y = 0;      // 0..PAGEHEIGHT
  37.         _size.cx = cx;        // width of window (dev. coord)
  38.         _size.cy = cy;        // widht of window (dev. coord)
  39. }
  40. void CView::SetSize( int cx, int cy)
  41. {
  42.         _size.cx = cx;
  43.         _size.cy = cy;
  44. }
  45. void CView::Invalidate(HWND hwnd, LPRECT lpRect)
  46. {
  47.         InvalidateRect(hwnd, lpRect, TRUE);             
  48. }
  49. BOOL CView::Paint(CCanvas& canvas, CModel * _pModel, RECT rc)
  50. {
  51.         // Scale using MapMode = logical TWIPS
  52.         canvas.Scale(_iScale);
  53.         
  54.         // Client rect in logical coordinates
  55.         _ptClient.x=_size.cx;
  56.         _ptClient.y=_size.cy;
  57.         canvas.DPtoLP(&_ptClient);
  58.         // Adjust GDIwindow origin, set _ptOrg
  59.         Scroll(canvas);
  60.         // ClipRectangle in logical coordinates
  61.         POINT pt;
  62.         pt.x = rc.left; pt.y = rc.top;
  63.         canvas.DPtoLP(&pt);
  64.         rc.left = pt.x; rc.top = pt.y;
  65.         pt.x = rc.right; pt.y = rc.bottom;
  66.         canvas.DPtoLP(&pt);
  67.         rc.right = pt.x; rc.bottom = pt.y;
  68.         // Paint
  69.         _pModel->Paint(canvas, rc);
  70.         return TRUE;  // screen Paints don't fail
  71. }
  72. UINT CView::Hittest(CCanvas& canvas, POINT ptTest, CModel * _pModel)
  73. {
  74.         // Scale using MapMode = logical TWIPS
  75.         canvas.Scale(_iScale);
  76.         
  77.         // Client rect in logical coordinates
  78.         _ptClient.x=_size.cx;
  79.         _ptClient.y=_size.cy;
  80.         canvas.DPtoLP(&_ptClient);
  81.         // Adjust GDIwindow origin, set _ptOrg
  82.         Scroll(canvas);
  83.         // Hittest
  84.         canvas.DPtoLP(&ptTest);
  85.         return _pModel->Hittest( ptTest);
  86. }
  87. void CView::Scroll(CCanvas &canvas)
  88. {
  89.         int dx=MulDiv(_ptClient.x,_ptScroll.x,PAGEWIDTH);
  90.         int dy=MulDiv(_ptClient.y,_ptScroll.y,PAGEHEIGHT);
  91.         // Adjust GDIwindow origin, set _ptOrg
  92.         _ptOrg.x = _ptScroll.x-dx;
  93.         _ptOrg.y = _ptScroll.y-dy;
  94.         
  95.         canvas.Scroll(_ptOrg.x, _ptOrg.y);
  96. }
  97. //+--------------------------------------------------------
  98. // Class:       CScrollableView
  99. //
  100. // Purpose:     View for scrollable window
  101. //
  102. // History:     22-Jan-1993     asmusf  created
  103. //----------------------------------------------------------
  104. void CScrollableView::SetHScrollPos(HWND hwnd, WPARAM wParam, LPARAM lParam, CModel * pModel)
  105. {
  106.     CScreenCanvas canvas(hwnd);
  107.     int nScrollPos = GetScrollPos( hwnd, SB_HORZ );
  108.     canvas.Scale(_iScale);
  109.     SIZE size;
  110.     pModel->GetLineSize(&size);
  111.     // scroll position relative to page dimension
  112.     switch (wParam)
  113.     {
  114.     case SB_LINEUP:
  115.          nScrollPos -= 2 * size.cx;
  116.          break;
  117.     case SB_LINEDOWN:
  118.          nScrollPos += 2 * size.cx;
  119.          break;
  120.     case SB_PAGEUP:
  121.          nScrollPos -= _ptClient.x; // size of Window in log coord
  122.          break;
  123.     case SB_PAGEDOWN:
  124.          nScrollPos += _ptClient.x;
  125.          break;
  126.     case SB_THUMBPOSITION:
  127.          nScrollPos = LOWORD(lParam);
  128.          break;
  129.     default:
  130.          break;
  131.     }
  132.                       
  133.     nScrollPos = max( 0, min (nScrollPos, PAGEWIDTH));
  134.     
  135.     POINT pt;
  136.     pt.x =  GetScrollPos( hwnd, SB_HORZ ) - nScrollPos;
  137.     if( pt.x )
  138.     {
  139.         SetScrollPos(hwnd, SB_HORZ, nScrollPos, TRUE );
  140.         pt.y = 0;
  141.         canvas.LPtoDP(&pt);
  142.         pt.x -= MulDiv( _ptClient.x, pt.x, PAGEWIDTH);
  143.         ScrollWindow(hwnd, pt.x, pt.y, NULL, NULL );    
  144.     }
  145.     _ptScroll.x = nScrollPos;
  146. }
  147. void CScrollableView::SetVScrollPos(HWND hwnd, WPARAM wParam, LPARAM lParam, CModel * pModel)
  148. {
  149.     CScreenCanvas canvas(hwnd);
  150.     int nScrollPos = GetScrollPos( hwnd, SB_VERT );
  151.     canvas.Scale(_iScale);
  152.     SIZE size;
  153.     pModel->GetLineSize(&size);
  154.     // scroll position relative to page dimension
  155.     switch (wParam)
  156.     {
  157.     case SB_LINEUP:
  158.          nScrollPos -= 2 * size.cy;
  159.          break;
  160.     case SB_LINEDOWN:
  161.          nScrollPos += 2 * size.cy;
  162.          break;
  163.     case SB_PAGEUP:
  164.          nScrollPos -= _ptClient.y; // size of Window in log coord
  165.          break;
  166.     case SB_PAGEDOWN:
  167.          nScrollPos += _ptClient.y;
  168.          break;
  169.     case SB_THUMBPOSITION:
  170.          nScrollPos = LOWORD(lParam);
  171.          break;
  172.     default:
  173.          break;
  174.     }
  175.                       
  176.     nScrollPos = max( 0, min (nScrollPos, PAGEHEIGHT));
  177.     
  178.     POINT pt;
  179.     pt.y =  GetScrollPos( hwnd, SB_VERT ) - nScrollPos;
  180.     if( pt.y )
  181.     {
  182.         SetScrollPos(hwnd, SB_VERT, nScrollPos, TRUE );
  183.         pt.x = 0;
  184.         canvas.LPtoDP(&pt);
  185.         pt.y -= MulDiv( _ptClient.y, pt.y, PAGEHEIGHT);
  186.         ScrollWindow(hwnd, pt.x, pt.y, NULL, NULL );    
  187.     }
  188.     _ptScroll.y = nScrollPos;
  189. }
  190. //+--------------------------------------------------------
  191. // Class:       CPrintCanvas
  192. //
  193. // Purpose:     Device Context for Printing
  194. //
  195. // History:     22-Jan-1993     asmusf  created
  196. //----------------------------------------------------------
  197. // fully inline //
  198. //+--------------------------------------------------------
  199. // Class:       CPrintRequest
  200. //
  201. // Purpose:     Print Job selection and parameters
  202. //
  203. // History:     22-Jan-1993     asmusf  created
  204. //----------------------------------------------------------
  205. CPrintAux PrGlobal;     // global flags for printing control
  206. CPrintRequest::CPrintRequest(HWND hwnd, UINT nMinPage, UINT nMaxPage ) :
  207.         _hwnd(hwnd),
  208.         _hdc(0),
  209.         _hDevNames(0)
  210. {
  211.     PRINTDLG pd;
  212.     pd.lStructSize= sizeof(PRINTDLG);
  213.     pd.hwndOwner=NULL;
  214.     pd.hDevMode=NULL;
  215.     pd.hDevNames=NULL;
  216.     pd.hDC;
  217.     pd.nFromPage = 0xFFFF; // cause initial blank field
  218.     pd.nToPage   = 0xFFFF; // in dialog
  219.     pd.nMinPage=nMinPage;
  220.     pd.nMaxPage=nMaxPage;
  221.     pd.nCopies=1;
  222.     pd.hInstance=NULL;
  223.     pd.lCustData=0L;
  224.     pd.lpfnPrintHook=NULL;
  225.     pd.lpfnSetupHook=NULL;
  226.     pd.lpPrintTemplateName=NULL;
  227.     pd.lpSetupTemplateName=NULL;
  228.     pd.hPrintTemplate=NULL;
  229.     pd.hSetupTemplate=NULL;
  230.     pd.Flags = PD_RETURNDEFAULT;
  231.     
  232.     if( PrintDlg(&pd) )
  233.     {
  234.         pd.Flags = PD_SELECTION | PD_HIDEPRINTTOFILE | PD_RETURNDC;
  235.         if( PrintDlg( &pd ) )
  236.         {
  237.              if(pd.Flags & PD_PAGENUMS)
  238.              {
  239.                  _nFromPage = pd.nFromPage;
  240.                  _nToPage = pd.nToPage;
  241.              }
  242.              else if (pd.Flags & PD_SELECTION )
  243.              {
  244.                  _nFromPage = _nToPage = 0xFFFF;
  245.              }
  246.              else   // all non empty pages
  247.              {
  248.                  _nFromPage = nMinPage;
  249.                  _nToPage = nMaxPage;
  250.              }
  251.              _hdc = pd.hDC;
  252.              _hDevNames = pd.hDevNames;
  253.              if( pd.hDevMode )
  254.              {
  255.                 GlobalFree (pd.hDevMode);
  256.              }
  257.              _status = PREQ_SUCCESS;
  258.              return;
  259.         }
  260.         else
  261.         {
  262.             _status = PREQ_ERROR;
  263.             return;
  264.         }
  265.     } 
  266.     _status = PREQ_CANCEL;
  267. }
  268. CPrintRequest:: ~CPrintRequest()
  269. {
  270.     if( _hDevNames )
  271.     {
  272.         GlobalFree( _hDevNames );
  273.     }
  274.     
  275.     if( _hdc )
  276.     {
  277.         DeleteDC(_hdc );
  278.     }
  279. }
  280. UINT CPrintRequest::Print(HINSTANCE hInst, CCanvas &canvas, CModel *pModel)
  281. {
  282.      // needs to become app & font name....
  283.      static TCHAR szMessage [] = TEXT("Grid: Printing") ;
  284.      TCHAR szCaption[30];
  285.      
  286.      BOOL       fError = PREQ_SUCCESS ;
  287.      ABORTPROC  lpfnAbortProc;
  288.      DLGPROC    lpfnPrintDlgProc ;
  289.      short      cxPage, cyPage ;
  290.      cxPage = GetDeviceCaps (canvas, HORZRES) ;
  291.      cyPage = GetDeviceCaps (canvas, VERTRES) ;
  292.      // disable user input to main window
  293.      EnableWindow (_hwnd, FALSE) ;
  294.      lpfnPrintDlgProc = (DLGPROC) MakeProcInstance ((FARPROC) PrintDlgProc, hInst) ;
  295.      
  296.      LoadString(hInst, IDS_MSGCAPTION, szCaption, 30);
  297.      PrGlobal._bUserAbort = FALSE ;
  298.      PrGlobal._hDlgPrint = 
  299.                 CreateDialogParam (hInst, TEXT("PrintDlgBox"), _hwnd, 
  300.                                 lpfnPrintDlgProc, (LONG)(LPSTR) szCaption) ;
  301.      lpfnAbortProc = (ABORTPROC) MakeProcInstance ((FARPROC) AbortProc, hInst) ;
  302.      SetAbortProc(canvas, lpfnAbortProc);
  303.      DOCINFO docinfo;
  304.      docinfo.cbSize = sizeof(DOCINFO);
  305.      docinfo.lpszDocName = szMessage;
  306.      docinfo.lpszOutput = NULL;
  307.      if (Escape (canvas, STARTDOC, sizeof szMessage - 1, (LPCSTR)szMessage, NULL) > 0)
  308.      //if (StartDoc(canvas, &docinfo) > 0)
  309.      {
  310.           UINT fuFormat;
  311.           pModel->GetFormat(fuFormat);
  312.           pModel->SetFormat(fuFormat | PAGEPRINT|PAGEELEMS);
  313.           UINT iSavePage = pModel->GetPage();
  314.           
  315.           // create printer view to 
  316.           CView  View(cxPage, cyPage);
  317.           if( _nToPage == 0xFFFF || _nFromPage == 0xFFFF )
  318.           {     
  319.                 _nToPage =   pModel->GetPage()+1;
  320.                 _nFromPage = pModel->GetPage()+1;
  321.           }
  322.           for( ; _nFromPage <= _nToPage && ! fError; _nFromPage++ )
  323.           {
  324.              if (pModel->IsModelPageUsed(_nFromPage-1))
  325.                 {
  326.                 if( StartPage(canvas) < 0 )
  327.                     {
  328.                     fError = PREQ_ERRSTARTPAGE ;
  329.                     break;
  330.                     }    
  331.                 pModel->SetPage(_nFromPage-1);  // <- pages are 0 based in Model
  332.                 RECT rc;
  333.                 rc.left = rc.top = 0;
  334.                 rc.right= cxPage;
  335.                 rc.bottom = cyPage;
  336.                 View.Paint (canvas, pModel, rc) ;
  337.                 
  338.                 if ( EndPage(canvas) < 0)
  339.                     {
  340.                     fError = PREQ_ERRENDPAGE ;
  341.                     }
  342. }
  343.           }
  344.           if( !fError )
  345.           {
  346.                EndDoc(canvas);
  347.           }
  348.           // restore screen format
  349.           pModel->SetPage(iSavePage);
  350.           pModel->SetFormat(fuFormat);
  351.      }
  352.      else
  353.      {
  354.           fError = PREQ_ERRSTARTDOC ;
  355.      }
  356.      if (!PrGlobal._bUserAbort)
  357.      {
  358.           EnableWindow (_hwnd, TRUE) ;
  359.           DestroyWindow (PrGlobal._hDlgPrint) ;
  360.      }
  361.      FreeProcInstance ((FARPROC)lpfnPrintDlgProc) ;
  362.      FreeProcInstance ((FARPROC)lpfnAbortProc) ;
  363.      if( PrGlobal._bUserAbort )
  364.      {
  365.         fError |= PREQ_USERABORT;
  366.      }
  367.      return fError ;
  368. }