Mam 2 formy: na pierwszej jest kilka edit' ów Na drugiej bitmapę z label 'ami które przejmują wpis z Form1 Jak wydrukować blankiet wraz z naniesionymi w label'ach danymi ?
0
0
Mam nadzieje ze zechcesz przyjąć podziękowanie :) znaczy się ze Tylko formularz wraz z zawartością label'i będzie wydrukowany? Bitmapa jako druczek + tekst ? Dziękuje Karol :)
0
Tu masz gotowca:
procedure ScreenshotMain(const Bitmap: TBitmap; const ScreenArea: TRect);
var
BitmapRect, ScreenRect: TRect;
DesktopDC: HDC;
DesktopCanvas: TCanvas;
begin
BitmapRect := Rect(0, 0, ScreenArea.Right - ScreenArea.Left, ScreenArea.Bottom - ScreenArea.Top);
ScreenRect := Rect(ScreenArea.Left, ScreenArea.Top, ScreenArea.Right, ScreenArea.Bottom);
Bitmap.PixelFormat := pf24bit; // optional
Bitmap.Width := ScreenArea.Right - ScreenArea.Left;
Bitmap.Height := ScreenArea.Bottom - ScreenArea.Top;
DesktopDC := GetWindowDC(GetDeskTopWindow);
try
DesktopCanvas := TCanvas.Create;
try
DesktopCanvas.Handle := DesktopDC;
Bitmap.Canvas.CopyMode := cmSrcCopy;
Bitmap.Canvas.CopyRect(BitmapRect, DesktopCanvas, ScreenRect);
finally
DesktopCanvas.Free;
end;
finally
ReleaseDC(GetDeskTopWindow, DesktopDC);
end;
end;
function ScreenshotArea(IncludeCursor: Boolean; const ScreenArea: TRect): TBitmap;
var
r: TRect;
CI: TCursorInfo;
Icon: TIcon;
II: TIconInfo;
begin
Result := TBitmap.Create;
r := ScreenArea;
ScreenshotMain(Result, r);
if IncludeCursor then
begin
Icon := TIcon.Create;
try
CI.cbSize := SizeOf(CI);
if GetCursorInfo(CI) then
if CI.flags = CURSOR_SHOWING then
begin
Icon.Handle := CopyIcon(CI.hCursor);
if GetIconInfo(Icon.Handle, II) then
try
Result.Canvas.Draw(ci.ptScreenPos.x - Integer(II.xHotspot) - r.Left, ci.ptScreenPos.y - Integer(II.yHotspot) - r.Top, Icon);
finally
DeleteObject(II.hbmMask);
DeleteObject(II.hbmColor);
end;
end;
finally
Icon.Free;
end;
end;
end;
Function GetControlScreenShot(ControlHandle: THandle): TBitmap;
Var
R: TRect;
begin
if GetWindowRect(ControlHandle, R) then Result:=ScreenshotArea(false, R);
End;
procedure TForm1.Button1Click(Sender: TObject);
Var
BM: Tbitmap;
begin
Panel1.BevelInner:=bvNone;
Panel1.BevelOuter:=bvNone;
Update;
BM:=GetControlScreenShot(Panel1.Handle);
BM.SaveToFile('c:\PanelShot.bmp');
BM.Free;
end;
Kładziesz tylko na panel co tam chcesz (Image, Edit, Label, Memo, itd.) i dostajesz screenshota jego zawartości. Dla np. samego Image możesz dać Image.Align:=alClient;.