more backwards compatibility for printing

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2030 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-04-02 22:30:56 +00:00
parent 391364946e
commit 103aec296a
4 changed files with 222 additions and 166 deletions

View File

@ -6,7 +6,7 @@
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRINTDLG_H_
@ -19,51 +19,53 @@
#include "wx/dialog.h"
#include "wx/cmndata.h"
/*
* wxPrinterDialog
* The common dialog for printing.
*/
class WXDLLEXPORT wxDC;
class WXDLLEXPORT wxPrintDialog: public wxDialog
// ---------------------------------------------------------------------------
// wxPrinterDialog: the common dialog for printing.
// ---------------------------------------------------------------------------
class WXDLLEXPORT wxPrintDialog : public wxDialog
{
DECLARE_DYNAMIC_CLASS(wxPrintDialog)
DECLARE_DYNAMIC_CLASS(wxPrintDialog)
public:
wxPrintDialog(void);
wxPrintDialog(wxWindow *parent, wxPrintDialogData* data = NULL);
~wxPrintDialog(void);
wxPrintDialog();
wxPrintDialog(wxWindow *parent, wxPrintDialogData* data = NULL);
wxPrintDialog(wxWindow *parent, wxPrintData* data);
virtual ~wxPrintDialog();
bool Create(wxWindow *parent, wxPrintDialogData* data = NULL);
virtual int ShowModal(void);
bool Create(wxWindow *parent, wxPrintDialogData* data = NULL);
virtual int ShowModal();
inline wxPrintDialogData& GetPrintDialogData(void) { return m_printDialogData; }
inline wxPrintData& GetPrintData(void) { return m_printDialogData.GetPrintData(); }
virtual wxDC *GetPrintDC(void);
wxPrintDialogData& GetPrintDialogData() { return m_printDialogData; }
wxPrintData& GetPrintData() { return m_printDialogData.GetPrintData(); }
virtual wxDC *GetPrintDC();
private:
wxPrintDialogData m_printDialogData;
wxDC* m_printerDC;
bool m_destroyDC;
wxWindow* m_dialogParent;
wxPrintDialogData m_printDialogData;
wxDC* m_printerDC;
bool m_destroyDC;
wxWindow* m_dialogParent;
};
class WXDLLEXPORT wxPageSetupDialog: public wxDialog
{
DECLARE_DYNAMIC_CLASS(wxPageSetupDialog)
DECLARE_DYNAMIC_CLASS(wxPageSetupDialog)
private:
wxPageSetupData m_pageSetupData;
wxWindow* m_dialogParent;
public:
wxPageSetupDialog(void);
wxPageSetupDialog(wxWindow *parent, wxPageSetupData *data = NULL);
~wxPageSetupDialog(void);
public:
wxPageSetupDialog();
wxPageSetupDialog(wxWindow *parent, wxPageSetupData *data = NULL);
virtual ~wxPageSetupDialog();
bool Create(wxWindow *parent, wxPageSetupData *data = NULL);
virtual int ShowModal(void);
bool Create(wxWindow *parent, wxPageSetupData *data = NULL);
virtual int ShowModal();
inline wxPageSetupData& GetPageSetupData(void) { return m_pageSetupData; }
wxPageSetupData& GetPageSetupData() { return m_pageSetupData; }
private:
wxPageSetupData m_pageSetupData;
wxWindow* m_dialogParent;
};
#endif

View File

