Initialize wxPrintData to the appropriate defaults in wxMSW
Initialize DEVMODE to the per-user default printer settings or, failing that, to the global default settings. Closes https://github.com/wxWidgets/wxWidgets/pull/2422
This commit is contained in:
committed by
Vadim Zeitlin
parent
3b8c023744
commit
0ac8a75e97
@@ -76,6 +76,31 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
// Try to get printer information at the specified level.
|
||||
//
|
||||
// Fills in the provided buffer and returns true on success, otherwise just
|
||||
// returns false.
|
||||
bool GetData(wxMemoryBuffer& buffer, int level)
|
||||
{
|
||||
if ( !m_hPrinter )
|
||||
return false;
|
||||
|
||||
DWORD bufSize = 0;
|
||||
if ( !::GetPrinter(m_hPrinter, level, NULL, 0, &bufSize) || !bufSize )
|
||||
return false;
|
||||
|
||||
if ( !::GetPrinter(m_hPrinter,
|
||||
level,
|
||||
(LPBYTE) buffer.GetWriteBuf(bufSize),
|
||||
bufSize,
|
||||
&bufSize) )
|
||||
return false;
|
||||
|
||||
buffer.SetDataLen(bufSize);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
operator HANDLE() { return m_hPrinter; }
|
||||
operator bool() { return m_hPrinter != (HANDLE)NULL; }
|
||||
|
||||
@@ -488,6 +513,47 @@ void wxWindowsPrintNativeData::InitializeDevMode(const wxString& printerName, Wi
|
||||
}
|
||||
}
|
||||
|
||||
// Try to initialize devmode to user or system default.
|
||||
if (m_devMode)
|
||||
{
|
||||
GlobalPtrLock lockDevMode(m_devMode);
|
||||
LPDEVMODE tempDevMode = static_cast<LPDEVMODE>(lockDevMode.Get());
|
||||
if (tempDevMode)
|
||||
{
|
||||
WinPrinter winPrinter;
|
||||
if (winPrinter.Open(tempDevMode->dmDeviceName))
|
||||
{
|
||||
DEVMODE* pDevMode = NULL;
|
||||
|
||||
wxMemoryBuffer buffer;
|
||||
|
||||
// Try level 9 (per-user default printer settings) first.
|
||||
if ( winPrinter.GetData(buffer, 9) )
|
||||
pDevMode = static_cast<PRINTER_INFO_9*>(buffer.GetData())->pDevMode;
|
||||
|
||||
// If not available, try level 8 (global default printer
|
||||
// settings).
|
||||
if ( !pDevMode )
|
||||
{
|
||||
if ( winPrinter.GetData(buffer, 8) )
|
||||
pDevMode = static_cast<PRINTER_INFO_8*>(buffer.GetData())->pDevMode;
|
||||
}
|
||||
|
||||
if ( pDevMode )
|
||||
{
|
||||
DWORD devModeSize = pDevMode->dmSize + pDevMode->dmDriverExtra;
|
||||
GlobalPtr newDevMode(devModeSize, GMEM_FIXED | GMEM_ZEROINIT);
|
||||
if ( newDevMode )
|
||||
{
|
||||
memcpy(newDevMode, pDevMode, devModeSize);
|
||||
|
||||
::GlobalFree(m_devMode);
|
||||
m_devMode = newDevMode.Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
|
||||
|
Reference in New Issue
Block a user