Print Image (or whats wrong here?)

Just starting out? Need help? Post your questions and find answers here.
Garfield9992003
User
User
Posts: 15
Joined: Tue Apr 26, 2005 8:13 am

Print Image (or whats wrong here?)

Post by Garfield9992003 »

Hello.

I´ve posted my problem in german forum too. But no answer.
Now, i hope here to get help.

My problem:
I´ve got a form with an image and some printer-settings.
The image can be resized to fit in page. But nothing occurs - my printed pages (Fineprint and epson-preview) keep blank.

Why?

Here´s my complet code:

Code: Select all

Enumeration
  #BClose
  #drucker
  #BDrucker
  #DruckKopie
  #DruckSize
  #L105
  #L106
  #Vorschau
EndEnumeration

Dim DevIn.DEVMODE(0)
Dim DevOut.DEVMODE(0) 

Procedure DruckerEinstellung()
  OpenPrinter_(GetGadgetText(#drucker),@PrinterHandle.l,0) 
  r=DocumentProperties_(0,PrinterHandle,GetGadgetText(#drucker),DevIn(0),DevOut(0),8|2|4)
  ClosePrinter_(PrinterHandle)
  If r=1: CopyMemory(DevOut(0),DevIn(0), SizeOf(DEVMODE)): EndIf
EndProcedure

Procedure Drucken()
; the image-dimensions 320*440 is only an example
  OpenPrinter_(GetGadgetText(#drucker),@PrinterHandle.l,0) 
  DocumentProperties_(0,PrinterHandle,GetGadgetText(#drucker),DevIn(0),DevOut(0),8|2)
  ClosePrinter_(PrinterHandle)
  PrinterDC.l = CreateDC_("WINSPOOL",GetGadgetText(#drucker),0,DevIn(0))
  DocInf.DOCINFO 
  DocInf\cbSize = SizeOf(DOCINFO) 
  DocInf\lpszDocName = @"Ausdruck"
  DocInf\lpszOutput = #Null 
  DruckBreite= GetDeviceCaps_(PrinterDC, 4) 
  DruckHoehe= GetDeviceCaps_(PrinterDC, 6)
  If GetGadgetState(#DruckSize)
    If DruckBreite>DruckHoehe ; zoomfactor
      ZoomFaktor.f=DruckBreite/320
    Else
      ZoomFaktor.f=DruckHoehe/440
    EndIf
  Else
    ZoomFaktor.f=1
  EndIf
  MessageRequester("","Zoomfaktor: "+StrF(ZoomFaktor))
  RandLinks = (DruckBreite-(ZoomFaktor*320))/2 ; center image
  RandOben = (DruckHoehe-(ZoomFaktor*440))/2 
  StartDoc_(PrinterDC,@DocInf)
  For t=1 To Val(GetGadgetText(#DruckKopie)) ;copies
    StartPage_(PrinterDC)
    imgDC = UseImage(0)
    hdc = CreateCompatibleDC_(PrinterDC) 
    SelectObject_(hdc,imgDC) 
    StretchBlt_(PrinterDC,RandLinks,RandOben,320*ZoomFaktor,440*ZoomFaktor,hdc,0,0,319,439,#SRCCOPY) 
    DeleteDC_(hdc)         
    EndPage_(PrinterDC)
  Next t
  EndDoc_(PrinterDC) 
  DeleteDC_(PrinterDC)
EndProcedure

NewList DruckerListe.s() 
Procedure GetPrinters()
  ClearList(DruckerListe()) 
  Buffersize.l  = 8192 
  *Buffer = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize) 
  If GetProfileString_("devices", 0, "", *Buffer, Buffersize) 
    TempString.s = PeekS(*Buffer) 
    Length.l = Len(TempString) 
    While TempString <> "" 
      AddElement(DruckerListe()) 
      DruckerListe()= TempString
      TempString = PeekS(*Buffer + Length + 1) 
      Length = Length + Len(TempString) + 1 
    Wend 
  EndIf 
  GlobalFree_(*Buffer) 
EndProcedure 
Procedure.s GetDefaultPrinter() 
  DruckerSTD$ = Space(260) 
  If GetPrivateProfileString_("WINDOWS","DEVICE","", @DruckerSTD$, 260, "Win.Ini") 
    DruckerDefault.s = StringField(DruckerSTD$, 1,",") 
  EndIf 
  ProcedureReturn DruckerDefault
EndProcedure 

;MAIN
  
  OpenWindow(0, 131, 225, 646, 490, #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Test")
  If CreateGadgetList(WindowID())
    ButtonGadget(#BClose, 435, 455, 100, 20, "Print / Close")
    ComboBoxGadget(#drucker, 405, 170, 165, 90)
    ButtonGadget(#BDrucker, 570, 170, 60, 20, "Settings")
    StringGadget(#DruckKopie, 405, 195, 35, 20, "1", #PB_String_Numeric)
    CheckBoxGadget(#DruckSize, 500, 195, 130, 20, "Fit image to page", #PB_CheckBox_Right)
    TextGadget(#L105, 335, 175, 65, 15, "Printer:", #PB_Text_Right)
    TextGadget(#L106, 335, 200, 65, 15, "Copies:", #PB_Text_Right)
    CreateImage(0,320,440)
    ImageGadget(#Vorschau, 5, 5, 320, 440, UseImage(0))
  EndIf
  
  GetPrinters() 
  ResetList(DruckerListe())
  While NextElement(DruckerListe()) ;all printers into combo
    AddGadgetItem(#drucker,-1, DruckerListe())
  Wend
  For t=0 To CountGadgetItems(#drucker); select defaultprinter
    If GetGadgetItemText(#drucker,t,1)=GetDefaultPrinter()
      SetGadgetState(#drucker,t)
    EndIf
  Next t
  
  Repeat 
    EventID=WaitWindowEvent()
    Select EventID
      Case #PB_EventGadget 
        Select EventGadgetID() 
          Case #BClose: Ende=1
          Case #BDrucker: DruckerEinstellung()
        EndSelect
    EndSelect
  Until Ende=1
   
  If MessageRequester("","Print Image?",#PB_MessageRequester_YesNo)=6
    Drucken()
  EndIf
Thanks a lot for help.

Regards.

Frank
Max.
Enthusiast
Enthusiast
Posts: 225
Joined: Fri Apr 25, 2003 8:39 pm

Re: Print Image (or whats wrong here?)

Post by Max. »

Garfield9992003 wrote:Hello.

I´ve posted my problem in german forum too. But no answer.
Now, i hope here to get help.

My problem:
I´ve got a form with an image and some printer-settings.
The image can be resized to fit in page. But nothing occurs - my printed pages (Fineprint and epson-preview) keep blank.

Why?

Here´s my complet code:

Code: Select all

Enumeration
  #BClose
  #drucker
  #BDrucker
  #DruckKopie
  #DruckSize
  #L105
  #L106
  #Vorschau
EndEnumeration

Dim DevIn.DEVMODE(0)
Dim DevOut.DEVMODE(0) 

Procedure DruckerEinstellung()
  OpenPrinter_(GetGadgetText(#drucker),@PrinterHandle.l,0) 
  r=DocumentProperties_(0,PrinterHandle,GetGadgetText(#drucker),DevIn(0),DevOut(0),8|2|4)
  ClosePrinter_(PrinterHandle)
  If r=1: CopyMemory(DevOut(0),DevIn(0), SizeOf(DEVMODE)): EndIf
EndProcedure

Procedure Drucken()
; the image-dimensions 320*440 is only an example
  OpenPrinter_(GetGadgetText(#drucker),@PrinterHandle.l,0) 
  DocumentProperties_(0,PrinterHandle,GetGadgetText(#drucker),DevIn(0),DevOut(0),8|2)
  ClosePrinter_(PrinterHandle)
  PrinterDC.l = CreateDC_("WINSPOOL",GetGadgetText(#drucker),0,DevIn(0))
  DocInf.DOCINFO 
  DocInf\cbSize = SizeOf(DOCINFO) 
  DocInf\lpszDocName = @"Ausdruck"
  DocInf\lpszOutput = #Null 
  DruckBreite= GetDeviceCaps_(PrinterDC, 4) 
  DruckHoehe= GetDeviceCaps_(PrinterDC, 6)
  If GetGadgetState(#DruckSize)
    If DruckBreite>DruckHoehe ; zoomfactor
      ZoomFaktor.f=DruckBreite/320
    Else
      ZoomFaktor.f=DruckHoehe/440
    EndIf
  Else
    ZoomFaktor.f=1
  EndIf
  MessageRequester("","Zoomfaktor: "+StrF(ZoomFaktor))
  RandLinks = (DruckBreite-(ZoomFaktor*320))/2 ; center image
  RandOben = (DruckHoehe-(ZoomFaktor*440))/2 
  StartDoc_(PrinterDC,@DocInf)
  For t=1 To Val(GetGadgetText(#DruckKopie)) ;copies
    StartPage_(PrinterDC)
    imgDC = UseImage(0)
    hdc = CreateCompatibleDC_(PrinterDC) 
    SelectObject_(hdc,imgDC) 
    StretchBlt_(PrinterDC,RandLinks,RandOben,320*ZoomFaktor,440*ZoomFaktor,hdc,0,0,319,439,#SRCCOPY) 
    DeleteDC_(hdc)         
    EndPage_(PrinterDC)
  Next t
  EndDoc_(PrinterDC) 
  DeleteDC_(PrinterDC)
EndProcedure

NewList DruckerListe.s() 
Procedure GetPrinters()
  ClearList(DruckerListe()) 
  Buffersize.l  = 8192 
  *Buffer = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize) 
  If GetProfileString_("devices", 0, "", *Buffer, Buffersize) 
    TempString.s = PeekS(*Buffer) 
    Length.l = Len(TempString) 
    While TempString <> "" 
      AddElement(DruckerListe()) 
      DruckerListe()= TempString
      TempString = PeekS(*Buffer + Length + 1) 
      Length = Length + Len(TempString) + 1 
    Wend 
  EndIf 
  GlobalFree_(*Buffer) 
EndProcedure 
Procedure.s GetDefaultPrinter() 
  DruckerSTD$ = Space(260) 
  If GetPrivateProfileString_("WINDOWS","DEVICE","", @DruckerSTD$, 260, "Win.Ini") 
    DruckerDefault.s = StringField(DruckerSTD$, 1,",") 
  EndIf 
  ProcedureReturn DruckerDefault
EndProcedure 

;MAIN
  
  OpenWindow(0, 131, 225, 646, 490, #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Test")
  If CreateGadgetList(WindowID())
    ButtonGadget(#BClose, 435, 455, 100, 20, "Print / Close")
    ComboBoxGadget(#drucker, 405, 170, 165, 90)
    ButtonGadget(#BDrucker, 570, 170, 60, 20, "Settings")
    StringGadget(#DruckKopie, 405, 195, 35, 20, "1", #PB_String_Numeric)
    CheckBoxGadget(#DruckSize, 500, 195, 130, 20, "Fit image to page", #PB_CheckBox_Right)
    TextGadget(#L105, 335, 175, 65, 15, "Printer:", #PB_Text_Right)
    TextGadget(#L106, 335, 200, 65, 15, "Copies:", #PB_Text_Right)
    CreateImage(0,320,440)
    ImageGadget(#Vorschau, 5, 5, 320, 440, UseImage(0))
  EndIf
  
  GetPrinters() 
  ResetList(DruckerListe())
  While NextElement(DruckerListe()) ;all printers into combo
    AddGadgetItem(#drucker,-1, DruckerListe())
  Wend
  For t=0 To CountGadgetItems(#drucker); select defaultprinter
    If GetGadgetItemText(#drucker,t,1)=GetDefaultPrinter()
      SetGadgetState(#drucker,t)
    EndIf
  Next t
  
  Repeat 
    EventID=WaitWindowEvent()
    Select EventID
      Case #PB_EventGadget 
        Select EventGadgetID() 
          Case #BClose: Ende=1
          Case #BDrucker: DruckerEinstellung()
        EndSelect
    EndSelect
  Until Ende=1
   
  If MessageRequester("","Print Image?",#PB_MessageRequester_YesNo)=6
    Drucken()
  EndIf
Thanks a lot for help.

Regards.

Frank
Cannot try it at the moment, but from a short glance, do not use StretchBlt but StretchDIBits!

I made some code some days ago that pretty much did look like yours; tried it, ironed out some bugs until it was perfectly printing.

I tried on a 3rd PC - and it usually did print out empty sheets. Funny, was the same printer as the 2 others I tried. All running under XP. Difference only; this one was using a HP LaserJet driver, whereas the working installations used the original Kyocera driver.

I did some search on the Internet and indeed, StretchBlt has troubles with some Printer(drivers). Changed to StretchDIBits as suggested and since then no problems at all with no printer/drive combination.

Maybe not the problem you got now, as I said, can't try it at the moment; but a problem you will get later anyway when using StretchBlt.
Athlon64 3800+ · 1 GB RAM · Radeon X800 XL · Win XP Prof/SP1+IE6.0/Firefox · PB 3.94/4.0
Intel Centrino 1.4 MHz · 1.5 GB RAM · Radeon 9000 Mobility · Win XP Prof/SP2+IE6.0/Firefox · PB 3.94/4.0
Max.
Enthusiast
Enthusiast
Posts: 225
Joined: Fri Apr 25, 2003 8:39 pm

Post by Max. »

Could try it now:

Change the following snippets and it should work. There is also some bug with the print offsets and zoom factor I bypassed (to make my life easier) by just scaling to the whole page and putting the left/top margins to 100/100.

1. change

Code: Select all

  DruckBreite= GetDeviceCaps_(PrinterDC, #HORZRES) 
  DruckHoehe= GetDeviceCaps_(PrinterDC, #VERTRES) 
2. change

Code: Select all

    imgDC = UseImage(0) 
    hdc = CreateCompatibleDC_(0) 
    SelectObject_(hdc,imgDC) 
    StretchBlt_(PrinterDC,100,100,DruckBreite,DruckHoehe,hdc,0,0,319,439,#SRCCOPY) 
Hope this helps. Still, you should consider using StretchDIBits!
Athlon64 3800+ · 1 GB RAM · Radeon X800 XL · Win XP Prof/SP1+IE6.0/Firefox · PB 3.94/4.0
Intel Centrino 1.4 MHz · 1.5 GB RAM · Radeon 9000 Mobility · Win XP Prof/SP2+IE6.0/Firefox · PB 3.94/4.0
Garfield9992003
User
User
Posts: 15
Joined: Tue Apr 26, 2005 8:13 am

Post by Garfield9992003 »

Thanks! I took the wrong constant in GetDeviceCaps...
And i´ve fixed the Scalefactor now.

And now, i know the reason:
When i use the first block (see code) with saveimage and loadimage_, then it works. - But i want to use the second (remarked) block with useimage.

Do you have an idea?!

Regards

Frank

Code: Select all

Enumeration
  #BClose
  #drucker
  #L105
  #Vorschau
EndEnumeration

Dim DevIn.DEVMODE(0)
Dim DevOut.DEVMODE(0) 

Procedure Drucken()
; the image-dimensions 320*440 is only an example
  OpenPrinter_(GetGadgetText(#drucker),@PrinterHandle.l,0) 
  DocumentProperties_(0,PrinterHandle,GetGadgetText(#drucker),DevIn(0),DevOut(0),8|2)
  ClosePrinter_(PrinterHandle)
  PrinterDC.l = CreateDC_("WINSPOOL",GetGadgetText(#drucker),0,DevIn(0))
  DocInf.DOCINFO 
  DocInf\cbSize = SizeOf(DOCINFO) 
  DocInf\lpszDocName = @"Ausdruck"
  DocInf\lpszOutput = #Null 
  DruckBreite= GetDeviceCaps_(PrinterDC, 8) 
  DruckHoehe= GetDeviceCaps_(PrinterDC, 10)
  StartDoc_(PrinterDC,@DocInf)
  StartPage_(PrinterDC)
    
;This block works!!!
    SaveImage(0, "c:\test.bmp", #PB_ImagePlugin_BMP)
    imgDC = LoadImage_(0,"c:\test.bmp",0,0,0,$2050)
    hdc = CreateCompatibleDC_(PrinterDC)
    SelectObject_(hdc,imgDC)

;This one should, but it dont    
    ; imgDC = UseImage(0)
    ; hdc = CreateCompatibleDC_(PrinterDC)
    ; SelectObject_(hdc,imgDC)    

  StretchBlt_(PrinterDC,0,0,DruckBreite,DruckHoehe,hdc,0,0,319,439,#SRCCOPY) 
  DeleteDC_(hdc)         
  EndPage_(PrinterDC)
  EndDoc_(PrinterDC) 
  DeleteDC_(PrinterDC)
EndProcedure

NewList DruckerListe.s() 
Procedure GetPrinters()
  ClearList(DruckerListe()) 
  Buffersize.l  = 8192 
  *Buffer = GlobalAlloc_(#GMEM_FIXED | #GMEM_ZEROINIT, Buffersize) 
  If GetProfileString_("devices", 0, "", *Buffer, Buffersize) 
    TempString.s = PeekS(*Buffer) 
    Length.l = Len(TempString) 
    While TempString <> "" 
      AddElement(DruckerListe()) 
      DruckerListe()= TempString
      TempString = PeekS(*Buffer + Length + 1) 
      Length = Length + Len(TempString) + 1 
    Wend 
  EndIf 
  GlobalFree_(*Buffer) 
EndProcedure 

;MAIN
  
  OpenWindow(0, 131, 225, 646, 490, #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Test")
  If CreateGadgetList(WindowID())
    ButtonGadget(#BClose, 435, 455, 100, 20, "Print / Close")
    ComboBoxGadget(#drucker, 405, 170, 165, 90)
    TextGadget(#L105, 335, 175, 65, 15, "Printer:", #PB_Text_Right)
    CreateImage(0,320,440)
    ImageGadget(#Vorschau, 5, 5, 320, 440, UseImage(0))
  EndIf
  
  GetPrinters() 
  ResetList(DruckerListe())
  While NextElement(DruckerListe()) ;all printers into combo
    AddGadgetItem(#drucker,-1, DruckerListe())
  Wend
  
  Repeat 
    EventID=WaitWindowEvent()
    Select EventID
      Case #PB_EventGadget 
        Select EventGadgetID() 
          Case #BClose: Ende=1
        EndSelect
    EndSelect
  Until Ende=1
   
  If MessageRequester("","Print Image?",#PB_MessageRequester_YesNo)=6
    Drucken()
  EndIf
Max.
Enthusiast
Enthusiast
Posts: 225
Joined: Fri Apr 25, 2003 8:39 pm

Post by Max. »

Try this:

Code: Select all

;This one should, but it dont   
    imgDC = UseImage(0)
    hdc = CreateCompatibleDC_(0)
    hImg = CreateCompatibleBitmap_ (hdc,320,440)
    SelectObject_(hdc,hImg)   
It works for me, but honestly, I get too easily confused with GDI programming. :P
Athlon64 3800+ · 1 GB RAM · Radeon X800 XL · Win XP Prof/SP1+IE6.0/Firefox · PB 3.94/4.0
Intel Centrino 1.4 MHz · 1.5 GB RAM · Radeon 9000 Mobility · Win XP Prof/SP2+IE6.0/Firefox · PB 3.94/4.0
Garfield9992003
User
User
Posts: 15
Joined: Tue Apr 26, 2005 8:13 am

Post by Garfield9992003 »

This sample is better than mine :)
But it does always a black picture, because there isn´t a relation to imgDC.

I´ve tried with a 2nd Setobject to put the useimage-handle to hImg... nothing....

I´m getting confused too with handles, DCs, pointers, bitmaps.... :shock:
Max.
Enthusiast
Enthusiast
Posts: 225
Joined: Fri Apr 25, 2003 8:39 pm

Post by Max. »

LOL! Sorry, that was really stupid. I expected a black page, got one and was happy!

I looked up the code I use now and mentioned and try to fit it in. Most stuff are snippets from Danilo's postings.

Code: Select all

Procedure Drucken()
; the image-dimensions 320*440 is only an example
  OpenPrinter_(GetGadgetText(#drucker),@PrinterHandle.l,0)
  DocumentProperties_(0,PrinterHandle,GetGadgetText(#drucker),DevIn(0),DevOut(0),8|2)
  ClosePrinter_(PrinterHandle)
  PrinterDC.l = CreateDC_("WINSPOOL",GetGadgetText(#drucker),0,DevIn(0))
  DocInf.DOCINFO
  DocInf\cbSize = SizeOf(DOCINFO)
  DocInf\lpszDocName = @"Ausdruck"
  DocInf\lpszOutput = #Null
  DruckBreite= GetDeviceCaps_(PrinterDC, 8)
  DruckHoehe= GetDeviceCaps_(PrinterDC, 10)
  StartDoc_(PrinterDC,@DocInf)
  StartPage_(PrinterDC)
   
  bmi.BITMAPINFO 
  
  UseImage(0) 
  
  ImgWidth = ImageWidth() 
  ImgHeight = ImageHeight() 
  
  Mem = AllocateMemory(ImgWidth*ImageHeight()*4)
  
  hBmp = ImageID() 
  
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER) 
  bmi\bmiHeader\biWidth       =  ImgWidth 
  bmi\bmiHeader\biHeight      = -ImgHeight 
  bmi\bmiHeader\biPlanes      =  1 
  bmi\bmiHeader\biBitCount    = 24 
  bmi\bmiHeader\biCompression = #BI_RGB 
  
  hDC  = StartDrawing( ImageOutput() ) 
  GetDIBits_(hDC, hBmp, 0, ImgHeight, mem, bmi, #DIB_RGB_COLORS) 
   StopDrawing() 
  
  Result = StretchDIBits_ ( PrinterDC,0,0,DruckBreite,DruckHoehe,0,0,319,439,mem,bmi,#DIB_RGB_COLORS,#SRCCOPY)
   
  EndPage_(PrinterDC)
  EndDoc_(PrinterDC)

  DeleteDC_(hDC)
  DeleteDC_(PrinterDC)
  FreeMemory(Mem)

EndProcedure
I tried it now with a different image than just black and it worked. :twisted:
Athlon64 3800+ · 1 GB RAM · Radeon X800 XL · Win XP Prof/SP1+IE6.0/Firefox · PB 3.94/4.0
Intel Centrino 1.4 MHz · 1.5 GB RAM · Radeon 9000 Mobility · Win XP Prof/SP2+IE6.0/Firefox · PB 3.94/4.0
Garfield9992003
User
User
Posts: 15
Joined: Tue Apr 26, 2005 8:13 am

Post by Garfield9992003 »

Damn, you´re right!

The golden word is StretchDIBits....
I´ve got the image as raw-array and converted it to an ImageID for other reasons. So, i´ve changed some code now, and it work!

Many thanks. I´ve spend hours for this...

*kiss* *g*

Frank
Post Reply