Solved

Setting printer orientation to landscape

Posted on 1997-05-23
4
1,175 Views
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";
        dc.StartDoc(&di);
        dc.StartPage();
        this->DrawSetupPrint(&dc);      // setup scaling
        this->Draw(&dc);                // draw the plot on the printer
        dc.EndPage();
        dc.EndDoc();
    }
}

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;
            ::GlobalUnlock(m_hDevMode);
        }
    }
}

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

Thanks

Bill Stevener
0
Comment
Question by:stevener
  • 2
  • 2
4 Comments
 
LVL 10

Accepted Solution

by:
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.
            ::GlobalUnlock(m_hDevMode);
      }
}

eMail me for formatted code at Roger_Onslow@compsys.com.au

0
 
LVL 10

Expert Comment

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

0
 

Author Comment

by:stevener
ID: 1301750
Roger,

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
0
 

Author Comment

by:stevener
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:
    AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd)
between setting the orientation and the call to DoModal().  Adding this line solved the problem.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
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.
I designed this idea while studying technology in the classroom.  This is a semester long project.  Students are asked to take photographs on a specific topic which they find meaningful, it can be a place or situation such as travel or homelessness.…

932 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

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now