@ -6,54 +6,61 @@
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRINTWIN_H_
#define _WX_PRINTWIN_H_
#ifdef __GNUG__
#pragma interface "printwin.h"
#pragma interface "printwin.h"
#endif
#include "wx/prntbase.h"
/*
* Represents the printer: manages printing a wxPrintout object
*/
class WXDLLEXPORT wxWindowsPrinter: public wxPrinterBase
// ---------------------------------------------------------------------------
// Represents the printer: manages printing a wxPrintout object
// ---------------------------------------------------------------------------
class WXDLLEXPORT wxWindowsPrinter : public wxPrinterBase
{
DECLARE_DYNAMIC_CLASS(wxWindowsPrinter)
DECLARE_DYNAMIC_CLASS(wxWindowsPrinter)
public:
wxWindowsPrinter(wxPrintDialogData *data = NULL);
~wxWindowsPrinter(void);
public:
wxWindowsPrinter(wxPrintDialogData *data = NULL);
virtual ~wxWindowsPrinter();
virtual bool Print(wxWindow *parent, wxPrintout *printout, bool prompt = TRUE);
virtual wxDC* PrintDialog(wxWindow *parent);
virtual bool Setup(wxWindow *parent);
virtual bool Print(wxWindow *parent,
wxPrintout *printout,
bool prompt = TRUE);
virtual wxDC* PrintDialog(wxWindow *parent);
virtual bool Setup(wxWindow *parent);
private:
WXFARPROC m_lpAbortProc;
private:
WXFARPROC m_lpAbortProc;
};
/*
* wxPrintPreview
* Programmer creates an object of this class to preview a wxPrintout.
*/
class WXDLLEXPORT wxWindowsPrintPreview: public wxPrintPreviewBase
// ---------------------------------------------------------------------------
// wxPrintPreview: programmer creates an object of this class to preview a
// wxPrintout.
// ---------------------------------------------------------------------------
class WXDLLEXPORT wxWindowsPrintPreview : public wxPrintPreviewBase
{
DECLARE_CLASS(wxWindowsPrintPreview)
DECLARE_CLASS(wxWindowsPrintPreview)
public:
wxWindowsPrintPreview(wxPrintout *printout, wxPrintout *printoutForPrinting = NULL, wxPrintDialogData *data = NULL);
~wxWindowsPrintPreview(void);
public:
wxWindowsPrintPreview(wxPrintout *printout,
wxPrintout *printoutForPrinting = NULL,
wxPrintDialogData *data = NULL);
wxWindowsPrintPreview(wxPrintout *printout,
wxPrintout *printoutForPrinting,
wxPrintData *data);
virtual ~wxWindowsPrintPreview();
virtual bool Print(bool interactive);
virtual void DetermineScaling(void);
virtual bool Print(bool interactive);
virtual void DetermineScaling();
};
#endif
// _WX_PRINTWIN_H_
// _WX_PRINTWIN_H_

View File

