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:
Julian Smart
2000-01-25 13:35:44 +00:00
parent 8ad6ad991c
commit eaeb6a3c37
3 changed files with 145 additions and 9 deletions

View File

@@ -176,6 +176,8 @@ class WXDLLEXPORT wxPrintData: public wxObject
void ConvertFromNative(); void ConvertFromNative();
void* GetNativeData() const { return m_devMode; } void* GetNativeData() const { return m_devMode; }
void SetNativeData(void* data) { m_devMode = data; } void SetNativeData(void* data) { m_devMode = data; }
void* GetNativeDataDevNames() const { return m_devNames; }
void SetNativeDataDevNames(void* data) { m_devNames = data; }
#elif defined( __WXMAC__) #elif defined( __WXMAC__)
void ConvertToNative(); void ConvertToNative();
void ConvertFromNative(); void ConvertFromNative();
@@ -184,6 +186,7 @@ class WXDLLEXPORT wxPrintData: public wxObject
public: public:
#ifdef __WXMSW__ #ifdef __WXMSW__
void* m_devMode; void* m_devMode;
void* m_devNames;
#elif defined( __WXMAC__ ) #elif defined( __WXMAC__ )
THPrint m_macPrintInfo ; THPrint m_macPrintInfo ;
#endif #endif

View File

