]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/printdlg.cpp
tweak GetAppDir() to recognize more debug build directory suffixes
[wxWidgets.git] / src / msw / printdlg.cpp
index c8586ab3e0469c9fb3c3b7ce927caddd43572e99..c7bc5edb3e4013b5b397c4b53703d204ca4241f9 100644 (file)
 
 #include "wx/printdlg.h"
 #include "wx/msw/printdlg.h"
+#include "wx/msw/dcprint.h"
 #include "wx/paper.h"
 
 #include <stdlib.h>
 
-#ifndef __WIN32__
-    #include <print.h>
-#endif
-
 //----------------------------------------------------------------------------
 // wxWindowsPrintNativeData
 //----------------------------------------------------------------------------
@@ -82,9 +79,12 @@ static wxString wxGetPrintDlgError()
     }
     return msg;
 }
-#endif
+#endif // __WXDEBUG__
 
-static HGLOBAL wxCreateDevNames(const wxString& driverName, const wxString& printerName, const wxString& portName)
+static HGLOBAL
+wxCreateDevNames(const wxString& driverName,
+                 const wxString& printerName,
+                 const wxString& portName)
 {
     HGLOBAL hDev = NULL;
     // if (!driverName.empty() && !printerName.empty() && !portName.empty())
@@ -121,19 +121,18 @@ IMPLEMENT_CLASS(wxWindowsPrintNativeData, wxPrintNativeDataBase)
 
 wxWindowsPrintNativeData::wxWindowsPrintNativeData()
 {
-    m_devMode = (void*) NULL;
-    m_devNames = (void*) NULL;
+    m_devMode = NULL;
+    m_devNames = NULL;
     m_customWindowsPaperId = 0;
 }
 
 wxWindowsPrintNativeData::~wxWindowsPrintNativeData()
 {
-    HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
-    if ( hDevMode )
-        GlobalFree(hDevMode);
-    HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
-    if ( hDevNames )
-        GlobalFree(hDevNames);
+    if ( m_devMode )
+        ::GlobalFree(static_cast<HGLOBAL>(m_devMode));
+
+    if ( m_devNames )
+        ::GlobalFree(static_cast<HGLOBAL>(m_devNames));
 }
 
 bool wxWindowsPrintNativeData::IsOk() const
@@ -143,205 +142,192 @@ bool wxWindowsPrintNativeData::IsOk() const
 
 bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data )
 {
-    HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
-    HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
-
-    if (!hDevMode)
-    {
+    if ( !m_devMode )
         return false;
-    }
-    else
-    {
-        LPDEVMODE devMode = (LPDEVMODE)GlobalLock(hDevMode);
 
-        //// Orientation
-        if (devMode->dmFields & DM_ORIENTATION)
-            data.SetOrientation( devMode->dmOrientation );
+    GlobalPtrLock lockDevMode(m_devMode);
 
-        //// Collation
-        if (devMode->dmFields & DM_COLLATE)
-        {
-            if (devMode->dmCollate == DMCOLLATE_TRUE)
-                data.SetCollate( true );
-            else
-                data.SetCollate( false );
-        }
+    LPDEVMODE devMode = static_cast<LPDEVMODE>(lockDevMode.Get());
 
-        //// Number of copies
-        if (devMode->dmFields & DM_COPIES)
-            data.SetNoCopies( devMode->dmCopies );
-
-        //// Bin
-        if (devMode->dmFields & DM_DEFAULTSOURCE) {
-            switch (devMode->dmDefaultSource) {
-                case DMBIN_ONLYONE        : data.SetBin(wxPRINTBIN_ONLYONE       ); break;
-                case DMBIN_LOWER          : data.SetBin(wxPRINTBIN_LOWER         ); break;
-                case DMBIN_MIDDLE         : data.SetBin(wxPRINTBIN_MIDDLE        ); break;
-                case DMBIN_MANUAL         : data.SetBin(wxPRINTBIN_MANUAL        ); break;
-                case DMBIN_ENVELOPE       : data.SetBin(wxPRINTBIN_ENVELOPE      ); break;
-                case DMBIN_ENVMANUAL      : data.SetBin(wxPRINTBIN_ENVMANUAL     ); break;
-                case DMBIN_AUTO           : data.SetBin(wxPRINTBIN_AUTO          ); break;
-                case DMBIN_TRACTOR        : data.SetBin(wxPRINTBIN_TRACTOR       ); break;
-                case DMBIN_SMALLFMT       : data.SetBin(wxPRINTBIN_SMALLFMT      ); break;
-                case DMBIN_LARGEFMT       : data.SetBin(wxPRINTBIN_LARGEFMT      ); break;
-                case DMBIN_LARGECAPACITY  : data.SetBin(wxPRINTBIN_LARGECAPACITY ); break;
-                case DMBIN_CASSETTE       : data.SetBin(wxPRINTBIN_CASSETTE      ); break;
-                case DMBIN_FORMSOURCE     : data.SetBin(wxPRINTBIN_FORMSOURCE    ); break;
-                default:
-                    if (devMode->dmDefaultSource>=DMBIN_USER) {
-                        data.SetBin((wxPrintBin)((devMode->dmDefaultSource)-DMBIN_USER+(int)wxPRINTBIN_USER));
-                    } else {
-                        data.SetBin(wxPRINTBIN_DEFAULT);
-                    }
-                    break;
-            }
-        } else {
-            data.SetBin(wxPRINTBIN_DEFAULT);
-        }
-        if (devMode->dmFields & DM_MEDIATYPE)
-        {
-            wxASSERT( (int)devMode->dmMediaType != wxPRINTMEDIA_DEFAULT );
-            data.SetMedia(devMode->dmMediaType);
-        }
-        //// Printer name
-        if (devMode->dmDeviceName[0] != 0)
-            // This syntax fixes a crash when using VS 7.1
-            data.SetPrinterName( wxString(devMode->dmDeviceName, CCHDEVICENAME) );
+    //// Orientation
+    if (devMode->dmFields & DM_ORIENTATION)
+        data.SetOrientation( devMode->dmOrientation );
 
-        //// Colour
-        if (devMode->dmFields & DM_COLOR)
-        {
-            if (devMode->dmColor == DMCOLOR_COLOR)
-                data.SetColour( true );
-            else
-                data.SetColour( false );
-        }
+    //// Collation
+    if (devMode->dmFields & DM_COLLATE)
+    {
+        if (devMode->dmCollate == DMCOLLATE_TRUE)
+            data.SetCollate( true );
         else
+            data.SetCollate( false );
+    }
+
+    //// Number of copies
+    if (devMode->dmFields & DM_COPIES)
+        data.SetNoCopies( devMode->dmCopies );
+
+    //// Bin
+    if (devMode->dmFields & DM_DEFAULTSOURCE) {
+        switch (devMode->dmDefaultSource) {
+            case DMBIN_ONLYONE        : data.SetBin(wxPRINTBIN_ONLYONE       ); break;
+            case DMBIN_LOWER          : data.SetBin(wxPRINTBIN_LOWER         ); break;
+            case DMBIN_MIDDLE         : data.SetBin(wxPRINTBIN_MIDDLE        ); break;
+            case DMBIN_MANUAL         : data.SetBin(wxPRINTBIN_MANUAL        ); break;
+            case DMBIN_ENVELOPE       : data.SetBin(wxPRINTBIN_ENVELOPE      ); break;
+            case DMBIN_ENVMANUAL      : data.SetBin(wxPRINTBIN_ENVMANUAL     ); break;
+            case DMBIN_AUTO           : data.SetBin(wxPRINTBIN_AUTO          ); break;
+            case DMBIN_TRACTOR        : data.SetBin(wxPRINTBIN_TRACTOR       ); break;
+            case DMBIN_SMALLFMT       : data.SetBin(wxPRINTBIN_SMALLFMT      ); break;
+            case DMBIN_LARGEFMT       : data.SetBin(wxPRINTBIN_LARGEFMT      ); break;
+            case DMBIN_LARGECAPACITY  : data.SetBin(wxPRINTBIN_LARGECAPACITY ); break;
+            case DMBIN_CASSETTE       : data.SetBin(wxPRINTBIN_CASSETTE      ); break;
+            case DMBIN_FORMSOURCE     : data.SetBin(wxPRINTBIN_FORMSOURCE    ); break;
+            default:
+                if (devMode->dmDefaultSource >= DMBIN_USER)
+                    data.SetBin((wxPrintBin)((devMode->dmDefaultSource)-DMBIN_USER+(int)wxPRINTBIN_USER));
+                else
+                    data.SetBin(wxPRINTBIN_DEFAULT);
+        }
+    } else {
+        data.SetBin(wxPRINTBIN_DEFAULT);
+    }
+    if (devMode->dmFields & DM_MEDIATYPE)
+    {
+        wxASSERT( (int)devMode->dmMediaType != wxPRINTMEDIA_DEFAULT );
+        data.SetMedia(devMode->dmMediaType);
+    }
+    //// Printer name
+    if (devMode->dmDeviceName[0] != 0)
+        // This syntax fixes a crash when using VS 7.1
+        data.SetPrinterName( wxString(devMode->dmDeviceName, CCHDEVICENAME) );
+
+    //// Colour
+    if (devMode->dmFields & DM_COLOR)
+    {
+        if (devMode->dmColor == DMCOLOR_COLOR)
             data.SetColour( true );
+        else
+            data.SetColour( false );
+    }
+    else
+        data.SetColour( true );
 
-        //// Paper size
+    //// Paper size
 
-        // We don't know size of user defined paper and some buggy drivers
-        // 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.
+    // We don't know size of user defined paper and some buggy drivers
+    // 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))
+    bool foundPaperSize = false;
+    if ((devMode->dmFields & DM_PAPERSIZE) && (devMode->dmPaperSize < DMPAPER_USER))
+    {
+        if (wxThePrintPaperDatabase)
         {
-            if (wxThePrintPaperDatabase)
+            wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperTypeByPlatformId(devMode->dmPaperSize);
+            if (paper)
             {
-                wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperTypeByPlatformId(devMode->dmPaperSize);
-                if (paper)
-                {
-                    data.SetPaperId( paper->GetId() );
-                    data.SetPaperSize( wxSize(paper->GetWidth() / 10,paper->GetHeight() / 10) );
-                    m_customWindowsPaperId = 0;
-                    foundPaperSize = true;
-                }
-            }
-            else
-            {
-                // Shouldn't really get here
-                wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative."));
-                data.SetPaperId( wxPAPER_NONE );
-                data.SetPaperSize( wxSize(0,0) );
+                data.SetPaperId( paper->GetId() );
+                data.SetPaperSize( wxSize(paper->GetWidth() / 10,paper->GetHeight() / 10) );
                 m_customWindowsPaperId = 0;
-
-                GlobalUnlock(hDevMode);
-                return false;
+                foundPaperSize = true;
             }
         }
+        else
+        {
+            // Shouldn't really get here
+            wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative."));
+            data.SetPaperId( wxPAPER_NONE );
+            data.SetPaperSize( wxSize(0,0) );
+            m_customWindowsPaperId = 0;
 
-        if (!foundPaperSize) {
-            if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH))
-            {
-                // DEVMODE is in tenths of a millimeter
-                data.SetPaperSize( wxSize(devMode->dmPaperWidth / 10, devMode->dmPaperLength / 10) );
-                data.SetPaperId( wxPAPER_NONE );
-                m_customWindowsPaperId = devMode->dmPaperSize;
-            }
-            else
-            {
-                // 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;
-            }
+            return false;
         }
+    }
 
-        //// Duplex
-
-        if (devMode->dmFields & DM_DUPLEX)
+    if (!foundPaperSize) {
+        if ((devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH))
         {
-            switch (devMode->dmDuplex)
-            {
-                case DMDUP_HORIZONTAL:   data.SetDuplex( wxDUPLEX_HORIZONTAL ); break;
-                case DMDUP_VERTICAL:     data.SetDuplex( wxDUPLEX_VERTICAL ); break;
-                default:
-                case DMDUP_SIMPLEX:      data.SetDuplex( wxDUPLEX_SIMPLEX ); break;
-            }
+            // DEVMODE is in tenths of a millimeter
+            data.SetPaperSize( wxSize(devMode->dmPaperWidth / 10, devMode->dmPaperLength / 10) );
+            data.SetPaperId( wxPAPER_NONE );
+            m_customWindowsPaperId = devMode->dmPaperSize;
         }
         else
-            data.SetDuplex( wxDUPLEX_SIMPLEX );
+        {
+            // 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;
+        }
+    }
 
-        //// Quality
+    //// Duplex
 
-        if (devMode->dmFields & DM_PRINTQUALITY)
+    if (devMode->dmFields & DM_DUPLEX)
+    {
+        switch (devMode->dmDuplex)
         {
-            switch (devMode->dmPrintQuality)
+            case DMDUP_HORIZONTAL:   data.SetDuplex( wxDUPLEX_HORIZONTAL ); break;
+            case DMDUP_VERTICAL:     data.SetDuplex( wxDUPLEX_VERTICAL ); break;
+            default:
+            case DMDUP_SIMPLEX:      data.SetDuplex( wxDUPLEX_SIMPLEX ); break;
+        }
+    }
+    else
+        data.SetDuplex( wxDUPLEX_SIMPLEX );
+
+    //// Quality
+
+    if (devMode->dmFields & DM_PRINTQUALITY)
+    {
+        switch (devMode->dmPrintQuality)
+        {
+            case DMRES_MEDIUM:  data.SetQuality( wxPRINT_QUALITY_MEDIUM ); break;
+            case DMRES_LOW:     data.SetQuality( wxPRINT_QUALITY_LOW ); break;
+            case DMRES_DRAFT:   data.SetQuality( wxPRINT_QUALITY_DRAFT ); break;
+            case DMRES_HIGH:    data.SetQuality( wxPRINT_QUALITY_HIGH ); break;
+            default:
             {
-                case DMRES_MEDIUM:  data.SetQuality( wxPRINT_QUALITY_MEDIUM ); break;
-                case DMRES_LOW:     data.SetQuality( wxPRINT_QUALITY_LOW ); break;
-                case DMRES_DRAFT:   data.SetQuality( wxPRINT_QUALITY_DRAFT ); break;
-                case DMRES_HIGH:    data.SetQuality( wxPRINT_QUALITY_HIGH ); break;
-                default:
-                {
-                    // TODO: if the printer fills in the resolution in DPI, how
-                    // will the application know if it's high, low, draft etc.??
-                    //                    wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values.");
-                    data.SetQuality( devMode->dmPrintQuality );
-                    break;
+                // TODO: if the printer fills in the resolution in DPI, how
+                // will the application know if it's high, low, draft etc.??
+                //                    wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values.");
+                data.SetQuality( devMode->dmPrintQuality );
+                break;
 
-                }
             }
         }
-        else
-            data.SetQuality( wxPRINT_QUALITY_HIGH );
-
-        if (devMode->dmDriverExtra > 0)
-            data.SetPrivData( (char *)devMode+devMode->dmSize, devMode->dmDriverExtra );
-        else
-            data.SetPrivData( NULL, 0 );
-
-        GlobalUnlock(hDevMode);
     }
+    else
+        data.SetQuality( wxPRINT_QUALITY_HIGH );
 
-    if (hDevNames)
+    if (devMode->dmDriverExtra > 0)
+        data.SetPrivData( (char *)devMode+devMode->dmSize, devMode->dmDriverExtra );
+    else
+        data.SetPrivData( NULL, 0 );
+
+    if ( m_devNames )
     {
-        LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(hDevNames);
-        if (lpDevNames)
-        {
-            // TODO: Unicode-ification
+        GlobalPtrLock lockDevNames(m_devNames);
+        LPDEVNAMES lpDevNames = static_cast<LPDEVNAMES>(lockDevNames.Get());
 
-            // Get the port name
-            // port is obsolete in WIN32
-            // m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset);
+        // TODO: Unicode-ification
 
-            // Get the printer name
-            wxString printerName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;
+        // Get the port name
+        // port is obsolete in WIN32
+        // m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset);
 
-            // Not sure if we should check for this mismatch
-//            wxASSERT_MSG( (m_printerName.empty() || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!");
+        // Get the printer name
+        wxString printerName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;
 
-            if (!printerName.empty())
-                data.SetPrinterName( printerName );
+        // Not sure if we should check for this mismatch
+//            wxASSERT_MSG( (m_printerName.empty() || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!");
 
-            GlobalUnlock(hDevNames);
-        }
+        if (!printerName.empty())
+            data.SetPrinterName( printerName );
     }
 
     return true;
@@ -349,30 +335,22 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data )
 
 bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
 {
-    HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
-    HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;
-    if (!hDevMode)
+    HGLOBAL hDevMode = static_cast<HGLOBAL>(m_devMode);
+    if ( !m_devMode )
     {
         // Use PRINTDLG as a way of creating a DEVMODE object
         PRINTDLG pd;
 
-        // GNU-WIN32 has the wrong size PRINTDLG - can't work out why.
-#ifdef __GNUWIN32__
-        memset(&pd, 0, 66);
-        pd.lStructSize    = 66;
-#else
         memset(&pd, 0, sizeof(PRINTDLG));
 #ifdef __WXWINCE__
         pd.cbStruct    = sizeof(PRINTDLG);
 #else
         pd.lStructSize    = sizeof(PRINTDLG);
-#endif
 #endif
 
-        pd.hwndOwner      = (HWND)NULL;
+        pd.hwndOwner      = NULL;
         pd.hDevMode       = NULL; // Will be created by PrintDlg
         pd.hDevNames      = NULL; // Ditto
-        //pd.hInstance      = (HINSTANCE) wxGetInstance();
 
         pd.Flags          = PD_RETURNDEFAULT;
         pd.nCopies        = 1;
@@ -388,16 +366,16 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
             pd.hDevMode = NULL;
             pd.hDevNames = NULL;
 
-#if defined(__WXDEBUG__) && defined(__WIN32__)
+#ifdef __WXDEBUG__
             wxString str(wxT("Printing error: "));
             str += wxGetPrintDlgError();
             wxLogDebug(str);
-#endif
+#endif // __WXDEBUG__
         }
         else
         {
             hDevMode = pd.hDevMode;
-            m_devMode = (void*)(long) hDevMode;
+            m_devMode = hDevMode;
             pd.hDevMode = NULL;
 
             // We'll create a new DEVNAMEs structure below.
@@ -414,7 +392,8 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
 
     if ( hDevMode )
     {
-        LPDEVMODE devMode = (LPDEVMODE) GlobalLock(hDevMode);
+        GlobalPtrLock lockDevMode(hDevMode);
+        DEVMODE * const devMode = static_cast<DEVMODE *>(lockDevMode.Get());
 
         //// Orientation
         devMode->dmOrientation = (short)data.GetOrientation();
@@ -431,9 +410,11 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
         wxString name = data.GetPrinterName();
         if (!name.empty())
         {
-            //int len = wxMin(31, m_printerName.Len());
-            wxStrncpy((wxChar*)devMode->dmDeviceName,name.c_str(),31);
-            devMode->dmDeviceName[31] = wxT('\0');
+            // NB: the cast is needed in the ANSI build, strangely enough
+            //     dmDeviceName is BYTE[] and not char[] there
+            wxStrlcpy(reinterpret_cast<wxChar *>(devMode->dmDeviceName),
+                      name.wx_str(),
+                      WXSIZEOF(devMode->dmDeviceName));
         }
 
         //// Colour
@@ -558,16 +539,15 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )
             devMode->dmMediaType = data.GetMedia();
             devMode->dmFields |= DM_MEDIATYPE;
         }
-        GlobalUnlock(hDevMode);
     }
 
