Annotation of mstools/samples/gridfont/view.cxx, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.