⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preview.cpp

📁 PrintMirror 1.5 可用版 VC6 + DDK
💻 CPP
字号:
/*   PrintMirror extracts individual page metafiles from Spool File.   Copyright (C) 2002-2004  Vipin Aravind   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      Contact at vprnt@lycos.com */#include "prntmrui.h"#include "preview.h"void PMPreview::DrawPreview(HWND hDlg , LPDRAWITEMSTRUCT pdis , HENHMETAFILE hemf){     HDC     screenHDC = pdis->hDC;     FillRect(             screenHDC,           // handle to DC             &(pdis->rcItem),  // rectangle             (HBRUSH)GetStockObject(WHITE_BRUSH)             );     RECT rect;     rect.left = rect.top = 0;     rect.right = pdis->rcItem.right;     rect.bottom = pdis->rcItem.bottom ;     HRGN hrgn = CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);     SelectClipRgn(screenHDC , hrgn);     ENHMETAHEADER emf;     GetEnhMetaFileHeader(hemf , sizeof(ENHMETAHEADER), &emf);     RECT Rect;     Rect.left =Rect.top =0;     Rect.bottom = emf.szlMillimeters.cy;     Rect.right = emf.szlMillimeters.cx;     RECT RectRes;     RectRes.left = -GetScrollPosX(); RectRes.top = -GetScrollPosY();     RectRes.bottom= (GetDeviceCaps(screenHDC , LOGPIXELSY) *              Rect.bottom * 10 )/(254) + RectRes.top;     RectRes.right = (GetDeviceCaps(screenHDC, LOGPIXELSX) *              Rect.right * 10) /254 + RectRes.left;     PlayEnhMetaFile(             screenHDC,            // handle to DC             hemf,  // handle to an enhanced metafile             &RectRes // &(pdis->rcItem)  // bounding rectangle             );     SelectClipRgn(screenHDC,NULL);     DeleteObject(hrgn);}void PMPreview::ResizePreviewWindow(HWND hDlg,HWND hwnd , HENHMETAFILE hemf){     RECT ScrollRect;     int HideX = FALSE;     int HideY = FALSE;     GetWindowRect(GetDlgItem(hDlg,IDC_SCROLLX) , &ScrollRect);     RECT rect;     GetWindowRect(hDlg , &rect);     RECT Clientrect;     GetClientRect(hDlg, &Clientrect);     int Menuheight = (rect.bottom - rect.top) -          (Clientrect.bottom - Clientrect.top);     rect.bottom = rect.bottom - rect.top;     rect.right = rect.right - rect.left;     rect.top = rect.left = 0;     UINT cbNeeded = GetEnhMetaFileHeader( hemf, 0,  NULL);     LPENHMETAHEADER lpemh = (LPENHMETAHEADER)MALLOC(cbNeeded);     GetEnhMetaFileHeader( hemf, cbNeeded, lpemh);     HDC ScreenDC = GetDC(NULL);     rect.left += GetDeviceCaps(ScreenDC , LOGPIXELSX);     rect.right -= GetDeviceCaps(ScreenDC , LOGPIXELSX);     rect.bottom -= Menuheight + ScrollRect.bottom - ScrollRect.top;     int ResX,ResY;     ResY = (GetDeviceCaps(ScreenDC , LOGPIXELSY) *              lpemh->szlMillimeters.cy * 10 )/(254);     ResX = (GetDeviceCaps(ScreenDC, LOGPIXELSX) *              lpemh->szlMillimeters.cx* 10) /254;     RECT PreviewRect;     if(ResX >  rect.right - rect.left)     {          PreviewRect.left = rect.left;          PreviewRect.right = rect.right;     }     else     {          PreviewRect.left = rect.left + (rect.right - rect.left - ResX)/2;          PreviewRect.right = rect.right - (rect.right - rect.left - ResX)/2;          HideX = TRUE;     }     if(ResY >  rect.bottom - rect.top)     {          PreviewRect.bottom = rect.bottom;          PreviewRect.top = rect.top;     }     else     {          PreviewRect.top = rect.top + (rect.bottom - rect.top - ResY)/2;          PreviewRect.bottom = rect.bottom - (rect.bottom - rect.top - ResY)/2;          HideY = TRUE;     }     MoveWindow(hwnd , PreviewRect.left ,PreviewRect.top,              PreviewRect.right - PreviewRect.left, PreviewRect.bottom - PreviewRect.top              ,TRUE);     ShowWindow(GetDlgItem(hDlg,IDC_SCROLLY), SW_SHOW);     ShowWindow(GetDlgItem(hDlg,IDC_SCROLLX), SW_SHOW);     UpdateWindow(GetDlgItem(hDlg,IDC_SCROLLY));     UpdateWindow(GetDlgItem(hDlg,IDC_SCROLLX));     GetWindowRect(GetDlgItem(hDlg,IDC_SCROLLY) , &ScrollRect);     GetWindowRect(GetDlgItem(hDlg,IDC_SCROLLY) , &ScrollRect);     MoveWindow(GetDlgItem(hDlg,IDC_SCROLLY)  , PreviewRect.right ,PreviewRect.top,              ScrollRect.right - ScrollRect.left , PreviewRect.bottom - PreviewRect.top ,TRUE);     GetWindowRect(GetDlgItem(hDlg,IDC_SCROLLX) , &ScrollRect);     MoveWindow(GetDlgItem(hDlg,IDC_SCROLLX), PreviewRect.left,PreviewRect.bottom,             PreviewRect.right - PreviewRect.left ,             ScrollRect.bottom - ScrollRect.top ,TRUE);     maxScrollX =  ResX - (PreviewRect.right - PreviewRect.left);     maxScrollY =  ResY - (PreviewRect.bottom - PreviewRect.top);     SetScrollRange(GetDlgItem(hDlg,IDC_SCROLLX) , SB_CTL, 0, maxScrollX,TRUE);     SetScrollRange(GetDlgItem(hDlg,IDC_SCROLLY) , SB_CTL, 0, maxScrollY,TRUE);     SetScrollPos(GetDlgItem(hDlg,IDC_SCROLLX), SB_CTL, ScrollPosX, TRUE);     SetScrollPos(GetDlgItem(hDlg,IDC_SCROLLY), SB_CTL, ScrollPosY , TRUE);     if(HideY)          ShowWindow(GetDlgItem(hDlg,IDC_SCROLLY), SW_HIDE);     else          ShowWindow(GetDlgItem(hDlg,IDC_SCROLLY), SW_SHOW);     if(HideX)          ShowWindow(GetDlgItem(hDlg,IDC_SCROLLX), SW_HIDE);     else          ShowWindow(GetDlgItem(hDlg,IDC_SCROLLX), SW_SHOW);     ReleaseDC(NULL,ScreenDC);}void PMPreview::DrawOnOwnerDrawButton(HWND hDlg){     DRAWITEMSTRUCT dis;     HWND hwnd = GetDlgItem(hDlg , IDC_PREVIEW);     HENHMETAFILE hemf = GetEnhMetaFile( MetaFileName);     ResizePreviewWindow(hDlg, hwnd,hemf);      GetClientRect(hwnd , &(dis.rcItem));     dis.hDC = GetDC(hwnd);     DrawPreview(hDlg,&dis,hemf);     DeleteEnhMetaFile(hemf);     ReleaseDC(hwnd , dis.hDC);}BOOL APIENTRY PMPreview :: PreviewMetafile(        HWND hDlg,        UINT message,        UINT wParam,        LONG lParam){     static PMPreview *pmp = NULL;     switch (message)     {     case WM_DRAWITEM:         {              LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT)lParam;              if ((pdis->itemAction == ODA_DRAWENTIRE) &&                       (wParam  == IDC_PREVIEW))                   pmp->DrawOnOwnerDrawButton(hDlg);         }         break;     case WM_INITDIALOG:         {              pmp = (PMPreview *)lParam;              SetForegroundWindow(hDlg);              HDC hDC = GetDC(NULL);              RECT ScreenRect;              SystemParametersInfo( SPI_GETWORKAREA, 0,((PVOID)&ScreenRect),0);              int ScreenWidth = ScreenRect.right - ScreenRect.left;              int ScreenHeight = ScreenRect.bottom - ScreenRect.top;              MoveWindow(hDlg , ScreenRect.left,ScreenRect.top, ScreenWidth, ScreenHeight,FALSE);              HWND hwnd = GetDlgItem(hDlg , IDC_PREVIEW);              RECT PreviewRect;              GetWindowRect(hwnd , &PreviewRect);              MoveWindow(hwnd , ScreenWidth /4 ,0,ScreenWidth/2,ScreenHeight,FALSE);               int PreviewRight = (ScreenWidth * 3) /4;              ReleaseDC(NULL,hDC);              return TRUE;         }     case WM_VSCROLL:         {              switch(LOWORD(wParam))              {              case SB_PAGEUP:                  pmp->SetScrollPosY(max(0,pmp->GetScrollPosY() - 10));                  break;              case SB_LINEUP:                  pmp->SetScrollPosY(max(0,pmp->GetScrollPosY() - 1));                  break;              case SB_PAGEDOWN:                 // pmp->SetScrollPosY(max(0,pmp->GetScrollPosY()  + 10));                 pmp->SetScrollPosY( min(pmp->GetmaxScrollY(),pmp->GetScrollPosY() + 10));                  break;              case SB_LINEDOWN://                  pmp->SetScrollPosY(max(0,pmp->GetScrollPosY()  + 1));                 pmp->SetScrollPosY( min(pmp->GetmaxScrollY(),pmp->GetScrollPosY() + 1));                  break;              case SB_THUMBTRACK:              case SB_THUMBPOSITION:                  pmp->SetScrollPosY(HIWORD(wParam));                  break;              }              UpdateWindow(GetDlgItem(hDlg,IDC_SCROLLY));              UpdateWindow(GetDlgItem(hDlg,IDC_SCROLLX));              SetScrollPos(GetDlgItem(hDlg,IDC_SCROLLY), SB_CTL, pmp->GetScrollPosY(), TRUE);              pmp->DrawOnOwnerDrawButton(hDlg);         }         break;     case WM_HSCROLL:         {              switch(LOWORD(wParam))              {              case SB_PAGELEFT:                  pmp->SetScrollPosX(max(0,pmp->GetScrollPosX() - 10));                  break;              case SB_LINELEFT:                  pmp->SetScrollPosX(max(0,pmp->GetScrollPosX() - 1));                  break;              case SB_PAGERIGHT:                  //pmp->SetScrollPosX(max(0,pmp->GetScrollPosX() + 10));                  pmp->SetScrollPosX(min(pmp->GetmaxScrollX(),pmp->GetScrollPosX() + 10));                  break;              case SB_LINERIGHT://                  pmp->SetScrollPosX(max(0,pmp->GetScrollPosX() + 1));                  pmp->SetScrollPosX(min(pmp->GetmaxScrollX(),pmp->GetScrollPosX() + 1));                  break;              case SB_THUMBTRACK:              case SB_THUMBPOSITION:                  pmp->SetScrollPosX(HIWORD(wParam));                  break;              }              UpdateWindow(GetDlgItem(hDlg,IDC_SCROLLY));              UpdateWindow(GetDlgItem(hDlg,IDC_SCROLLX));              SetScrollPos(GetDlgItem(hDlg,IDC_SCROLLX), SB_CTL, pmp->GetScrollPosX(), TRUE);              pmp->DrawOnOwnerDrawButton(hDlg);         }         break;     case WM_CLOSE:         EndDialog(hDlg , 0);         break;     default:         return FALSE;     }     return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -