HOWTO: Overriding Initial Setting on Print Setup Dialog

Last reviewed: July 2, 1997
Article ID: Q166130
The information in this article applies to:
  • The Microsoft Foundation Classes (MFC)
  • Microsoft Visual C++, 32-bit Editions, versions 2.0, 2.1, 2.2, 4.0, 4.1, 4.2, 4.2b, 5.0
  • Microsoft Visual C++ for Windows, 16-bit edition, version 1.52

SUMMARY

Changing the initial value of the settings on the Print Setup Dialog is a non-trivial operation that requires you to override several non-virtual functions. This article demonstrates how to override by using the Page Orientation setting as an example.

MORE INFORMATION

The DEVMODE data structure contains information about the device initialization and environment of a printer. Changing the Print Setup Dialog settings involves modifying this structure. The hDevMode structure that you need to modify is a CWinApp member variable. The function that initializes this variable is CWinApp::UpdatePrinterSelection. To set the initial page orientation to DMORIENT_LANDSCAPE, you'll need to override this function, clone the base class code and make a modification similar to the following:

   extern void AFXAPI AfxGlobalFree(HGLOBAL hGlobal); // 4.1 or later

   void CMyApp::UpdatePrinterSelection(BOOL bForceDefaults)
   {
      if (!bForceDefaults && m_hDevNames != NULL)
      {
         CWinApp::UpdatePrinterSelection(bForceDefaults);
      }
      else
      {
         // First time or Forced -- Get defaults
         CPrintDialog pd(TRUE);
         pd.GetDefaults();

         if (m_hDevMode != NULL)
            ::GlobalFree(m_hDevMode);
            // AfxGlobalFree for 4.1 or later
         if (m_hDevNames != NULL)
            ::GlobalFree(m_hDevNames);
            // AfxGlobalFree for 4.1 or later

         m_hDevMode = pd.m_pd.hDevMode;
         m_hDevNames = pd.m_pd.hDevNames;

         // new code to set DMORIENT_LANDSCAPE
         LPDEVMODE lp = (LPDEVMODE) ::GlobalLock(m_hDevMode);
         ASSERT(lp);
         lp->dmOrientation = DMORIENT_LANDSCAPE;
         ::GlobalUnlock(m_hDevMode);
      }
   }

Unfortunately, this is not a virtual function, so you'll need to override all the functions in its call tree in the three cases below:

   (CMyApp::UpdatePrinterSelection)
   CWinApp::GetPrinterDeviceDefaults
     Non-virtual, copy from MFC src
   CView::DoPreparePrinting (non-virtual)
     Non-virtual, copy from MFC src, change CWinApp* to CMyApp* in code,
     include "docobj.h"
   CView::OnPreparePrinting
     Virtual, must override anyway
   CView::OnFilePrint
     Use ClassWizard

   (CMyApp::UpdatePrinterSelection)
   CWinApp::DoPrintDialog
     Non-virtual, copy from MFC src, include "cderr.h"
   CView::DoPreparePrinting
     Non-virtual, see above

   (CMyApp::UpdatePrinterSelection)
   CWinApp::DoPrintDialog
     Non-virtual, see above
   CWinApp::OnFilePrintSetup
     Use ClassWizard

For the non-virtual functions, just clone the base class code.

This example works for dmOrientation, dmPaperSize and other DEVMODE values that can be set by your program.


Keywords : kbcode kbprg kbprint MfcMISC MfcPrinting
Technology : kbMfc
Version : 1.52 2.0 2.1 2.2 4.0 4.1 4.2 5.0
Platform : NT WINDOWS
Issue type : kbhowto


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 2, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.