-    if ( hDevNames )
+    if ( m_devNames )
     {
-        GlobalFree(hDevNames);
+        ::GlobalFree(static_cast<HGLOBAL>(m_devNames));
     }
 
     // TODO: I hope it's OK to pass some empty strings to DEVNAMES.
-    m_devNames = (void*) (long) wxCreateDevNames(wxEmptyString, data.GetPrinterName(), wxEmptyString);
+    m_devNames = wxCreateDevNames(wxEmptyString, data.GetPrinterName(), wxEmptyString);
 
     return true;
 }
@@ -638,7 +618,7 @@ int wxWindowsPrintDialog::ShowModal()
 
     if ( ret && (pd->hDC) )
     {
-        wxPrinterDC *pdc = new wxPrinterDC( (WXHDC) pd->hDC );
+        wxPrinterDC *pdc = new wxPrinterDCFromHDC( (WXHDC) pd->hDC );
         m_printerDC = pdc;
         ConvertFromNative( m_printDialogData );
         return wxID_OK;
@@ -657,7 +637,7 @@ wxDC *wxWindowsPrintDialog::GetPrintDC()
         return m_printerDC;
     }
     else
-        return (wxPrinterDC*) NULL;
+        return NULL;
 }
 
 bool wxWindowsPrintDialog::ConvertToNative( wxPrintDialogData &data )
@@ -676,13 +656,8 @@ bool wxWindowsPrintDialog::ConvertToNative( wxPrintDialogData &data )
     memset( pd, 0, sizeof(PRINTDLG) );
     m_printDlg = (void*) pd;
 
-    // GNU-WIN32 has the wrong size PRINTDLG - can't work out why.
-#ifdef __GNUWIN32__
-    pd->lStructSize    = 66;
-#else
     pd->lStructSize    = sizeof(PRINTDLG);
-#endif
-    pd->hwndOwner      = (HWND)NULL;
+    pd->hwndOwner      = NULL;
     pd->hDevMode       = NULL; // Will be created by PrintDlg
     pd->hDevNames      = NULL; // Ditto
 
@@ -699,17 +674,17 @@ bool wxWindowsPrintDialog::ConvertToNative( wxPrintDialogData &data )
     if (pd->hDevNames)
         GlobalFree(pd->hDevNames);
 
-    pd->hDevMode = (HGLOBAL)(DWORD) native_data->GetDevMode();
-    native_data->SetDevMode( (void*) NULL);
+    pd->hDevMode = static_cast<HGLOBAL>(native_data->GetDevMode());
+    native_data->SetDevMode(NULL);
 
     // Shouldn't assert; we should be able to test Ok-ness at a higher level
     //wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
 
