Solved

Paper size in Printing

Posted on 1998-05-07
8
776 Views
Last Modified: 2013-11-20
How to print in WINNT to folder paper, which size isn't
offer in Printing setup dialog. Is any way how  to add a chois custom size of  paper to Printing Setup dialog?

I tried change paper size after calling Print dialog by
following code:

LPDEVMODE devMode = pInfo->m_pPD->GetDevMode();
devMode->dmFields|=DM_PAPERLENGTH|DM_PAPERWIDTH|DM_PAPERSIZE;
devMode->dmPaperSize=0;
devMode->dmPaperLength=myLength();
devMode->dmPaperWidth=myWidth();
CPrintDialog * pPD = pInfo->m_pPD;
CDC *dc= new CDC();
dc->Attach(pPD->m_pd.hDC);
dc->ResetDC(devMode);
long height = dc->GetDeviceCaps(VERTSIZE)  ;

The result is that height is apropriate to A4 paper size, not
to my size.

                       Thank You    Ivan



0
Comment
Question by:ivano
  • 5
  • 3
8 Comments
 

Author Comment

by:ivano
Comment Utility
Edited text of question
0
 

Author Comment

by:ivano
Comment Utility
Adjusted points to 200
0
 
LVL 10

Expert Comment

by:RONSLOW
Comment Utility
I'd try this in your winapp.  Call this before you do any printing (eg. in your InitInstance) to set the size you want.  I use this technique for changing the paper orientation to landscape.

void CMyWinApp::SetSize(int width, int length) {
  // 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->dmFields |= DM_PAPERLENGTH|DM_PAPERWIDTH|DM_PAPERSIZE;
      pDevMode->dmPaperSize=0;
      pDevMode->dmPaperLength=length;
      pDevMode->dmPaperWidth=width;
    }
    // Unlock memory handle.
    ::GlobalUnlock(m_hDevMode);
  }
}

0
 

Author Comment

by:ivano
Comment Utility
The problem isn't where to set the paper size. When I experiment with code written in my question, I was succesful only when I used some paper size, which is offered in print dialog.

For examle code  
devMode->dmFields|=DM_PAPERSIZE;
devMode->dmPaperSize=DM_PAPERQUATRO;
work OK.

So I thing, that place the code in InitInstance isn't solution.
I doubt whether printer driver allowed other paper size, then is offered in print dialog.
0
Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

 
LVL 10

Expert Comment

by:RONSLOW
Comment Utility
The dmPaperSize member of the DEVMODE structure is documented incorrectly. The documentation states that the dmPaperSize member may be set to zero if the length and width of the paper are specified by the dmPaperLength and dmPaperWidth members, respectively. However, the correct value to use for user-defined paper sizes is DMPAPER_USER.

0
 

Author Comment

by:ivano
Comment Utility
Even if I used DMPAPER_USER, I can't change the paper size.
I tried to do it in OnPreparePrinting. I found  following:

When I used next  code, value of variable heigh isn't appropriate to my  requested paper size, but value is appropriate to A4 . But what is interesting, when I replace the  row
           devMode->dmPaperSize=DMPAPER_USER
by for example
           devMode->dmPaperSize=DMPAPER_QUARTO;
the value heigh is appropriate to choosen paper size, printing is done OK, including pagination.
Whenever I set dmPaperSize to any predefined paper size  result is success.
           Is it  possible that in WINNT is possible to print only on paper size, which are predefined? I can't explain this behavior to myself.
                  Thank's for any advice

BOOL CTReportView::OnPreparePrinting(CPrintInfo* pInfo)
{
      pInfo->m_pPD->m_pd.Flags |= D_HIDEPRINTTOFILE | PD_NOPAGENUMS;
      CPrintDialog * pPD = pInfo->m_pPD;
      BOOL ret = DoPreparePrinting(pInfo);
      LPDEVMODE devMode = pInfo->m_pPD->GetDevMode();
devMode->dmFields|=DM_PAPERLENGTH|DM_PAPERWIDTH|DM_PAPERSIZE;
      devMode->dmPaperSize=DMPAPER_USER;
      devMode->dmPaperLength=1016;
      devMode->dmPaperWidth=2100;

      // DC apropiate to setting made in print dialog
      ::DeleteDC(pPD->m_pd.hDC); // deleting  DC apropiate to setting made in print dialog

      // Creating DC appropriate to my requirement
                 pPD->m_pd.hDC=pPD->CreatePrinterDC();
      dc->Attach(pPD->m_pd.hDC);
      heigh = dc->GetDeviceCaps(VERTSIZE) ;
                return TRUE;
}//CTReportView::OnPreparePrinting
0
 
LVL 10

Accepted Solution

by:
RONSLOW earned 300 total points
Comment Utility
Have you tried setting the paper size in the way I suggested earlier, but with the DMPAPER_USER instead of 0.  ie:

void CMyWinApp::SetSize(int width, int length) {
  // 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->dmFields |= DM_PAPERLENGTH|DM_PAPERWIDTH|DM_PAPERSIZE;
      pDevMode->dmPaperSize=DMPAPER_USER;
      pDevMode->dmPaperLength=length;
      pDevMode->dmPaperWidth=width;
    }
    // Unlock memory handle.
    ::GlobalUnlock(m_hDevMode);
  }
}

And then calling this from your InitInstance (say) to set up the required length.  Does this work?

If it does, then the problem may be in how and when your are making your change.  If it does not work, then it may be some limitation of your printer driver.

0
 

Author Comment

by:ivano
Comment Utility
I find out, that code you suggest to me is running in  WIN95 but not int WINNT. So that means, that driver in WINNT doesn't support users paper size.

        Thank you for your advices.


0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
cat dog challenge 18 122
Separate files macro - Errors on larger data set 18 56
Process filename extension 3 154
Thin secure Windows 10 5 46
Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
If you use Adobe Reader X it is possible you can't open OLE PDF documents in the standard. The reason is the 'save box mode' in adobe reader X. Many people think the protected Mode of adobe reader x is only to stop the write access. But this fe…
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.
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

763 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

10 Experts available now in Live!

Get 1:1 Help Now