Printing - more trouble

I generate a memory DC and Bitblt() to a printer DC.  I check to make sure the printer supports Bitblt().  When running with win2000 I have no problems, but with WinNT/98 the Bitblt() fails, but GetLastError() returns 0.
I have found that forcing one of my calculated numbers down a bit, it works.  I would like to find the flaw in my code though, so here it is:

iWidth = GetDeviceCaps(hPrintDC,PHYSICALWIDTH);
iOffsetX = GetDeviceCaps(hPrintDC,PHYSICALOFFSETX);
GetClientRect(hDisplay,&rect); // display
iPrintRatio = (iWidth -(2 * iOffsetX)) / (rect.right - rect.left);
/**
 *  ratio is 5 to 7 depending on pc/printer combination.  Works ok on 2000
 *  but need to use ratio -1 for NT/98
 */
SetMapMode(hPrintDC, MM_ANISOTROPIC);
SetWindowOrgEx(hPrintDC, 0, 0,NULL);
SetWindowExtEx(hPrintDC, 1, 1,NULL);
SetViewportOrgEx(hPrintDC, 0, 0,NULL);
SetViewportExtEx(hPrintDC, iPrintRatio,iPrintRatio,NULL);
BitBlt(hPrintDC, 0,0,rect.right-rect.left,rect.bottom-rect.top,hDisplayDC,0,0,SRCCOPY))

Thank You
LVL 1
marvinmAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
chensuConnect With a Mentor Commented:
SetMapMode(hPrintDC, MM_ANISOTROPIC);
SetWindowExt(hPrintDC, GetDeviceCaps(hDisplayDC, LOGPIXELSX), GetDeviceCaps(hDisplayDC, LOGPIXELSY));
SetViewportExt(hPrintDC, GetDeviceCaps(hPrintDC, LOGPIXELSX), GetDeviceCaps(hPrintDC, LOGPIXELSY));
SetWindowOrg(hPrintDC, 0, 0);
SetViewportOrg(hPrintDC, 0, 0);
0
 
marvinmAuthor Commented:
Bitblt() still fails, but at least GetLastError() returns an integer 87.  The only error code I could find was
ERROR_INVALID_PARAMETER, but this is listed as
/* New 3.0 network related error codes */
0
 
chensuCommented:
Make sure the DC handles are valid. GetLastError returns correct information only on Windows NT/2000 when BitBlt returns zero.
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
marvinmAuthor Commented:
I am tesing on 98, but I will switch on NT to try and get a valid error code.  It always seems to work from 2000.
If I do the following, it works from my 98 machine:
SetViewportExt(hPrintDC, GetDeviceCaps(hPrintDC, LOGPIXELSX)-100, GetDeviceCaps(hPrintDC, LOGPIXELSY)-100);
Thank You

0
 
chensuCommented:
It has something to do with the specific printer driver. Try other printers.
0
 
marvinmAuthor Commented:
I have tried with several combinations of PCs and printers.  Using win200 and any printer it seems to work fine.  With 98/NT I always need to subtract off a certain amount.  So far it always works if I subtract at least 25, ie:
SetViewportExt(hPrintDC, GetDeviceCaps(hPrintDC, LOGPIXELSX)-25, GetDeviceCaps(hPrintDC, LOGPIXELSY)-25);

This is acceptable.  My last concern is how to determine the maximum Y value to print to. When I was calculating the ratio as described above I used:

iMaxYPos = (GetDeviceCaps(hPrintDC,PHYSICALHEIGHT) - (2 * GetDeviceCaps(hPrintDC,PHYSICALOFFSETY))) / >iPrintRatio;

Thank You
0
 
chensuCommented:
That's really strange.

The following code gets the printable rectangle.

RECT rcPage = { 0, 0,
                        ::GetDeviceCaps(hdc, HORZRES),
                        ::GetDeviceCaps(hdc, VERTRES) };
::DPtoLP(hdc, (LPPOINT)&rcPage, 2);
0
 
marvinmAuthor Commented:
Adjusted points from 200 to 400
0
 
marvinmAuthor Commented:
I just tried with another NT SP5 box network printing to an Optra on a 2000 box.  The Bitblt() fails and GetLastError() is integer 122.  I must be doing something fundamentally wrong here with all this strange behavior.  I can print images from PaintShopPro or Word with no problem.  Is there a better way to get my screen display to a printer?  I have little to experience with windows printing.  I will increase the points significantly if we can get this working. Thanks for your help. - mm
0
 
chensuCommented:
Check out the following KB articles.

HOWTO: Capture and Print an Entire Window
http://support.microsoft.com/support/kb/articles/Q186/7/36.ASP

WINCAP Captures Screens Using DIB API
http://support.microsoft.com/support/kb/articles/Q97/1/93.ASP
0
 
marvinmAuthor Commented:
All set
0
 
chensuCommented:
Great!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.