Hi there. To print a bitmap I do the following: 1) create the bitmap and get a handle to its device context 2) PrintDlg(...) with PD_RETURNDC and PD_RETURNDEFAULT to get a handle to the default printer device context (the received handle is not null) 3) StartDoc(...) and StartPage(...) 4) GetDeviceCaps(...) to get the printable area 5) BitBlt(...) to copy data from the device context of the bitmap to the device context of the printer 6) EndPage(...) and EndDoc(...) but this causes a *blank page* to get off the printer. In a previous experiment the code worked, the only difference being that the handle to the device context of the printer was obtained with CreateDC() instead of PringDlg(). I am confused. Can you show me the way to solve this problem ? Many thanks from Alvise.
Do we assume you are getting the hDC from the PRINTDIALOG structure?
Yes. I get the handle to the device context of the printer from the hDC member of PRINTDLG structure. Please notice that when I call PrintDlg() this function returns true and hDC is not null, and this means that the handle is valid. The only change from my previous working code is that I substituted CreateDC() with PringDlg(). Infact CreateDC is not so useful to get the device context of the printer in that you have to specify the *name* of the printer, and this works with only one printer. PrintDlg() with mentionned flags, instead, returns the handle of the device context of the *default* printer, much more useful to me (and to everyone). I would take the occasion to thank hutch and Iczelion (and all of the other contributors) for their invaluable effort to provide us developer with such a great MASM32 package. I would also signal that inspecting WINDOWS.INC I found that one of the members of PRINTDLG structure should be corrected from lpPrinterSetupTemplateName to lpSetupTemplateName. Thanks. Alvise.
Latest addition. I changed LAN and the code works. I continue being confused. In my home LAN the bitmap is correctly printed, but in my office LAN a blank sheet of paper gets out of the printer. I have been reading around experiences from other programmers, and someone says that there is not one secure way to print a bitmap for every operating system (95/98/NT/2000). Is there any final word about printing bitmaps in 95/98/NT/2000 ? Regards. Alvise.
Alvise, I ported the bitmap sample in win32.hlp file. It works until now everywhere I tried it. I can mail it to you, so you can test it yourself. vesa
I had a look at win32.hlp too, but after your advise I will carefully study it again to find the differences. My win32.hlp is 24MB approx., and it is dated march 14th, 1997. Maybe it is too old. I will ask you the code only if I can't solve it myself. Thanks you very much for your kind attention, and regards from Alvise. P.S.: where can I find a more recent win32.hlp ?? This message was edited by alvise, on 4/2/2001 5:54:52 AM
alvise, my win32.hlp is dated 11. August 1999. Where it is from? I don't know anymore. The newest platform SDK has the same sample. vesa
Hi vesa. I revised my "printing a bitmap" code vs my win32.hlp and it looks OK, but I can't still print. I also searched the Internet for a recent win32.hlp, but I only found a compiled version (win32.chi) that does not cover winNT and win2k. Can you please send me your "printing a bitmap" code ? I would appreciate it much, because it could solve my problem. Many thanks. Alvise. e-mail: email@example.com ------------- P.S.: i published some code (both in win32asm and C++) at: www.hochfeiler.it/alvise This message was edited by alvise, on 4/4/2001 8:37:13 AM This message was edited by alvise, on 4/4/2001 8:38:42 AM
you should also care about the device capabilities of your printer, because some printers (like HP Laserjet) dont support some GDI modes, like 32 bit color depth or reverse blits (with negative height). I had an example, where I must mirror my bitmap before printing. In another case I had to reduce my 32bit memory bitmap to a 24 bit one before printing. My other printer (Epson Stylus) did all the things itself and printed everything fine. (blame on HP :cool:)
Yes, some strange things happen. Anycase I solved my problem and want to inform you all. I used BitBlt to copy a bitmap from its device context to the device context of the printer. This worked only when the device context of the printer was obtained using GetDC. Then I changed GetDC to PrintDlg, and BitBlt didn't work anymore. Looking at the source code that Vesa kindly sent me, and at the Thomas's example in the example2 directory of MASM32 v.6, I decided to use *StretchBlt* instead of BitBlt, and now my routine is happily printing. I would also point out that Microsoft doesn't release win32.hlp anymore, because all its documentation is now released in the compiled help version (.chm, I hate it). Anycase the latest win32.hlp version available (before compiled help) can be downloaded at this address: http://www.borland.com/techpubs/bcppbuilder/v5/updates/ent.html (look for B5MS.ZIP, 17MB size approx). That's all. Thanks all. Alvise.