You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
409 lines
9.7 KiB
409 lines
9.7 KiB
/***********************************************************************
|
|
|
|
MODULE : WMFPRINT.C
|
|
|
|
FUNCTIONS : PrintWMF
|
|
GetPrinterDC
|
|
AbortProc
|
|
AbortDlg
|
|
|
|
COMMENTS :
|
|
|
|
************************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#include <objbase.h>
|
|
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);
|
|
}
|