[Delphi] Screenshot van object / deel desktop

Pagina: 1
Acties:

  • Norckon
  • Registratie: September 2000
  • Laatst online: 19-08 19:16
Situatie
ik ben bezig met een applicatie waarin vrij objecten ge- en verplaatst kunnen worden, waar tussen met pijlen relaties aangegeven worden. De pijlen worden op een TImage getekent en de objecten zijn afgeleiden van de standaard TShape.

Eén van de eisen aan het programma is de mogelijkheid het ontstane schema in het clipboard te zetten als plaatje en/of op te slaan (tevens als plaatje).

Probleem
Ik heb me een breuk gezocht maar kan niets vinden over hoe dit te doen is. Er zijn genoeg manieren om een screenshot te maken, maar hiervoor moet je de exacte positie van de TImage ten opzichte van het scherm weten en dan kan niet, omdat b.v. de titelbalk van het programma van grootte kan verschillen per skin.

Vraag
Is het mogelijk alle beeldinfo wat zich binnen het gebied van een bepaald object bevind (in dit geval dus de TImage) uit te lezen, bijvoorbeeld door de handle mee te geven aan 'een' Windows API? Dus niet alleen de inhoud van de image, maar ook de objecten die daar bovenop liggen.
Hoop dat iemand wat weet, want ik weet 't niet meer :|

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

Je kan toch gewoon gelijk de timage.canvas uitlezen :?

Stop uploading passwords to Github!


  • Norckon
  • Registratie: September 2000
  • Laatst online: 19-08 19:16
Dus niet alleen de inhoud van de image, maar ook de objecten die daar bovenop liggen.
Beter lezen hm :)

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 20-08 20:03

Knutselsmurf

LED's make things better

Als je met copyrect een kopie maakt van het canvas van het form, waar de image op staat, krijg je dan niet alles te zien?

- This line is intentionally left blank -


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Volgens mij zijn er prima functies (getWindowRect?) die de positie van een window relatief aan de linkerbovenhoek van het scherm weergeven; ik neem aan dat dat ook precies de coordinaten zijn die je nodig hebt voor je screenshot...?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:22

Tomatoman

Fulltime prutser

Je kunt de tekening stapsgewijs kopiëren. Eerst maak je een (offscreen) bitmap. Dan kopieer je met de standaard tekenfuncties de achtergrond van de tekening naar de bitmap. Vervolgens ga je alle objecten langs en teken je ze stuk voor stuk op de bitmap. Desnoods maak je daarvoor tijdelijk een duplicaat van iedere pijl, zodat je de pijl probleemloos kunt manipuleren zonder de originele tekening te verpesten.

Een goede grap mag vrienden kosten.


  • Norckon
  • Registratie: September 2000
  • Laatst online: 19-08 19:16
Heuj.. het werkt :)

Door de handle van de form ipv die van die van de desktop te nemen omzeil ik het probleem met varierende form-captionbalkhoogtes en kan ik probleemloos het gebied van de image capturen.

hulde! :P


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
with Image1 do
    CopyRect(Left, Top, Left + Width, Top + Height);


procedure TForm1.CopyRect(X1, Y1, X2, Y2: Integer);
var
  W, H: Integer;
  MyFormat: Word;
  Bitmap: TBitMap;
  AData: THandle;
  APalette: HPalette;
  Canv: TCanvas;
  DC: HDC;
  Src: TRect;
begin
  W := X2 - X1;
  H := Y2 - Y1;
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := W;
    Bitmap.Height := H;
    Canv := TCanvas.Create;
    DC := GetDC(Form1.Handle);
    Canv.Handle := DC;
    Bitmap.Canvas.CopyRect(Rect(0, 0, W, H), Canv, Rect(X1, Y1, X2, Y2));
    Canv.Handle := 0;
    ReleaseDC(0, DC);
    Canv.Free;
    Bitmap.SaveToClipBoardFormat(MyFormat, AData, APalette);
    ClipBoard.SetAsHandle(MyFormat, AData);
  finally
    Bitmap.Free;
  end;
end;
Pagina: 1