-    pd->hDevNames = (HGLOBAL)(DWORD) native_data->GetDevNames();
-    native_data->SetDevNames( (void*) NULL);
+    pd->hDevNames = static_cast<HGLOBAL>(native_data->GetDevNames());
+    native_data->SetDevNames(NULL);
 
 
-    pd->hDC = (HDC) NULL;
+    pd->hDC = NULL;
     pd->nFromPage = (WORD)data.GetFromPage();
     pd->nToPage = (WORD)data.GetToPage();
     pd->nMinPage = (WORD)data.GetMinPage();
@@ -717,23 +692,17 @@ bool wxWindowsPrintDialog::ConvertToNative( wxPrintDialogData &data )
     pd->nCopies = (WORD)data.GetNoCopies();
 
     pd->Flags = PD_RETURNDC;
-
-#ifdef __GNUWIN32__
-    pd->lStructSize = 66;
-#else
     pd->lStructSize = sizeof( PRINTDLG );
-#endif
 
-    pd->hwndOwner=(HWND)NULL;
-//    pd->hDevNames=(HANDLE)NULL;
-    pd->hInstance=(HINSTANCE)NULL;
-    pd->lCustData = (LPARAM) NULL;
+    pd->hwndOwner = NULL;
+    pd->hInstance = NULL;
+    pd->lCustData = 0;
     pd->lpfnPrintHook = NULL;
     pd->lpfnSetupHook = NULL;
     pd->lpPrintTemplateName = NULL;
     pd->lpSetupTemplateName = NULL;
