Solved

Paper size in Printing

Posted on 1998-05-07
8
812 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
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

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

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
mixString challenge 36 131
Installing Microsoft R server on REDHAT or SUSE Linux 4 147
How to convert MFC::CString to UTF8 wchar_t* 10 287
Detect file exist or not 3 180
Introduction: Hints for the grid button.  Nested classes, templated collections.  Squash that darned bug! Continuing from the sixth article about sudoku.   Open the project in visual studio. First we will finish with the SUD_SETVALUE messa…
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…

830 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