@@ -169,7 +169,8 @@ wxFontData::~wxFontData()
wxPrintData::wxPrintData() wxPrintData::wxPrintData()
{ {
#ifdef __WXMSW__ #ifdef __WXMSW__
m_devMode = NULL; m_devMode = (void*) NULL;
m_devNames = (void*) NULL;
#elif defined( __WXMAC__ ) #elif defined( __WXMAC__ )
m_macPrintInfo = NULL ; m_macPrintInfo = NULL ;
#endif #endif
@@ -201,7 +202,8 @@ wxPrintData::wxPrintData()
wxPrintData::wxPrintData(const wxPrintData& printData) wxPrintData::wxPrintData(const wxPrintData& printData)
{ {
#ifdef __WXMSW__ #ifdef __WXMSW__
m_devMode = NULL; m_devMode = (void*) NULL;
m_devNames = (void*) NULL;
#elif defined( __WXMAC__ ) #elif defined( __WXMAC__ )
m_macPrintInfo = NULL ; m_macPrintInfo = NULL ;
#endif #endif
@@ -212,8 +214,11 @@ wxPrintData::~wxPrintData()
{ {
#ifdef __WXMSW__ #ifdef __WXMSW__
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
if (hDevMode ) if ( hDevMode )
GlobalFree(hDevMode); GlobalFree(hDevMode);
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
if ( hDevNames )
GlobalFree(hDevNames);
#elif defined(__WXMAC__) #elif defined(__WXMAC__)
if ( m_macPrintInfo ) if ( m_macPrintInfo )
::DisposeHandle( (Handle) m_macPrintInfo ) ; ::DisposeHandle( (Handle) m_macPrintInfo ) ;
@@ -257,9 +262,40 @@ static wxString wxGetPrintDlgError()
} }
#endif #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() void wxPrintData::ConvertToNative()
{ {
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
if (!hDevMode) if (!hDevMode)
{ {
// Use PRINTDLG as a way of creating a DEVMODE object // Use PRINTDLG as a way of creating a DEVMODE object
@@ -301,13 +337,19 @@ void wxPrintData::ConvertToNative()
} }
else else
{ {
hDevMode = pd->hDevMode;
m_devMode = (void*)(long) hDevMode;
pd->hDevMode = NULL;
// We'll create a new DEVNAMEs structure below.
if ( pd->hDevNames ) if ( pd->hDevNames )
GlobalFree(pd->hDevNames); GlobalFree(pd->hDevNames);
pd->hDevNames = NULL; pd->hDevNames = NULL;
hDevMode = pd->hDevMode; // hDevNames = pd->hDevNames;
m_devMode = (void*)(long) hDevMode; // m_devNames = (void*)(long) hDevNames;
pd->hDevMode = NULL; // pd->hDevnames = NULL;
} }
delete pd; delete pd;
@@ -426,11 +468,20 @@ void wxPrintData::ConvertToNative()
GlobalUnlock(hDevMode); 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() void wxPrintData::ConvertFromNative()
{ {
HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
if (!hDevMode) if (!hDevMode)
return; return;
@@ -599,6 +650,30 @@ void wxPrintData::ConvertFromNative()
GlobalUnlock(hDevMode); 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 #endif
@@ -793,12 +868,23 @@ void wxPrintDialogData::ConvertToNative()
GlobalFree(pd->hDevMode); 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(); pd->hDevMode = (HGLOBAL)(DWORD) m_printData.GetNativeData();
m_printData.SetNativeData((void*) NULL); m_printData.SetNativeData((void*) NULL);
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!")); 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->hDC = (HDC) NULL;
pd->nFromPage = (UINT)m_printFromPage; pd->nFromPage = (UINT)m_printFromPage;
pd->nToPage = (UINT)m_printToPage; pd->nToPage = (UINT)m_printToPage;
@@ -815,7 +901,7 @@ void wxPrintDialogData::ConvertToNative()
#endif #endif
pd->hwndOwner=(HWND)NULL; pd->hwndOwner=(HWND)NULL;
pd->hDevNames=(HANDLE)NULL; // pd->hDevNames=(HANDLE)NULL;
pd->hInstance=(HINSTANCE)NULL; pd->hInstance=(HINSTANCE)NULL;
pd->lCustData = (LPARAM) NULL; pd->lCustData = (LPARAM) NULL;
pd->lpfnPrintHook = NULL; pd->lpfnPrintHook = NULL;
@@ -863,6 +949,18 @@ void wxPrintDialogData::ConvertFromNative()
pd->hDevMode = NULL; 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, // Now convert the DEVMODE object, passed down from the PRINTDLG object,
// into wxWindows form. // into wxWindows form.
m_printData.ConvertFromNative(); m_printData.ConvertFromNative();
@@ -1044,6 +1142,8 @@ wxPageSetupDialogData::~wxPageSetupDialogData()
PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData; PAGESETUPDLG *pd = (PAGESETUPDLG *)m_pageSetupData;
if ( pd && pd->hDevMode ) if ( pd && pd->hDevMode )
GlobalFree(pd->hDevMode); GlobalFree(pd->hDevMode);
if ( pd && pd->hDevNames )
GlobalFree(pd->hDevNames);
if ( pd ) if ( pd )
delete pd; delete pd;
#elif defined( __WXMAC__ ) #elif defined( __WXMAC__ )
@@ -1086,6 +1186,7 @@ void wxPageSetupDialogData::ConvertToNative()
{ {
pd = new PAGESETUPDLG; pd = new PAGESETUPDLG;
pd->hDevMode = NULL; pd->hDevMode = NULL;
pd->hDevNames = NULL;
m_pageSetupData = (void *)pd; m_pageSetupData = (void *)pd;
} }
@@ -1105,6 +1206,20 @@ void wxPageSetupDialogData::ConvertToNative()
wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in 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->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE));
pd->Flags = PSD_MARGINS|PSD_MINMARGINS; pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
@@ -1129,7 +1244,7 @@ void wxPageSetupDialogData::ConvertToNative()
pd->lStructSize = sizeof( PAGESETUPDLG ); pd->lStructSize = sizeof( PAGESETUPDLG );
pd->hwndOwner=(HWND)NULL; pd->hwndOwner=(HWND)NULL;
pd->hDevNames=(HWND)NULL; // pd->hDevNames=(HWND)NULL;
pd->hInstance=(HINSTANCE)NULL; pd->hInstance=(HINSTANCE)NULL;
pd->ptPaperSize.x = m_paperSize.x * 100; pd->ptPaperSize.x = m_paperSize.x * 100;
@@ -1184,6 +1299,20 @@ void wxPageSetupDialogData::ConvertFromNative()
m_printData.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; pd->Flags = PSD_MARGINS|PSD_MINMARGINS;
m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS); m_defaultMinMargins = ((pd->Flags & PSD_DEFAULTMINMARGINS) == PSD_DEFAULTMINMARGINS);

View File

@@ -261,7 +261,11 @@ void wxDC::Clear()
} }
else 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.left = 0; rect.top = 0;
rect.right = m_selectedBitmap.GetWidth(); rect.right = m_selectedBitmap.GetWidth();