X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4e22a1f243ff35cf426d243fcc282d915e7d9421..b9efe021b554fa3967d1442cf758435c5cd5ae8f:/src/msw/printdlg.cpp?ds=inline diff --git a/src/msw/printdlg.cpp b/src/msw/printdlg.cpp index 6a8457f3c3..378044bb5e 100644 --- a/src/msw/printdlg.cpp +++ b/src/msw/printdlg.cpp @@ -44,9 +44,7 @@ #include -#include "wx/msw/private.h" - -#include +#include "wx/msw/wrapcdlg.h" #ifndef __WIN32__ #include @@ -130,6 +128,7 @@ wxWindowsPrintNativeData::wxWindowsPrintNativeData() { m_devMode = (void*) NULL; m_devNames = (void*) NULL; + m_customWindowsPaperId = 0; } wxWindowsPrintNativeData::~wxWindowsPrintNativeData() @@ -153,9 +152,10 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; if (!hDevMode) + { return false; - - if ( hDevMode ) + } + else { LPDEVMODE devMode = (LPDEVMODE)GlobalLock(hDevMode); @@ -200,6 +200,8 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) // set both DM_PAPERSIZE and DM_PAPERWIDTH & DM_PAPERLENGTH. Since // dmPaperSize >= DMPAPER_USER wouldn't be in wxWin's database, this // code wouldn't set m_paperSize correctly. + + bool foundPaperSize = false; if ((devMode->dmFields & DM_PAPERSIZE) && (devMode->dmPaperSize < DMPAPER_USER)) { if (wxThePrintPaperDatabase) @@ -209,13 +211,8 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) { data.SetPaperId( paper->GetId() ); data.SetPaperSize( wxSize(paper->GetWidth() / 10,paper->GetHeight() / 10) ); - } - else - { - // Shouldn't really get here - wxFAIL_MSG(wxT("Couldn't find paper size in paper database.")); - data.SetPaperId( wxPAPER_NONE ); - data.SetPaperSize( wxSize(0,0) ); + m_customWindowsPaperId = 0; + foundPaperSize = true; } } else @@ -224,20 +221,29 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative.")); data.SetPaperId( wxPAPER_NONE ); data.SetPaperSize( wxSize(0,0) ); + m_customWindowsPaperId = 0; + + GlobalUnlock(hDevMode); + return false; } } - else if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH)) + + if (!foundPaperSize && (devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH)) { // DEVMODE is in tenths of a milimeter - data.SetPaperId( wxPAPER_NONE ); data.SetPaperSize( wxSize(devMode->dmPaperWidth / 10, devMode->dmPaperLength / 10) ); + data.SetPaperId( wxPAPER_NONE ); + m_customWindowsPaperId = devMode->dmPaperSize; } else { - // Shouldn't really get here - wxFAIL_MSG(wxT("Couldn't find paper size from DEVMODE.")); - data.SetPaperId( wxPAPER_NONE ); + // Often will reach this for non-standard paper sizes (sizes which + // wouldn't be in wxWidget's paper database). Setting + // m_customWindowsPaperId to devMode->dmPaperSize should be enough + // to get this paper size working. data.SetPaperSize( wxSize(0,0) ); + data.SetPaperId( wxPAPER_NONE ); + m_customWindowsPaperId = devMode->dmPaperSize; } //// Duplex @@ -302,7 +308,7 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) wxString printerName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset; // Not sure if we should check for this mismatch -// wxASSERT_MSG( (m_printerName == "" || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!"); +// wxASSERT_MSG( (m_printerName.empty() || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!"); if (!printerName.empty()) data.SetPrinterName( printerName ); @@ -416,7 +422,10 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) // DEVMODE is in tenths of a milimeter devMode->dmPaperWidth = (short)(data.GetPaperSize().x * 10); devMode->dmPaperLength = (short)(data.GetPaperSize().y * 10); - devMode->dmPaperSize = DMPAPER_USER; + if(m_customWindowsPaperId != 0) + devMode->dmPaperSize = m_customWindowsPaperId; + else + devMode->dmPaperSize = DMPAPER_USER; devMode->dmFields |= DM_PAPERWIDTH; devMode->dmFields |= DM_PAPERLENGTH; } @@ -430,6 +439,15 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) devMode->dmPaperSize = (short)paper->GetPlatformId(); devMode->dmFields |= DM_PAPERSIZE; } + else + { + // Fall back on specifying the paper size explicitly + devMode->dmPaperWidth = (short)(data.GetPaperSize().x * 10); + devMode->dmPaperLength = (short)(data.GetPaperSize().y * 10); + devMode->dmPaperSize = DMPAPER_USER; + devMode->dmFields |= DM_PAPERWIDTH; + devMode->dmFields |= DM_PAPERLENGTH; + } } }