/*********************************************************************** MODULE : WMFPRINT.C FUNCTIONS : PrintWMF GetPrinterDC AbortProc AbortDlg COMMENTS : ************************************************************************/ #include #include #include #include #include #include extern "C" { #include "mfdcod32.h" } extern "C" { extern BOOL bConvertToGdiPlus; extern BOOL bUseGdiPlusToPlay; } #include "GdiPlus.h" int PrintToGdiPlus(HDC hdc, RECT * rc) { // 'rc' is device co-ordinates of rectangle. // Convert to world space. if (bEnhMeta) { Gdiplus::Metafile m1(hemf); Gdiplus::Rect r1(rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top); Gdiplus::Graphics g(hdc); g.SetPageUnit(Gdiplus::UnitPixel); if(g.DrawImage(&m1, r1) != Gdiplus::Ok) MessageBox(NULL, "An Error Occured while printing metafile with GDI+", "Error", MB_OK | MB_ICONERROR); } else { Gdiplus::Metafile m1((HMETAFILE)hMF, NULL); Gdiplus::Rect r1(rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top); Gdiplus::Graphics g(hdc); g.SetPageUnit(Gdiplus::UnitPixel); if(g.DrawImage(&m1, r1) != Gdiplus::Ok) MessageBox(NULL, "An Error Occured while printing metafile with GDI+", "Error", MB_OK | MB_ICONERROR); } return 1; } extern BOOL bUseGdiPlusToPlay; PRINTDLG pd; /*********************************************************************** FUNCTION : PrintWMF PARAMETERS : void PURPOSE : draw the metafile on a printer dc CALLS : WINDOWS wsprintf MessageBox MakeProcInstance Escape CreateDialog SetMapMode SetViewportOrg SetViewportExt EnableWindow PlayMetaFile DestroyWindow DeleteDC APP WaitCursor GetPrinterDC SetPlaceableExts SetClipMetaExts MESSAGES : none RETURNS : BOOL - 0 if unable to print 1 if successful COMMENTS : HISTORY : 1/16/91 - created - drc 7/9/93 - modified for win32 and emf ************************************************************************/ BOOL PrintWMF(BOOL Dialog) { char str[50]; POINT lpPT; SIZE lpSize; DOCINFO di; RECT rc; memset(&di, 0, sizeof(di)); // //display the hourglass cursor // WaitCursor(TRUE); // //get a DC for the printer // hPr = (HDC)GetPrinterDC(Dialog); // //if a DC could not be created then report the error and return // if (!hPr) { WaitCursor(FALSE); wsprintf((LPSTR)str, "Cannot print %s", (LPSTR)fnameext); MessageBox(hWndMain, (LPSTR)str, NULL, MB_OK | MB_ICONHAND); return (FALSE); } // //define the abort function // SetAbortProc(hPr, AbortProc); // //Initialize the members of a DOCINFO structure. // di.cbSize = sizeof(DOCINFO); di.lpszDocName = (bEnhMeta) ? "Print EMF" : "Print WMF"; di.lpszOutput = (LPTSTR) NULL; // //Begin a print job by calling the StartDoc //function. // if (SP_ERROR == (StartDoc(hPr, &di))) { //if (Escape(hPr, STARTDOC, 4, "Metafile", (LPSTR) NULL) < 0) { MessageBox(hWndMain, "Unable to start print job", NULL, MB_OK | MB_ICONHAND); DeleteDC(hPr); return (FALSE); } // //clear the abort flag // bAbort = FALSE; // //Create the Abort dialog box (modeless) // hAbortDlgWnd = CreateDialog((HINSTANCE)hInst, "AbortDlg", hWndMain, AbortDlg); // //if the dialog was not created report the error // if (!hAbortDlgWnd) { WaitCursor(FALSE); MessageBox(hWndMain, "NULL Abort window handle", NULL, MB_OK | MB_ICONHAND); return (FALSE); } // //show Abort dialog // ShowWindow (hAbortDlgWnd, SW_NORMAL); // //disable the main window to avoid reentrancy problems // EnableWindow(hWndMain, FALSE); WaitCursor(FALSE); // //if we are still committed to printing // if (!bAbort) { if (!bUseGdiPlusToPlay) { // //if this is a placeable metafile then set its origins and extents // if (bPlaceableMeta) SetPlaceableExts(hPr, placeableMFHeader, WMFPRINTER); // //if this is a metafile contained within a clipboard file then set //its origins and extents accordingly // if ( (bMetaInRam) && (!bplaceableMeta) ) SetClipMetaExts(hPr, lpMFP, lpOldMFP, WMFPRINTER); } // //if this is a "traditional" windows metafile // rc.left = 0; rc.top = 0; rc.right = GetDeviceCaps(hPr, HORZRES); rc.bottom = GetDeviceCaps(hPr, VERTRES); if (!bMetaInRam) { SetMapMode(hPr, MM_TEXT); SetViewportOrgEx(hPr, 0, 0, &lpPT); // //set the extents to the driver supplied values for horizontal //and vertical resolution // SetViewportExtEx(hPr, rc.right, rc.bottom, &lpSize ); } // //play the metafile directly to the printer. //No enumeration involved here // if (bUseGdiPlusToPlay) { PrintToGdiPlus(hPr, &rc); } else { if (bEnhMeta) { DPtoLP(hPr, (LPPOINT)&rc, 2); PlayEnhMetaFile(hPr, hemf, &rc); } else PlayMetaFile(hPr, (HMETAFILE)hMF); } } // //eject page and end the print job // Escape(hPr, NEWFRAME, 0, 0L, 0L); EndDoc(hPr); EnableWindow(hWndMain, TRUE); // //destroy the Abort dialog box // DestroyWindow(hAbortDlgWnd); DeleteDC(hPr); return(TRUE); } /*********************************************************************** FUNCTION : GetPrinterDC PARAMETERS : BOOL: Do we want to show a print DLG? PURPOSE : Get hDc for current device on current output port according to info in WIN.INI. CALLS : WINDOWS GetProfileString AnsiNext CreateDC MESSAGES : none RETURNS : HANDLE - hDC > 0 if success hDC = 0 if failure COMMENTS : Searches WIN.INI for information about what printer is connected, and if found, creates a DC for the printer. HISTORY : 1/16/91 - created - denniscr ************************************************************************/ HANDLE GetPrinterDC(BOOL Dialog) { memset(&pd, 0, sizeof(PRINTDLG)); pd.lStructSize = sizeof(PRINTDLG); pd.Flags = PD_RETURNDC | (Dialog?0:PD_RETURNDEFAULT); pd.hwndOwner = hWndMain ; return ((PrintDlg(&pd) != 0) ? pd.hDC : NULL); } /*********************************************************************** FUNCTION : AbortProc PARAMETERS : HDC hPr - printer DC int Code - printing status PURPOSE : process messages for the abort dialog box CALLS : WINDOWS PeekMessage IsDialogMessage TranslateMessage DispatchMessage MESSAGES : none RETURNS : int COMMENTS : HISTORY : 1/16/91 - created - denniscr ************************************************************************/ BOOL CALLBACK AbortProc(HDC hPr, int Code) { MSG msg; // //Process messages intended for the abort dialog box // while (!bAbort && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) if (!IsDialogMessage(hAbortDlgWnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } // //bAbort is TRUE (return is FALSE) if the user has aborted // return (!bAbort); } /*********************************************************************** FUNCTION : AbortDlg PARAMETERS : HWND hDlg; unsigned msg; WORD wParam; LONG lParam; PURPOSE : Processes messages for printer abort dialog box CALLS : WINDOWS SetFocus MESSAGES : WM_INITDIALOG - initialize dialog box WM_COMMAND - Input received RETURNS : BOOL COMMENTS : This dialog box is created while the program is printing, and allows the user to cancel the printing process. HISTORY : 1/16/91 - created - denniscr ************************************************************************/ INT_PTR CALLBACK AbortDlg(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { // //Watch for Cancel button, RETURN key, ESCAPE key, or SPACE BAR // case WM_INITDIALOG: // //Set the focus to the Cancel box of the dialog // SetFocus(GetDlgItem(hDlg, IDCANCEL)); return (TRUE); case WM_COMMAND: return (bAbort = TRUE); } return (FALSE); }