Added DEVNAMES to wxPrintDialog to remember printer name; fixed wxDC::Clear
to not assert for printer DCs git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5650 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -176,6 +176,8 @@ class WXDLLEXPORT wxPrintData: public wxObject
|
||||
void ConvertFromNative();
|
||||
void* GetNativeData() const { return m_devMode; }
|
||||
void SetNativeData(void* data) { m_devMode = data; }
|
||||
void* GetNativeDataDevNames() const { return m_devNames; }
|
||||
void SetNativeDataDevNames(void* data) { m_devNames = data; }
|
||||
#elif defined( __WXMAC__)
|
||||
void ConvertToNative();
|
||||
void ConvertFromNative();
|
||||
@@ -184,6 +186,7 @@ class WXDLLEXPORT wxPrintData: public wxObject
|
||||
public:
|
||||
#ifdef __WXMSW__
|
||||
void* m_devMode;
|
||||
void* m_devNames;
|
||||
#elif defined( __WXMAC__ )
|
||||
THPrint m_macPrintInfo ;
|
||||
#endif
|
||||
|
@@ -169,7 +169,8 @@ wxFontData::~wxFontData()
|
||||
wxPrintData::wxPrintData()
|
||||
{
|
||||
#ifdef __WXMSW__
|
||||
m_devMode = NULL;
|
||||
m_devMode = (void*) NULL;
|
||||
m_devNames = (void*) NULL;
|
||||
#elif defined( __WXMAC__ )
|
||||
m_macPrintInfo = NULL ;
|
||||
#endif
|
||||
@@ -201,7 +202,8 @@ wxPrintData::wxPrintData()
|
||||
wxPrintData::wxPrintData(const wxPrintData& printData)
|
||||
{
|
||||
#ifdef __WXMSW__
|
||||
m_devMode = NULL;
|
||||
m_devMode = (void*) NULL;
|
||||
m_devNames = (void*) NULL;
|
||||
#elif defined( __WXMAC__ )
|
||||
m_macPrintInfo = NULL ;
|
||||
#endif
|
||||
@@ -212,8 +214,11 @@ wxPrintData::~wxPrintData()
|
||||
{
|
||||
#ifdef __WXMSW__
|
||||
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
||||
if (hDevMode )
|
||||
if ( hDevMode )
|
||||
GlobalFree(hDevMode);
|
||||
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
|
||||
if ( hDevNames )
|
||||
GlobalFree(hDevNames);
|
||||
#elif defined(__WXMAC__)
|
||||
if ( m_macPrintInfo )
|
||||
::DisposeHandle( (Handle) m_macPrintInfo ) ;
|
||||
@@ -257,9 +262,40 @@ static wxString wxGetPrintDlgError()
|
||||
}
|
||||
#endif
|
||||
|
||||
static HGLOBAL wxCreateDevNames(const wxString& driverName, const wxString& printerName, const wxString& portName)
|
||||
{
|
||||
HGLOBAL hDev = NULL;
|
||||
// if (!driverName.IsEmpty() && !printerName.IsEmpty() && !portName.IsEmpty())
|
||||
if (driverName.IsEmpty() && printerName.IsEmpty() && portName.IsEmpty())
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
hDev = GlobalAlloc(GPTR, 4*sizeof(WORD)+
|
||||
driverName.Length() + 1 +
|
||||
printerName.Length() + 1 +
|
||||
portName.Length()+1);
|
||||
LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(hDev);
|
||||
lpDev->wDriverOffset = sizeof(WORD)*4;
|
||||
wxStrcpy((wxChar*)lpDev + lpDev->wDriverOffset, driverName);
|
||||
|
||||
lpDev->wDeviceOffset = (WORD)(lpDev->wDriverOffset + driverName.Length()+1);
|
||||
wxStrcpy((wxChar*)lpDev + lpDev->wDeviceOffset, printerName);
|
||||
|
||||
lpDev->wOutputOffset = (WORD)(lpDev->wDeviceOffset + printerName.Length()+1);
|
||||
wxStrcpy((wxChar*)lpDev + lpDev->wOutputOffset, portName);
|
||||
|
||||
lpDev->wDefault = 0;
|
||||
|
||||
GlobalUnlock(hDev);
|
||||
}
|
||||
return hDev;
|
||||
}
|
||||
|
||||
void wxPrintData::ConvertToNative()
|
||||
{
|
||||
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
||||
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
|
||||
if (!hDevMode)
|
||||
{
|
||||
// Use PRINTDLG as a way of creating a DEVMODE object
|
||||
@@ -301,13 +337,19 @@ void wxPrintData::ConvertToNative()
|
||||
}
|
||||
else
|
||||
{
|
||||
hDevMode = pd->hDevMode;
|
||||
m_devMode = (void*)(long) hDevMode;
|
||||
pd->hDevMode = NULL;
|
||||
|
||||
// We'll create a new DEVNAMEs structure below.
|
||||
if ( pd->hDevNames )
|
||||
GlobalFree(pd->hDevNames);
|
||||
pd->hDevNames = NULL;
|
||||
|
||||
hDevMode = pd->hDevMode;
|
||||
m_devMode = (void*)(long) hDevMode;
|
||||
pd->hDevMode = NULL;
|
||||
// hDevNames = pd->hDevNames;
|
||||
// m_devNames = (void*)(long) hDevNames;
|
||||
// pd->hDevnames = NULL;
|
||||
|
||||
}
|
||||
|
||||
delete pd;
|
||||
@@ -426,11 +468,20 @@ void wxPrintData::ConvertToNative()
|
||||
|
||||
GlobalUnlock(hDevMode);
|
||||
}
|
||||
|
||||
if ( hDevNames )
|
||||
{
|
||||
GlobalFree(hDevNames);
|
||||
}
|
||||
|
||||
// TODO: I hope it's OK to pass some empty strings to DEVNAMES.
|
||||
hDevNames = wxCreateDevNames("", m_printerName, "");
|
||||
}
|
||||
|
||||
void wxPrintData::ConvertFromNative()
|
||||
{
|
||||
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
|
||||
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
|
||||
|
||||
if (!hDevMode)
|
||||
return;
|
||||
@@ -599,6 +650,30 @@ void wxPrintData::ConvertFromNative()
|
||||
|
||||
GlobalUnlock(hDevMode);
|
||||
}
|
||||
|
||||
if (hDevNames)
|
||||
{
|
||||
LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(hDevNames);
|
||||
if (lpDevNames)
|
||||
{
|
||||
// TODO: Unicode-ification
|
||||
|
||||
// Get the port name
|
||||
// port is obsolete in WIN32
|
||||
// m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset);
|
||||
|
||||
// Get the printer name
|
||||
wxString printerName = (LPSTR)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!");
|
||||
|
||||
if (printerName != "")
|
||||
m_printerName = printerName;
|
||||
|
||||
GlobalUnlock(hDevNames);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -793,12 +868,23 @@ void wxPrintDialogData::ConvertToNative()
|
||||
GlobalFree(pd->hDevMode);
|
||||
}
|
||||
|
||||
// Pass the devnames data to the PRINTDLG structure, since it'll
|
||||
// be needed when PrintDlg is called.
|
||||
if (pd->hDevNames)
|
||||
{
|
||||
GlobalFree(pd->hDevNames);
|
||||
}
|
||||
|
||||
pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData();
|
||||
|
||||
m_printData.SetNativeData((void*) NULL);
|
||||
|
||||
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
|
||||
|
||||
pd->hDevNames = (HGLOBAL)(DWORD) m_printData.GetNativeDataDevNames();
|
||||
|
||||
m_printData.SetNativeDataDevNames((void*) NULL);
|
||||
|
||||
pd->hDC = (HDC) NULL;
|
||||
pd->nFromPage = (UINT)m_printFromPage;
|
||||
pd->nToPage = (UINT)m_printToPage;
|
||||
@@ -815,7 +901,7 @@ void wxPrintDialogData::ConvertToNative()
|
||||
#endif
|
||||
|
||||
pd->hwndOwner=(HWND)NULL;
|
||||
pd->hDevNames=(HANDLE)NULL;
|
||||
// pd->hDevNames=(HANDLE)NULL;
|
||||
pd->hInstance=(HINSTANCE)NULL;
|
||||
pd->lCustData = (LPARAM) NULL;
|
||||
pd->lpfnPrintHook = NULL;
|
||||
@@ -863,6 +949,18 @@ void wxPrintDialogData::ConvertFromNative()
|
||||
pd->hDevMode = NULL;
|
||||
}
|
||||
|
||||
// Pass the devnames data back to the wxPrintData structure where it really belongs.
|
||||
if (pd->hDevNames)
|
||||
{
|
||||
if (m_printData.GetNativeDataDevNames())
|
||||
{
|
||||
// Make sure we don't leak memory
|
||||
GlobalFree((HGLOBAL)(DWORD) m_printData.GetNativeDataDevNames());
|
||||
}
|
||||
m_printData.SetNativeDataDevNames((void*)(long) pd->hDevNames);
|
||||
pd->hDevNames = NULL;
|
||||
}
|
||||
|
||||
// Now convert the DEVMODE object, passed down from the PRINTDLG object,
|
||||
// into wxWindows form.
|
||||
m_printData.ConvertFromNative();
|
||||
@@ -1044,6 +1142,8 @@ wxPageSetupDialogData::~wxPageSetupDialogData()
|
||||
PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData;
|
||||
if ( pd && pd->hDevMode )
|
||||
GlobalFree(pd->hDevMode);
|
||||
if ( pd && pd->hDevNames )
|
||||
GlobalFree(pd->hDevNames);
|
||||
if ( pd )
|
||||
delete pd;
|
||||
#elif defined( __WXMAC__ )
|
||||
@@ -1086,6 +1186,7 @@ void wxPageSetupDialogData::ConvertToNative()
|
||||
{
|
||||
pd = new PAGESETUPDLG;
|
||||
pd->hDevMode = NULL;
|
||||
pd->hDevNames = NULL;
|
||||
m_pageSetupData = (void *)pd;
|
||||
}
|
||||
|
||||
@@ -1105,6 +1206,20 @@ void wxPageSetupDialogData::ConvertToNative()
|
||||
|
||||
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
|
||||
|
||||
// Pass the devnames data (created in m_printData.ConvertToNative)
|
||||
// to the PRINTDLG structure, since it'll
|
||||
// be needed when PrintDlg is called.
|
||||
|
||||
if (pd->hDevNames)
|
||||
{
|
||||
GlobalFree(pd->hDevNames);
|
||||
pd->hDevNames = NULL;
|
||||
}
|
||||
|
||||
pd->hDevNames = (HGLOBAL) m_printData.GetNativeDataDevNames();
|
||||
|
||||
m_printData.SetNativeDataDevNames((void*) NULL);
|
||||
|
||||
// pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE));
|
||||
|
||||
pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
|
||||
@@ -1129,7 +1244,7 @@ void wxPageSetupDialogData::ConvertToNative()
|
||||
|
||||
pd->lStructSize = sizeof( PAGESETUPDLG );
|
||||
pd->hwndOwner=(HWND)NULL;
|
||||
pd->hDevNames=(HWND)NULL;
|
||||
// pd->hDevNames=(HWND)NULL;
|
||||
pd->hInstance=(HINSTANCE)NULL;
|
||||
|
||||
pd->ptPaperSize.x = m_paperSize.x * 100;
|
||||
@@ -1184,6 +1299,20 @@ void wxPageSetupDialogData::ConvertFromNative()
|
||||
|
||||
m_printData.ConvertFromNative();
|
||||
|
||||
// Pass the devnames data back to the wxPrintData structure where it really belongs.
|
||||
if (pd->hDevNames)
|
||||
{
|
||||
if (m_printData.GetNativeDataDevNames())
|
||||
{
|
||||
// Make sure we don't leak memory
|
||||
GlobalFree((HGLOBAL) m_printData.GetNativeDataDevNames());
|
||||
}
|
||||
m_printData.SetNativeDataDevNames((void*) pd->hDevNames);
|
||||
pd->hDevNames = NULL;
|
||||
}
|
||||
|
||||
m_printData.ConvertFromNative();
|
||||
|
||||
pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
|
||||
|
||||
m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS);
|
||||
|
@@ -261,7 +261,11 @@ void wxDC::Clear()
|
||||
}
|
||||
else
|
||||
{
|
||||
wxCHECK_RET( m_selectedBitmap.Ok(), wxT("this DC can't be cleared") );
|
||||
// No, I think we should simply ignore this if printing on e.g.
|
||||
// a printer DC.
|
||||
// wxCHECK_RET( m_selectedBitmap.Ok(), wxT("this DC can't be cleared") );
|
||||
if (!m_selectedBitmap.Ok())
|
||||
return;
|
||||
|
||||
rect.left = 0; rect.top = 0;
|
||||
rect.right = m_selectedBitmap.GetWidth();
|
||||
|
Reference in New Issue
Block a user