Setting printer orientation to landscape

Posted on 1997-05-23
Last Modified: 2013-11-19
I have an dialog-based application that creates a plot in a CFrameWnd object and a landscape orientation.  Most printers, however, are setup for portrait output by default.  My application can bring up the print dialog box, but unless the user manually changes the orientation to landscape, the plot doesn't display properly.  IF THE USER SELECTES LANDSCAPE THE PRINTOUT IS CORRECT.  I would like to set the orientation in the printer Properties dialog box to landscape automatically.

The CPrintDialog allows for various PD_xxx flags, but orientation is not one of them.  Orientation is buried in the DEVMODE structure which I cannot seem to "get to" until AFTER the dialog box returns.  I can then query dmOrientation, but setting it to 2 (landscape) has no effect on the printout.

Here is the portion of code that prints the plot:
void CXPlot::OnPlotFilePrint()  // CXPlot derived from CFrameWnd
// create a device context and a print dialog box, attach the two,
//  and pass the device context to the draw routine to "redraw" the plot
    CDC dc;                         // get a device context
    CPrintDialog dlg(FALSE);        // create a print dialog box
    if (dlg.DoModal() == IDOK)      // display the print dialog box
        dc.Attach(dlg.GetPrinterDC());  // attach the printer dc
        DOCINFO di;
        ::ZeroMemory(&di, sizeof(DOCINFO));
        di.cbSize = sizeof(DOCINFO);
        di.lpszDocName = "My Plot";
        this->DrawSetupPrint(&dc);      // setup scaling
        this->Draw(&dc);                // draw the plot on the printer

I have tried calling the following code from various points in the above:
void CMyApp::SetPrinterOrientation(UINT orientation)
    PRINTDLG dlg;           // get a PRINTDLG structure
    DEVMODE FAR *pDevMode;  // pointer to a DEVMODE structure
    dlg.lStructSize = (DWORD)sizeof(PRINTDLG);
    if (this->GetPrinterDeviceDefaults(&dlg))       // a CWinApp function
        if ((pDevMode = (DEVMODE FAR *)::GlobalLock(m_hDevMode)) != NULL)
            pDevMode->dmOrientation = orientation;

The displayed orientation is always Portrait.  There must be a way I can automatically set the orientation to Landscape, isn't there?


Bill Stevener
Question by:stevener
  • 2
  • 2
LVL 10

Accepted Solution

RONSLOW earned 150 total points
ID: 1301748
Yes - my Program forces Landscape orientation with the following code...

void CMyWinApp::SetLandscape() {
      // Get default printer settings.
      CPrintDialog dlg(FALSE);
      if (GetPrinterDeviceDefaults(&dlg.m_pd)) {
            // Lock memory handle.
            LPDEVMODE pDevMode = (LPDEVMODE)::GlobalLock(m_hDevMode);
            // Change printer settings in here.
            if (pDevMode) pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
            // Unlock memory handle.

eMail me for formatted code at

LVL 10

Expert Comment

ID: 1301749
BTW: do this at the start of (or before calling) your OnPlotFilePrint.  I call my routine in my InitInstance()


Author Comment

ID: 1301750

Thanks for your response.

The routine you suggested, CMyWinApp::SetLandscape() is nearly identical to the routine I posted in my original question, CMyApp::SetPrinterOrientation(UINT orientation).  Unfortunately, neither work as desired.

As I step through each statement with the debugger, I can verify that I am getting a valid DEVMODE structure, and that dmorientation is being set to DMORIENT_LANDSCAPE (2), and that it retains the value for the life of the application (when I invoke OnPlotFilePrint several times in the same run of the application, dmorientation is 1 the 1st time, 2 each succeeding time).  When the print dialog box appears and I select the "Properties" button, the orientation is always displayed as "Portrait", regardless of the value for dmorientation in the DEVMODE structure.  If I bypass the "Properties" button and select OK, the printout is in portrait mode.  If I select Landscape from the Properties page, the printout is landscape.

Is there anything else I need to do after setting the orientation to Landscape?  SetPrinterDeviceDefaults()?

BTW, I have tried this when the plot window is created, even before anything is drawn into it, and at the beginning of my OnPlotFilePrint routine.

Bill Stevener

Author Comment

ID: 1301751
Although he didn't solve the problem, he was quick and on the right track.  Someone from one of the newsgroups DID solve the problem by pointing out that in my OnPlotFilePrint code, I needed to add:
between setting the orientation and the call to DoModal().  Adding this line solved the problem.

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Creating Labels and Frequency list style reports in SAS code 9 98
List out all word 7 292
sum28 challenge 31 112
post4 challenge 28 100
Introduction: Dialogs (1) modal - maintaining the database. Continuing from the ninth article about sudoku.   You might have heard of modal and modeless dialogs.  Here with this Sudoku application will we use one of each type: a modal dialog …
Introduction: Dialogs (2) modeless dialog and a worker thread.  Handling data shared between threads.  Recursive functions. Continuing from the tenth article about sudoku.   Last article we worked with a modal dialog to help maintain informat…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In a recent question ( here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question