Help determine the numbers of pages with CPrintInfo - Programmer

This is a discussion on Help determine the numbers of pages with CPrintInfo - Programmer ; Hello. I've read the CPrintInfo API in my Visual C++ help file and I'm still having this problem in determining the number of pages before printing a document using CPrintInfo. I override OnPrepareDC(), OnPreparePrinting() and OnBeginPrinting() but the relevant CPrintInfo ...

+ Reply to Thread
Results 1 to 2 of 2

Thread: Help determine the numbers of pages with CPrintInfo

  1. Help determine the numbers of pages with CPrintInfo

    Hello.

    I've read the CPrintInfo API in my Visual C++ help file and I'm still
    having this problem in determining the number of pages before printing a
    document using CPrintInfo.

    I override OnPrepareDC(), OnPreparePrinting() and OnBeginPrinting() but
    the relevant CPrintInfo doesn't give information on the paper's size.
    All four corners of the m_rectDraw member are set to -802150451. Only
    after I overide OnPrint can I actually have a valid rectangle in this
    function only (0,3075,0,2400). But, at this point, it's too late to
    call SetMaxPage() and the print preview interface goes all quircky.

    My hack is currently to try to (over)evaluate the number of pages and
    set SetMaxPage() at OnPreparePrinting(), then I limit my printing to the
    relevant pages (or else I print a bunch of blank pages) The output is
    great but this is not a good solution for the long run.

    What am I doing wrong ?

    Any help appreciated.

    a.

  2. Re: Help determine the numbers of pages with CPrintInfo

    In your OnPreparePrinting(), you need to get a Device Context for your
    printer:


    CPrintInfo pi;

    if (AfxGetApp()->GetPrinterDeviceDefaults(&pi.m_pPD->m_pd)) {

    HDC hDC = pi.m_pPD->m_pd.hDC;

    if (hDC == NULL)

    hDC = pi.m_pPD->CreatePrinterDC();

    if (hDC != NULL) {

    CDC dc;

    dc.Attach (hDC);

    int nMaxPages = CalcNbrPages(&dc);

    pInfo->SetMaxPage(nMaxPages);

    :eleteDC(dc.Detach());

    }

    }

    ---------

    You can then get your page size using GetDevice caps:

    // allow logical inch for each top and bottom margins

    int nVertMargin = (pDC->GetDeviceCaps(LOGPIXELSY) * 3) / 4;

    int nPgHt = pDC->GetDeviceCaps(VERTRES) - (2 * nVertMargin);

    int nHorzMargin = (pDC->GetDeviceCaps(LOGPIXELSX) * 3) / 4;

    int nPgWidth = pDC->GetDeviceCaps(HORZRES) - (2 * nHorzMargin);


    --
    ---------------------------------------------------------------------
    DataGet® & PocketLog® www.dataget.com
    Data Collectors www.baxcode.com
    --------------------------------------------------------------------



    "anastasiA" wrote in message
    news:gtSdncCXvfeZr77YnZ2dnUVZ_tGdnZ2d@magma.ca...
    > Hello.
    >
    > I've read the CPrintInfo API in my Visual C++ help file and I'm still
    > having this problem in determining the number of pages before printing a
    > document using CPrintInfo.
    >
    > I override OnPrepareDC(), OnPreparePrinting() and OnBeginPrinting() but
    > the relevant CPrintInfo doesn't give information on the paper's size.
    > All four corners of the m_rectDraw member are set to -802150451. Only
    > after I overide OnPrint can I actually have a valid rectangle in this
    > function only (0,3075,0,2400). But, at this point, it's too late to
    > call SetMaxPage() and the print preview interface goes all quircky.
    >
    > My hack is currently to try to (over)evaluate the number of pages and
    > set SetMaxPage() at OnPreparePrinting(), then I limit my printing to the
    > relevant pages (or else I print a bunch of blank pages) The output is
    > great but this is not a good solution for the long run.
    >
    > What am I doing wrong ?
    >
    > Any help appreciated.
    >
    > a.




+ Reply to Thread