Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   PagePicker (https://www.delphipraxis.net/177161-pagepicker.html)

Kraisel 21. Okt 2013 13:27

PagePicker
 
Hallo,

ich würde gerne einen "PagePicker", wie er im neuen iOS7 bei Safari zu sehen ist, in Windows als Komponente programmieren. Funktioniert soweit schon ganz gut, aber leider nur mit selbst gezeichneten oder sonstigen Bitmaps (eine Bitmap je dargestellte Seite).

Gibt es eine Möglichkeit, Delphi-Komponenten, so wie sie auf dem Bildschirm zu sehen sind, in eine Bitmap zu stanzen? z.B. ein TGrid mit TMemo und TButton. Eine Kopie mit BitBlt schlägt fehl, da die Handle der Komponenten keine Handle auf Canvas sind. Oder gehts auch anders?

Und sofort weiter: Wenn möglich, gibt es eine Möglichkeit noch nicht auf dem Bildschirm gezeichnete Komponenten irgendwie in eine Bitmap zeichnen zu lassen?

Was natürlich geht, ist über die Koordinaten den entsprechenden Bildschirmausschnitt zu kopieren. Aber wehe, es liegt ein Fenster ganz oder teilweise darüber, oder eine darzustellende Seite wurde noch nie auf dem Bildschirm angezeigt.

Wenn das alles funktioniert hat man quasi einen sehr funktionellen und gut aussehenden PageControl oder auch allgemeinen SeitenPicker mit angenehmer Navigation.

Liebe Grüße aus Bochum
Peter

Der schöne Günther 21. Okt 2013 13:33

AW: PagePicker
 
Hallo -

Kannst du vielleicht ein Bild anhängen damit jeder sehen kann, was gemeint ist?

Kraisel 21. Okt 2013 17:20

AW: PagePicker
 
Im iPhone Safari aufrufen, und die PageListe ansehen. Aber das ist für das Problem ohne Belang.

Hier die Kurzfassung: Wie bekomme ich eine Komponente oder auch Form, so wie sie auf dem Bildschirm aussieht, in eine Bitmap?

Liebe Grüße

DeddyH 21. Okt 2013 19:13

AW: PagePicker
 
Hast Du schon GetFormImage versucht?

Kraisel 22. Okt 2013 00:43

AW: PagePicker
 
Hallo,

GetFormImage kannte ich in der Tat nicht. Nun, damit bekommt man die gesamte Form, leider aber ohne Windows-Rahmen, in eine Bitmap. Gehts nun auch irgendwie mit Komponenten innerhalb einer Form?

Liebe Grüße aus Bochum

Perlsau 22. Okt 2013 02:23

AW: PagePicker
 
Wie wär's damit:
Delphi-Quellcode:
procedure TForm1.AppFormKopieren;
Var
  Bitmap: TBitmap;
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;

  Try
    Canvas.Handle := GetWindowDC(0);
    Try
      Bitmap            := TBitmap.Create;
      Bitmap.Width      := Self.Width;
      Bitmap.Height     := Self.Height;
      Bitmap.PixelFormat := pfDevice;
      BitBlt(Bitmap.Canvas.Handle, 0, 0, Self.Width, Self.Height, Canvas.Handle, Self.Left, Self.Top, Bitmap.Canvas.CopyMode);
      Img_Kopie.Picture.Bitmap.Assign(BitMap);
    Finally
      BitMap.Free;
    End;
  Finally
    ReleaseDC(0, Canvas.Handle);
    Canvas.Free;
  End;
end;
Img_Kopie ist ein TImage, das zum Testen auf der Form liegt ... Du kannst auch gleich den Dateinamen mitgeben und das Bitmap abspeichern. Und für einzelne Komponenten machst du das dann ebenso, natürlich mit entsprechender Umrechnung der Koordinaten, die sich bei Komponenten ja auf das jeweilige Parent beziehen.

Quelle

sx2008 22. Okt 2013 02:43

AW: PagePicker
 
Nimm mal die Procedure aus diesem Thema (Posting #4)
http://www.delphipraxis.net/159466-d...roupboxen.html

jaenicke 22. Okt 2013 05:53

AW: PagePicker
 
Zitat:

Zitat von Kraisel (Beitrag 1232626)
Eine Kopie mit BitBlt schlägt fehl, da die Handle der Komponenten keine Handle auf Canvas sind.

Wenn die Komponente eine Eigenschaft Canvas hat, kann man Canvas.Handle benutzen.

Zitat:

Zitat von Kraisel (Beitrag 1232677)
GetFormImage kannte ich in der Tat nicht. Nun, damit bekommt man die gesamte Form, leider aber ohne Windows-Rahmen, in eine Bitmap. Gehts nun auch irgendwie mit Komponenten innerhalb einer Form?

Das macht die Methode, nur sind die Komponenten noch gar nicht da, wenn sie noch nicht sichtbar sind. Da das unter Windows oft nur Wrapper um die nativen Windows Komponenten sind (z.B. bei TButton), bekommt Delphi deren Aussehen nicht solange sie nicht initialisiert sind.

Kraisel 26. Okt 2013 15:26

AW: PagePicker
 
Hallo,

wie jaeneke mitgeteilt hat, muss man quasi alles Sichtbare einmal kurz auf den Bildschirm "malen", dann, z.B. wie perlsau (von Danial. W) gepostet hat, in eine Bitmap kopieren, und dann entsprechend weiterverarbeiten.

PaintTo, wie im Link von sx2008 angedeutet, funktioniert deutlich besser, da hier auch gezeichnet wird, wenn die zu zeichnende Komponente NICHT sichtbar ist.

Korrektur: Die vorherige Aussage stimmt wohl nur bei verdeckten Fenstern. Ein unsichtbares TabSheet eines PageControl wird z.B. nicht gezeichnet. Dies muss man vorher (kurz) einschalten.


Vielen Dank an alle, die sich beteiligt haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz