Solved

Paper size in Printing

Posted on 1998-05-07
8
800 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
ID: 1308142
Edited text of question
0
 

Author Comment

by:ivano
ID: 1308143
Adjusted points to 200
0
 
LVL 10

Expert Comment

by:RONSLOW
ID: 1308144
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
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 

Author Comment

by:ivano
ID: 1308145
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
 
LVL 10

Expert Comment

by:RONSLOW
ID: 1308146
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
ID: 1308147
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
ID: 1308148
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
ID: 1308149
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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
function returning CString in a regular win32 DLL 8 177
Complete beginner needs help making a cron job 9 116
sumHeights2  challenge 7 103
mapAB Challlenge 35 143
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…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
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.
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

776 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