Microsoft KB Archive/166130

= How To Overriding Initial Setting on Print Setup Dialog =

Article ID: 166130

Article Last Modified on 11/21/2006

-

APPLIES TO


 * Microsoft Foundation Class Library 4.2
 * Microsoft Visual C++ 1.52 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 2.2
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * Microsoft Visual C++ 4.2 Enterprise Edition
 * Microsoft Visual C++ 4.2 Enterprise Edition
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 4.2 Professional Edition
 * Microsoft Visual C++ 4.2 Professional Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q166130



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: kbhowto kbprint kbcmndlgprint kbcode KB166130

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.