@ -6,21 +6,26 @@
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Licence: wxWindows license
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
#ifdef __GNUG__
#pragma implementation "printdlg.h"
#pragma implementation "printdlg.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#pragma hdrstop
#endif
#include "wx/printdlg.h"
@ -28,7 +33,7 @@
// Have to emulate page setup dialog for Win16
#if !defined(__WIN95__)
#include "wx/generic/prntdlgg.h"
#include "wx/generic/prntdlgg.h"
#endif
#include <stdlib.h>
@ -36,7 +41,7 @@
#include <commdlg.h>
#ifndef __WIN32__
#include <print.h>
#include <print.h>
#endif
// Clash with Windows header files
@ -44,25 +49,44 @@
#undef StartDoc
#endif
// ---------------------------------------------------------------------------
// wxWin macros
// ---------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxPrintDialog, wxDialog)
IMPLEMENT_CLASS(wxPageSetupDialog, wxDialog)
IMPLEMENT_DYNAMIC_CLASS(wxPrintDialog, wxDialog)
IMPLEMENT_CLASS(wxPageSetupDialog, wxDialog)
#endif
wxPrintDialog::wxPrintDialog(void):
wxDialog()
// ===========================================================================
// implementation
// ===========================================================================
// ---------------------------------------------------------------------------
// wxPrintDialog
// ---------------------------------------------------------------------------
wxPrintDialog::wxPrintDialog()
{
m_dialogParent = NULL;
m_printerDC = NULL;
m_destroyDC = TRUE;
}
wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintDialogData* data):
wxDialog()
wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintDialogData* data)
{
Create(p, data);
}
wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintData* data)
{
wxPrintDialogData data2;
if ( data )
data2 = *data;
Create(p, &data2);
}
bool wxPrintDialog::Create(wxWindow *p, wxPrintDialogData* data)
{
m_dialogParent = p;
@ -71,22 +95,22 @@ bool wxPrintDialog::Create(wxWindow *p, wxPrintDialogData* data)
if ( data )
m_printDialogData = *data;
m_printDialogData.SetOwnerWindow(p);
return TRUE;
}
wxPrintDialog::~wxPrintDialog(void)
wxPrintDialog::~wxPrintDialog()
{
if (m_destroyDC && m_printerDC)
delete m_printerDC;
}
int wxPrintDialog::ShowModal(void)
int wxPrintDialog::ShowModal()
{
m_printDialogData.ConvertToNative();
bool ret = (PrintDlg( (PRINTDLG *)m_printDialogData.GetNativeData() ) != 0);
if ( ret != FALSE && ((PRINTDLG *)m_printDialogData.GetNativeData())->hDC)
{
@ -97,17 +121,11 @@ int wxPrintDialog::ShowModal(void)
}
else
{
/*
char buf[256];
DWORD exError = CommDlgExtendedError();
sprintf(buf, "ret = %d, ex error = %d", (int) ret, (int) exError);
wxMessageBox(buf);
*/
return wxID_CANCEL;
}
}
wxDC *wxPrintDialog::GetPrintDC(void)
wxDC *wxPrintDialog::GetPrintDC()
{
if (m_printerDC)
{
@ -118,18 +136,16 @@ wxDC *wxPrintDialog::GetPrintDC(void)
return (wxDC*) NULL;
}
/*
* wxPageSetupDialog
*/
// ---------------------------------------------------------------------------
// wxPageSetupDialog
// ---------------------------------------------------------------------------
wxPageSetupDialog::wxPageSetupDialog(void):
wxDialog()
wxPageSetupDialog::wxPageSetupDialog()
{
m_dialogParent = NULL;
}
wxPageSetupDialog::wxPageSetupDialog(wxWindow *p, wxPageSetupData *data):
wxDialog()
wxPageSetupDialog::wxPageSetupDialog(wxWindow *p, wxPageSetupData *data)
{
Create(p, data);
}
@ -137,21 +153,21 @@ wxDialog()
bool wxPageSetupDialog::Create(wxWindow *p, wxPageSetupData *data)
{
m_dialogParent = p;
if (data)
m_pageSetupData = (*data);
#if defined(__WIN95__)
m_pageSetupData.SetOwnerWindow(p);
#endif
return TRUE;
}
wxPageSetupDialog::~wxPageSetupDialog(void)
wxPageSetupDialog::~wxPageSetupDialog()
{
}
int wxPageSetupDialog::ShowModal(void)
int wxPageSetupDialog::ShowModal()
{
#ifdef __WIN95__
m_pageSetupData.ConvertToNative();

View File

@ -6,27 +6,35 @@
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Licence: wxWindows license
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
#ifdef __GNUG__
#pragma implementation "printwin.h"
#pragma implementation "printwin.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#pragma hdrstop
#endif
#include "wx/defs.h"
#ifndef WX_PRECOMP
#include "wx/utils.h"
#include "wx/dc.h"
#include "wx/app.h"
#include "wx/msgdlg.h"
#include "wx/utils.h"
#include "wx/dc.h"
#include "wx/app.h"
#include "wx/msgdlg.h"
#endif
#include "wx/msw/printwin.h"
@ -40,31 +48,43 @@
// Clash with Windows header files
#ifdef StartDoc
#undef StartDoc
#undef StartDoc
#endif
#ifndef __WIN32__
#include <print.h>
#include <print.h>
#endif
// ---------------------------------------------------------------------------
// private functions
// ---------------------------------------------------------------------------
LONG APIENTRY _EXPORT wxAbortProc(HDC hPr, int Code);
// ---------------------------------------------------------------------------
// wxWin macros
// ---------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindowsPrinter, wxPrinterBase)
IMPLEMENT_CLASS(wxWindowsPrintPreview, wxPrintPreviewBase)
IMPLEMENT_DYNAMIC_CLASS(wxWindowsPrinter, wxPrinterBase)
IMPLEMENT_CLASS(wxWindowsPrintPreview, wxPrintPreviewBase)
#endif
/*
* Printer
*/
// ===========================================================================
// implementation
// ===========================================================================
wxWindowsPrinter::wxWindowsPrinter(wxPrintDialogData *data):
wxPrinterBase(data)
// ---------------------------------------------------------------------------
// Printer
// ---------------------------------------------------------------------------
wxWindowsPrinter::wxWindowsPrinter(wxPrintDialogData *data)
: wxPrinterBase(data)
{
m_lpAbortProc = (WXFARPROC) MakeProcInstance((FARPROC) wxAbortProc, wxGetInstance());
}
wxWindowsPrinter::~wxWindowsPrinter(void)
wxWindowsPrinter::~wxWindowsPrinter()
{
FreeProcInstance((FARPROC) m_lpAbortProc);
}
@ -73,28 +93,28 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt
{
sm_abortIt = FALSE;
sm_abortWindow = NULL;
if (!printout)
return FALSE;
printout->SetIsPreview(FALSE);
printout->OnPreparePrinting();
// Get some parameters from the printout, if defined
int fromPage, toPage;
int minPage, maxPage;
printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage);
if (maxPage == 0)
return FALSE;
m_printDialogData.SetMinPage(minPage);
m_printDialogData.SetMaxPage(maxPage);
if (fromPage != 0)
m_printDialogData.SetFromPage(fromPage);
if (toPage != 0)
m_printDialogData.SetToPage(toPage);
if (minPage != 0)
{
m_printDialogData.EnablePageNumbers(TRUE);
@ -110,7 +130,7 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt
else
m_printDialogData.EnablePageNumbers(FALSE);
// Create a suitable device context
// Create a suitable device context
wxDC *dc = NULL;
if (prompt)
{
@ -123,24 +143,24 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt
// dc = new wxPrinterDC("", "", "", FALSE, m_printData.GetOrientation());
dc = new wxPrinterDC(m_printDialogData.GetPrintData());
}
// May have pressed cancel.
if (!dc || !dc->Ok())
{
if (dc) delete dc;
return FALSE;
}
int logPPIScreenX = 0;
int logPPIScreenY = 0;
int logPPIPrinterX = 0;
int logPPIPrinterY = 0;
HDC hdc = ::GetDC(NULL);
logPPIScreenX = ::GetDeviceCaps(hdc, LOGPIXELSX);
logPPIScreenY = ::GetDeviceCaps(hdc, LOGPIXELSY);
::ReleaseDC(NULL, hdc);
logPPIPrinterX = ::GetDeviceCaps((HDC) dc->GetHDC(), LOGPIXELSX);
logPPIPrinterY = ::GetDeviceCaps((HDC) dc->GetHDC(), LOGPIXELSY);
if (logPPIPrinterX == 0 || logPPIPrinterY == 0)
@ -148,33 +168,33 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt
delete dc;
return FALSE;
}
printout->SetPPIScreen(logPPIScreenX, logPPIScreenY);
printout->SetPPIPrinter(logPPIPrinterX, logPPIPrinterY);
// Set printout parameters
// Set printout parameters
printout->SetDC(dc);
int w, h;
dc->GetSize(&w, &h);
printout->SetPageSizePixels((int)w, (int)h);
dc->GetSizeMM(&w, &h);
printout->SetPageSizeMM((int)w, (int)h);
// Create an abort window
wxBeginBusyCursor();
wxWindow *win = CreateAbortWindow(parent, printout);
wxYield();
#if defined(__BORLANDC__) || defined(__GNUWIN32__) || defined(__SALFORDC__) || !defined(__WIN32__)
::SetAbortProc((HDC) dc->GetHDC(), (FARPROC) m_lpAbortProc);
#else
::SetAbortProc((HDC) dc->GetHDC(), (int (_stdcall *)
// cast it to right type only if required
// @@@ it's really cdecl and we're casting it to stdcall - either there is
// something I don't understand or it will crash at first usage
// FIXME it's really cdecl and we're casting it to stdcall - either there is
// something I don't understand or it will crash at first usage
#ifdef STRICT
(HDC, int)
#else
@ -182,33 +202,34 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt
#endif
)m_lpAbortProc);
#endif
if (!win)
{
wxEndBusyCursor();
wxMessageBox("Sorry, could not create an abort dialog.", "Print Error", wxOK, parent);
wxLogDebug("Could not create an abort dialog.");
delete dc;
}
sm_abortWindow = win;
sm_abortWindow->Show(TRUE);
wxYield();
wxSafeYield();
printout->OnBeginPrinting();
bool keepGoing = TRUE;
int copyCount;
for (copyCount = 1; copyCount <= m_printDialogData.GetNoCopies(); copyCount ++)
{
if (!printout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage()))
{
wxEndBusyCursor();
wxMessageBox("Could not start printing.", "Print Error", wxOK, parent);
wxLogError(_("Could not start printing."));
break;
}
if (sm_abortIt)
break;
int pn;
for (pn = m_printDialogData.GetFromPage(); keepGoing && (pn <= m_printDialogData.GetToPage()) && printout->HasPage(pn);
pn++)
@ -227,20 +248,20 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt
}
printout->OnEndDocument();
}
printout->OnEndPrinting();
if (sm_abortWindow)
{
sm_abortWindow->Show(FALSE);
delete sm_abortWindow;
sm_abortWindow = NULL;
}
wxEndBusyCursor();
delete dc;
return TRUE;
}
@ -279,13 +300,23 @@ bool wxWindowsPrinter::Setup(wxWindow *parent)
* Print preview
*/
wxWindowsPrintPreview::wxWindowsPrintPreview(wxPrintout *printout, wxPrintout *printoutForPrinting, wxPrintDialogData *data):
wxPrintPreviewBase(printout, printoutForPrinting, data)
wxWindowsPrintPreview::wxWindowsPrintPreview(wxPrintout *printout,
wxPrintout *printoutForPrinting,
wxPrintDialogData *data)
: wxPrintPreviewBase(printout, printoutForPrinting, data)
{
DetermineScaling();
}
wxWindowsPrintPreview::~wxWindowsPrintPreview(void)
wxWindowsPrintPreview::wxWindowsPrintPreview(wxPrintout *printout,
wxPrintout *printoutForPrinting,
wxPrintData *data)
: wxPrintPreviewBase(printout, printoutForPrinting, data)
{
DetermineScaling();
}
wxWindowsPrintPreview::~wxWindowsPrintPreview()
{
}
@ -297,7 +328,7 @@ bool wxWindowsPrintPreview::Print(bool interactive)
return printer.Print(m_previewFrame, m_printPrintout, interactive);
}
void wxWindowsPrintPreview::DetermineScaling(void)
void wxWindowsPrintPreview::DetermineScaling()
{
HDC dc = ::GetDC(NULL);
int screenWidth = ::GetDeviceCaps(dc, HORZSIZE);
@ -307,39 +338,39 @@ void wxWindowsPrintPreview::DetermineScaling(void)
int logPPIScreenX = ::GetDeviceCaps(dc, LOGPIXELSX);
int logPPIScreenY = ::GetDeviceCaps(dc, LOGPIXELSY);
m_previewPrintout->SetPPIScreen(logPPIScreenX, logPPIScreenY);
::ReleaseDC(NULL, dc);
// Get a device context for the currently selected printer
wxPrinterDC printerDC(m_printDialogData.GetPrintData());
int printerWidth = 150;
int printerHeight = 250;
int printerXRes = 1500;
int printerYRes = 2500;
if (printerDC.GetHDC())
{
printerWidth = ::GetDeviceCaps((HDC) printerDC.GetHDC(), HORZSIZE);
printerHeight = ::GetDeviceCaps((HDC) printerDC.GetHDC(), VERTSIZE);
printerXRes = ::GetDeviceCaps((HDC) printerDC.GetHDC(), HORZRES);
printerYRes = ::GetDeviceCaps((HDC) printerDC.GetHDC(), VERTRES);
int logPPIPrinterX = ::GetDeviceCaps((HDC) printerDC.GetHDC(), LOGPIXELSX);
int logPPIPrinterY = ::GetDeviceCaps((HDC) printerDC.GetHDC(), LOGPIXELSY);
m_previewPrintout->SetPPIPrinter(logPPIPrinterX, logPPIPrinterY);
m_previewPrintout->SetPageSizeMM(printerWidth, printerHeight);
if (logPPIPrinterX == 0 || logPPIPrinterY == 0 || printerWidth == 0 || printerHeight == 0)
m_isOk = FALSE;
}
else
m_isOk = FALSE;
m_pageWidth = printerXRes;
m_pageHeight = printerYRes;
// At 100%, the page should look about page-size on the screen.
m_previewScale = (float)((float)screenWidth/(float)printerWidth);
m_previewScale = m_previewScale * (float)((float)screenXRes/(float)printerYRes);
@ -348,28 +379,28 @@ void wxWindowsPrintPreview::DetermineScaling(void)
/****************************************************************************
FUNCTION: wxAbortProc()
PURPOSE: Processes messages for the Abort Dialog box
****************************************************************************/
LONG APIENTRY _EXPORT wxAbortProc(HDC WXUNUSED(hPr), int WXUNUSED(Code))
{
MSG msg;
if (!wxPrinterBase::sm_abortWindow) /* If the abort dialog isn't up yet */
return(TRUE);
/* Process messages intended for the abort dialog box */
while (!wxPrinterBase::sm_abortIt && PeekMessage(&msg, 0, 0, 0, TRUE))
if (!IsDialogMessage((HWND) wxPrinterBase::sm_abortWindow->GetHWND(), &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/* bAbort is TRUE (return is FALSE) if the user has aborted */
return (!wxPrinterBase::sm_abortIt);
}