-    pd->hPrintTemplate = (HGLOBAL) NULL;
-    pd->hSetupTemplate = (HGLOBAL) NULL;
+    pd->hPrintTemplate = NULL;
+    pd->hSetupTemplate = NULL;
 
     if ( data.GetAllPages() )
         pd->Flags |= PD_ALLPAGES;
@@ -753,10 +722,6 @@ bool wxWindowsPrintDialog::ConvertToNative( wxPrintDialogData &data )
         pd->Flags |= PD_PAGENUMS;
     if ( data.GetEnableHelp() )
         pd->Flags |= PD_SHOWHELP;
-#if WXWIN_COMPATIBILITY_2_4
-    if ( data.GetSetupDialog() )
-        pd->Flags |= PD_PRINTSETUP;
-#endif
 
     return true;
 }
@@ -775,10 +740,9 @@ bool wxWindowsPrintDialog::ConvertFromNative( wxPrintDialogData &data )
     {
         if (native_data->GetDevMode())
         {
-            // Make sure we don't leak memory
-            GlobalFree( (HGLOBAL)(DWORD) native_data->GetDevMode() );
+            ::GlobalFree(static_cast<HGLOBAL>(native_data->GetDevMode()));
         }
-        native_data->SetDevMode( (void*)(long) pd->hDevMode );
+        native_data->SetDevMode(pd->hDevMode);
         pd->hDevMode = NULL;
     }
 
