Uhm, non so se ho interpretato correttamente la tua richiesta, comunque elenco un pò di nozioni che possono avvicinarsi alla questione:
Una cosa che utilizzo di solito è l'esportazione del contenuto di una form o di un controllo posto su di essa (o una regione) in immagine: per far questo uso la procedura seguente che prende in input un TControl e restituisce una TBitmap
CODICE
procedure ExportControl(
Control: TControl;
var bmp: tbitmap
);
var
//handle al Device Context dello schermo
ScreenDC: HDC;
//rettangolo definito dal controllo Control
//facendo riferimento a tutto lo schermo
ControlRect: TRect;
ControlRectTop, ControlRectLeft: Cardinal;
begin
//alcune nozioni di base:
//1) control.clientorigin: è un TPoint che rappresenta le coordinate del punto
//in alto a sinistra del controllo Control facendo riferimento a tutto lo schermo
ControlRectTop := Control.ClientOrigin.Y;
ControlRectLeft := Control.ClientOrigin.X;
ControlRect := Bounds(
ControlRectLeft,
ControlRectTop,
Control.ClientWidth,
control.ClientHeight
);
//imposto le dimensioni della bitmap di destinazione
bmp.Width := ControlRect.Right - ControlRect.Left;
bmp.Height := ControlRect.Bottom - ControlRect.Top;
//ottengo l'handle al Device Context dello schermo
ScreenDC := GetDC(0);
//eseguo la copia dei bit della regione di schermo
//occupata dal mio controllo Control nella bitmap bmp di destinazione
//Sorgente = area di schermo
//Destinazione = bitmap
try
bitblt(
bmp.Canvas.Handle, //handle al Device Context della bitmap di destinazione
0, //left di destinazione
0, //top di destinazione
bmp.Width, //ampiezza di destinazione
bmp.Height, //altezza di destinazione
ScreenDC, //handle al Device Context sorgente (ossia lo schermo)
ControlRect.Left, //left sorgente
ControlRect.Top, //top sorgente
SRCCOPY //copio semplicemente i bit dell'area sorgente nell'area destinazione
);
finally
ReleaseDC(0, ScreenDC);
end;
end;
Un esempio di utilizzo potrebbe essere il seguente
CODICE
//salvo il contenuto di un controllo di classe TGroupBox in una immagine bitmap su disco
procedure TForm1.Button1Click(Sender: TObject);
var
bmp:tbitmap;
begin
bmp:=tbitmap.Create;
ExportControl(GroupBox1, bmp);
Bmp.SaveToFile ( 'C:\Test.bmp');
bmp.free;
end;
Se a questo punto vuoi stampare la bitmap invece di salvarla su disco puoi ricorrere alla seguente procedura
CODICE
procedure DrawImage(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap);
var
Header, Bits: Pointer;
HeaderSize: DWORD;
BitsSize: DWORD;
begin
GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
Header := AllocMem(HeaderSize);
Bits := AllocMem(BitsSize);
try
GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top,
DestRect.Right, DestRect.Bottom,
0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^),
DIB_RGB_COLORS, SRCCOPY);
finally
FreeMem(Header, HeaderSize);
FreeMem(Bits, BitsSize);
end;
end;
La DrawImage consente di disegnare una bitmap su qualsiasi canvas: se si vuole stampare basta disegnare sul canvas della stampante,
ossia Printer.Canvas;
Ci si può quindi creare una procedura di stampa bitmap tramite la DrawImage appena definita:
CODICE
uses
... Printers ... //occorre includere la unit Printers
...
procedure PrintBMP(bmp:TBitmap; ZoomPercent: Integer);
//con ZoomPercent=100, la bmp sarà stampata sull'intera pagina
var
relHeight, relWidth: integer;
begin
Screen.Cursor := crHourglass;
Printer.BeginDoc;
with bmp do
begin
if ((Width / Height) > (Printer.PageWidth / Printer.PageHeight)) then
begin
// adatto la bitmap all'ampiezza della pagina di stampa
relWidth := Printer.PageWidth;
relHeight := MulDiv(Height, Printer.PageWidth, Width);
end
else
begin
// adatto la bitmap all'altezza della pagina di stampa
relWidth := MulDiv(Width, Printer.PageHeight, Height);
relHeight := Printer.PageHeight;
end;
relWidth := Round(relWidth * ZoomPercent / 100);
relHeight := Round(relHeight * ZoomPercent / 100);
DrawImage(Printer.Canvas, Rect(0, 0, relWidth, relHeight), bmp);
end;
Printer.EndDoc;
Screen.cursor := crDefault;
end;
La procedura PrintBMP prende in input una bitmap ed una percentuale di zoom della medesima per la stampa
Behh, in ogni caso, anche se non centravano niente con la tua richiesta, ho messo un pò di carne al fuoco
Edited by DigitX32 - 12/4/2007, 18:34