// // pgsetup.cpp // // implementation of the CPageSetupData class // #include "stdafx.h" #include "resource.h" #include "dlgs.h" #include "pgsetup.h" /***************************************************************************/ #define FIXED_FLOATPT_MULTDIV 100000 /***************************************************************************/ VOID CPageSetupData::UpdateControls(HWND hDlg) { CheckDlgButton(hDlg, IDC_HORIZONTALLY, bCenterHorizontally); CheckDlgButton(hDlg, IDC_VERTICALLY, bCenterVertically); CheckDlgButton(hDlg, IDC_ADJUST_TO, !bScaleFitTo); SetDlgItemInt(hDlg, IDC_PERCENT_NORMAL_SIZE, nAdjustToPercent, FALSE); EnableWindow(GetDlgItem(hDlg, IDC_PERCENT_NORMAL_SIZE), !bScaleFitTo); EnableWindow(GetDlgItem(hDlg, IDC_STR_PERCENT_NORMAL_SIZE), !bScaleFitTo); CheckDlgButton(hDlg, IDC_FIT_TO, bScaleFitTo); SetDlgItemInt(hDlg, IDC_PAGES_WIDE, nFitToPagesWide, FALSE); EnableWindow(GetDlgItem(hDlg, IDC_PAGES_WIDE), bScaleFitTo); EnableWindow(GetDlgItem(hDlg, IDC_STR_PAGES_WIDE), bScaleFitTo); SetDlgItemInt(hDlg, IDC_PAGES_TALL, nFitToPagesTall, FALSE); EnableWindow(GetDlgItem(hDlg, IDC_PAGES_TALL), bScaleFitTo); EnableWindow(GetDlgItem(hDlg, IDC_STR_PAGES_TALL), bScaleFitTo); InvalidateRect(GetDlgItem(hDlg, rct1), 0, TRUE); } /***************************************************************************/ VOID CPageSetupData::UpdateValue(HWND hDlg, int nIDDlgItem, UINT *pnResult) { BOOL bTranslated; UINT nResult = GetDlgItemInt(hDlg, nIDDlgItem, &bTranslated, FALSE); if (bTranslated && nResult != 0) { *pnResult = nResult; InvalidateRect(GetDlgItem(hDlg, rct1), 0, TRUE); } } /***************************************************************************/ UINT_PTR APIENTRY CPageSetupData::PageSetupHook(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { LPPAGESETUPDLG ppsd = (LPPAGESETUPDLG) lParam; SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) lParam); CPageSetupData *that = (CPageSetupData *) ppsd->lCustData; SendDlgItemMessage(hDlg, IDC_PERCENT_NORMAL_SIZE, EM_LIMITTEXT, 4, 0); SendDlgItemMessage(hDlg, IDC_PAGES_WIDE, EM_LIMITTEXT, 2, 0); SendDlgItemMessage(hDlg, IDC_PAGES_TALL, EM_LIMITTEXT, 2, 0); that->UpdateControls(hDlg); break; } case WM_COMMAND: { LPPAGESETUPDLG ppsd = (LPPAGESETUPDLG) GetWindowLongPtr(hDlg, GWLP_USERDATA); CPageSetupData *that = ppsd ? (CPageSetupData *) ppsd->lCustData : 0; switch (LOWORD(wParam)) { case IDC_HORIZONTALLY: { if (HIWORD(wParam) == BN_CLICKED) { that->bCenterHorizontally = !that->bCenterHorizontally; that->UpdateControls(hDlg); } return TRUE; } case IDC_VERTICALLY: { if (HIWORD(wParam) == BN_CLICKED) { that->bCenterVertically = !that->bCenterVertically; that->UpdateControls(hDlg); } return TRUE; } case IDC_ADJUST_TO: { if (HIWORD(wParam) == BN_CLICKED) { that->bScaleFitTo = FALSE; that->UpdateControls(hDlg); } return TRUE; } case IDC_FIT_TO: { if (HIWORD(wParam) == BN_CLICKED) { that->bScaleFitTo = TRUE; that->UpdateControls(hDlg); } return TRUE; } case IDC_PERCENT_NORMAL_SIZE: { if (HIWORD(wParam) == EN_CHANGE) { UpdateValue(hDlg, IDC_PERCENT_NORMAL_SIZE, &that->nAdjustToPercent); } else if (HIWORD(wParam) == EN_KILLFOCUS) { SetDlgItemInt(hDlg, IDC_PERCENT_NORMAL_SIZE, that->nAdjustToPercent, FALSE); } return TRUE; } case IDC_PAGES_WIDE: { if (HIWORD(wParam) == EN_CHANGE) { UpdateValue(hDlg, IDC_PAGES_WIDE, &that->nFitToPagesWide); } else if (HIWORD(wParam) == EN_KILLFOCUS) { SetDlgItemInt(hDlg, IDC_PAGES_WIDE, that->nFitToPagesWide, FALSE); } return TRUE; } case IDC_PAGES_TALL: { if (HIWORD(wParam) == EN_CHANGE) { UpdateValue(hDlg, IDC_PAGES_TALL, &that->nFitToPagesTall); } else if (HIWORD(wParam) == EN_KILLFOCUS) { SetDlgItemInt(hDlg, IDC_PAGES_TALL, that->nFitToPagesTall, FALSE); } return TRUE; } } break; } } return FALSE; } /***************************************************************************/ VOID CPageSetupData::CalculateImageRect( const CSize &PhysicalPageSize, CPoint &PhysicalOrigin, CSize &PhysicalScaledImageSize ) { // Find the scaled image size and the total page size required to print that image LONG nPhysicalTotalPageWidth; LONG nPhysicalTotalPageHeight; if (bScaleFitTo) { nPhysicalTotalPageWidth = PhysicalPageSize.cx * nFitToPagesWide; nPhysicalTotalPageHeight = PhysicalPageSize.cy * nFitToPagesTall; // Keep the aspect ratio; try the match the width first and if it fails, match the height PhysicalScaledImageSize.cx = nPhysicalTotalPageWidth; PhysicalScaledImageSize.cy = (LONG) (fPhysicalImageHeight * nPhysicalTotalPageWidth / fPhysicalImageWidth); if (PhysicalScaledImageSize.cy > nPhysicalTotalPageHeight) { PhysicalScaledImageSize.cx = (LONG) (fPhysicalImageWidth * nPhysicalTotalPageHeight / fPhysicalImageHeight); PhysicalScaledImageSize.cy = nPhysicalTotalPageHeight; } } else { PhysicalScaledImageSize.cx = (LONG) (fPhysicalImageWidth * nAdjustToPercent / 100); PhysicalScaledImageSize.cy = (LONG) (fPhysicalImageHeight * nAdjustToPercent / 100); nFitToPagesWide = (PhysicalScaledImageSize.cx + PhysicalPageSize.cx - 1) / PhysicalPageSize.cx; nFitToPagesTall = (PhysicalScaledImageSize.cy + PhysicalPageSize.cy - 1) / PhysicalPageSize.cy; nPhysicalTotalPageWidth = PhysicalPageSize.cx * nFitToPagesWide; nPhysicalTotalPageHeight = PhysicalPageSize.cy * nFitToPagesTall; } PhysicalOrigin.x = bCenterHorizontally ? (nPhysicalTotalPageWidth - PhysicalScaledImageSize.cx) / 2 : 0; PhysicalOrigin.y = bCenterVertically ? (nPhysicalTotalPageHeight - PhysicalScaledImageSize.cy) / 2 : 0; } /***************************************************************************/ UINT_PTR APIENTRY CPageSetupData::PagePaintHook(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_PSD_PAGESETUPDLG: { SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) lParam); break; } case WM_PSD_GREEKTEXTRECT: { LPPAGESETUPDLG ppsd = (LPPAGESETUPDLG) GetWindowLongPtr(hDlg, GWLP_USERDATA); CPageSetupData *that = (CPageSetupData *) ppsd->lCustData; CRect *pOutputWindowRect = (CRect *) lParam; // Find the physical size of the page CSize PhysicalPageSize; PhysicalPageSize.cx = ppsd->ptPaperSize.x - ppsd->rtMargin.left - ppsd->rtMargin.right; PhysicalPageSize.cy = ppsd->ptPaperSize.y - ppsd->rtMargin.top - ppsd->rtMargin.bottom; CPoint PhysicalOrigin; CSize PhysicalScaledImageSize; that->CalculateImageRect(PhysicalPageSize, PhysicalOrigin, PhysicalScaledImageSize); // Find the scaling ratios for the preview window double fWidthRatio = (double) pOutputWindowRect->Width() / PhysicalPageSize.cx; double fHeightRatio = (double) pOutputWindowRect->Height() / PhysicalPageSize.cy; // Find the size of the image rectangle on the preview window CRect OutputImageRect; OutputImageRect.left = pOutputWindowRect->left + (int) (fWidthRatio * PhysicalOrigin.x); OutputImageRect.top = pOutputWindowRect->top + (int) (fHeightRatio * PhysicalOrigin.y); OutputImageRect.right = OutputImageRect.left + (int) (fWidthRatio * PhysicalScaledImageSize.cx); OutputImageRect.bottom = OutputImageRect.top + (int) (fHeightRatio * PhysicalScaledImageSize.cy); // Draw a rectangle with crossing lines CDC *pDC = CDC::FromHandle((HDC) wParam); CGdiObject *pOldPen = pDC->SelectStockObject(BLACK_PEN); CGdiObject *pOldBrush = pDC->SelectStockObject(LTGRAY_BRUSH); pDC->Rectangle(OutputImageRect); pDC->MoveTo(OutputImageRect.left, OutputImageRect.top); pDC->LineTo(OutputImageRect.right - 1, OutputImageRect.bottom - 1); pDC->MoveTo(OutputImageRect.left, OutputImageRect.bottom - 1); pDC->LineTo(OutputImageRect.right - 1, OutputImageRect.top); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); return TRUE; } } return FALSE; }