@@ -787,10 +751,9 @@ bool wxWindowsPrintDialog::ConvertFromNative( wxPrintDialogData &data )
     {
         if (native_data->GetDevNames())
         {
-            // Make sure we don't leak memory
-            GlobalFree((HGLOBAL)(DWORD) native_data->GetDevNames());
+            ::GlobalFree(static_cast<HGLOBAL>(native_data->GetDevNames()));
         }
-        native_data->SetDevNames((void*)(long) pd->hDevNames);
+        native_data->SetDevNames(pd->hDevNames);
         pd->hDevNames = NULL;
     }
 
@@ -812,9 +775,7 @@ bool wxWindowsPrintDialog::ConvertFromNative( wxPrintDialogData &data )
     data.EnableSelection( ((pd->Flags & PD_NOSELECTION) != PD_NOSELECTION) );
     data.EnablePageNumbers( ((pd->Flags & PD_NOPAGENUMS) != PD_NOPAGENUMS) );
     data.EnableHelp( ((pd->Flags & PD_SHOWHELP) == PD_SHOWHELP) );
-#if WXWIN_COMPATIBILITY_2_4
-    data.SetSetupDialog( ((pd->Flags & PD_PRINTSETUP) == PD_PRINTSETUP) );
-#endif
+
     return true;
 }
 
