Newsgroup: it.comp.lang.delphi
Titolo: problema stretchDraw

Buona sera,
Ho un problema con l'oggetto tprinter:
 
//lo istanzio e lo setto:
 
MyPrinter:=Tprinter.Create;
  MyPrinter.GetPrinter(Device,Driver,Port,DevMode);
  MyPrinter.SetPrinter(Device,Driver,Port,0);
 
//setto i parametri di un rettangolo grande come tutta l'area stampabile:
 
  r.Left:=1;
  r.Top:=1;
  r.Right:=myprinter.PageWidth;
  r.Bottom:=myprinter.PageHeight;
 
//istanzio e setto l'oggetto image da applicare di sfondo alle pagine.
 
image := TBitmap.Create;
image.loadfromfile('modelli\'+'logo.bmp');
 
//inizio la stampa
  myprinter.BeginDoc;
 
stampo con questo semplice ciclo una immagine "allargata" per tutta la 
pagina, per n pagine.
 
for i:=1 to n do
   begin
     myprinter.Canvas.stretchDraw(r,image);
     myprinter.NewPage;
   end;
 
// prefinco anche l'ultima pagina.
 
myprinter.Canvas.stretchDraw(r,image);
 
// termino la stampa
 
myprinter.EndDoc;
 
Viene fatta la la stampa correttamente ma a caso....e nn si sa perchè, 
senza un apparente motivo logico la funzione stretchdraw inserisce una 
immagine completamente NERA!!!!
 
Qualcuno sa dirmi dove sbaglio?
o ha suggerimenti per migliorare il codice?
THNX
 
 
Grazie mille


 
Premessa: quando si chiede la soluzione ad un problema, è 
buona norma indicare la versione di Delphi che si usa, 
il sistema operativo, ecc...
 
Così ad occhio, direi che sbagli ad usare StretchDraw.
Cerca nei vecchi post il motivo, se ne era già parlato.
 
Prova asd usare l'API StretchDIBits al suo posto.
 
ACSH
 
 
 
 
 
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 


Chiedo scusa hai perfettamente ragione, sto usando la versione XE2, 
appena scaricata fresca dal sito embarcadero.
 
Grazie mille per la risposta proverò le funzioni di cui parli.
Grazie ancora

 Grazie ancora
 
Ho provato l'APIe StretchDIBits..... funziona a meraviglia... posto un 
esempio di utilizzo che ho trovato in giro per la rete e che a me ha 
funzionato alla grande al primo colpo:
 
PROCEDURE PrintBitmap(Canvas:  TCanvas; DestRect:  TRect;  Bitmap: 
TBitmap);
   VAR
     BitmapHeader:  pBitmapInfo;
     BitmapImage :  POINTER;
     HeaderSize  :  DWORD;    // Use DWORD for D3-D5 compatibility
     ImageSize   :  DWORD;
BEGIN
   GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
   GetMem(BitmapHeader, HeaderSize);
   GetMem(BitmapImage,  ImageSize);
   TRY
     GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
     StretchDIBits(Canvas.Handle,
                   DestRect.Left, DestRect.Top,     // Destination Origin
                   DestRect.Right  - DestRect.Left, // Destination Width
                   DestRect.Bottom - DestRect.Top,  // Destination Height
                   0, 0,                            // Source Origin
                   Bitmap.Width, Bitmap.Height,     // Source Width & Height
                   BitmapImage,
                   TBitmapInfo(BitmapHeader^),
                   DIB_RGB_COLORS,
                   SRCCOPY)
   FINALLY
     FreeMem(BitmapHeader);
     FreeMem(BitmapImage)
   END
END {PrintBitmap};
 
poi la ho utilizzata in questo modo al posto della stretchDraw maledetta!!!
 
printbitmap(myprinter.Canvas,r,image);
 
dove :
myprinter � un'istanza di tprinter
r � di tipo Trect per delimitare la zona di "arrivo" della bitmap.
image � un oggetto di tipo Tbitmap).
 
Grazie a tutti per l'aiuto!