@@ -906,7 +867,7 @@ bool wxWindowsPageSetupDialog::ConvertToNative( wxPageSetupDialogData &data )
         pd->hDevMode = NULL;
     }
     pd->hDevMode = (HGLOBAL) native_data->GetDevMode();
-    native_data->SetDevMode( (void*) NULL );
+    native_data->SetDevMode(NULL);
 
     // Shouldn't assert; we should be able to test Ok-ness at a higher level
     //wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!"));
@@ -921,7 +882,7 @@ bool wxWindowsPageSetupDialog::ConvertToNative( wxPageSetupDialogData &data )
         pd->hDevNames = NULL;
     }
     pd->hDevNames = (HGLOBAL) native_data->GetDevNames();
-    native_data->SetDevNames((void*) NULL);
+    native_data->SetDevNames(NULL);
 
 //        pd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, sizeof(DEVMODE));
 
@@ -946,9 +907,8 @@ bool wxWindowsPageSetupDialog::ConvertToNative( wxPageSetupDialogData &data )
     pd->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
 
     pd->lStructSize = sizeof( PAGESETUPDLG );
-    pd->hwndOwner=(HWND)NULL;
-//    pd->hDevNames=(HWND)NULL;
-    pd->hInstance=(HINSTANCE)NULL;
+    pd->hwndOwner = NULL;
+    pd->hInstance = NULL;
     //   PAGESETUPDLG is in hundreds of a mm
     pd->ptPaperSize.x = data.GetPaperSize().x * 100;
     pd->ptPaperSize.y = data.GetPaperSize().y * 100;
@@ -1032,7 +992,10 @@ bool wxWindowsPageSetupDialog::ConvertFromNative( wxPageSetupDialogData &data )
     data.EnableHelp( ((pd->Flags & PSD_SHOWHELP) == PSD_SHOWHELP) );
 
     //   PAGESETUPDLG is in hundreds of a mm
-    data.SetPaperSize( wxSize(pd->ptPaperSize.x / 100, pd->ptPaperSize.y / 100) );
+    if (data.GetPrintData().GetOrientation() == wxLANDSCAPE)
+        data.SetPaperSize( wxSize(pd->ptPaperSize.y / 100, pd->ptPaperSize.x / 100) );
+    else
+        data.SetPaperSize( wxSize(pd->ptPaperSize.x / 100, pd->ptPaperSize.y / 100) );
 
     data.SetMinMarginTopLeft( wxPoint(pd->rtMinMargin.left / 100, pd->rtMinMargin.top / 100) );
     data.SetMinMarginBottomRight( wxPoint(pd->rtMinMargin.right / 100, pd->rtMinMargin.bottom / 100) );