AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey Komponente mit Handle

Ein Thema von Kenrai · begonnen am 8. Okt 2014 · letzter Beitrag vom 9. Okt 2014
Antwort Antwort
Kenrai

Registriert seit: 4. Jun 2014
11 Beiträge
 
#1

Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 16:04
Hallo zusammen,

ich wollte einmal Fragen, ob es möglich wäre, sich eine Komponente für FMX zu erstellen, die ein Handle hat das auch verwendbar ist. Die FMX-Form hat ja auch ein Hadndle...
Im Prinzip bräuchte ich ein TPanel oder ein T3DLayer, welches ich ansprechen kann und auf diese eine Fenster zeichnen kann.

Wenn man eine FMX-Komponente mit Handle erstellen könnte wäre das optimal!
Falls dies nicht funtionieren sollte, folgende Frage:
Ich habe 2 FMX-Forms, 1 Sichtbar (Main) 1 Unsichtbar (Child).
Nun lade ich z.B. Notepad in das Unsichtbare FMX-Fenster via. windows.SetParent(wnd2, FmxHandleToHWND(Self.Handle)); Nun habe ich ein Panel/Paintbox auf meiner sichtbaren FMX-Form und darauf will ich jetzt den Inhalt der unsichtbaren Form im Panel wiederspiegeln. (Hätte überlegt den Inhalt der unsichtbaren Form in ein BMP zu laden und das dann ins Panel zu laden aber ich bin mir unsicher wie. Und wegen ruckler usw. beim Updaten).

Entschuldigung falls das alles ein bisschen wirr klingt...

Vielen Dank im Voraus!
-Eugeene
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 16:20
Ein Handle ist, so wie wir es aus der VCL kennen, ja ein Wert, der uns vom Betriebssystem - in diesem Falle Windows - geliefert wird.
Mit Sicherheit wird man sich eine FMX-Komponente basteln können, die ein Handle anfordert, letztlich braucht es dafür ja nur einen API-Aufruf von CreateWindow(). Nur ist damit klar, dass diese Komponente rein unter Windows nutzbar ist - und das widerspricht dem Konzept von FireMonkey, welches ja auf die Unabhängigkeit von konkreten Plattformen ausgelegt ist.

Aber vielleicht kommst Du damit weiter:
http://docwiki.embarcadero.com/Libra...ndleToPlatform
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#3

AW: Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 16:21
Wozu?
FMX ist unabhängig von Windows (MultiPlattform und so) und demnach gibt es da auch keine Windows-Handle.


Man könnte vielleicht ein "Handle" bereitstellen, aber hier dann natürlich kein HWND, welches dem Handle der Windows-Komponenten enspricht.
Die VCL-Komponenten haben z.B. ein TObject als "Handle" Zeiger.
k.A. womit FMX nochmal genau gezeichnet wird, aber eventuell kann man auch dort für die internen "Objekte" irgendein Handle/Zeiger bekommen.

Oder FMX verwendet doch mal wieder, je nach System, die nativen OS-Komponenten womit man dann in dem FMX-Handle-Property dann im Windows das HWND rausgeben könnte.


[edit]
@Daniel: Du meinst dann wohl das dort verlinkte FmxHandleToHWND?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Okt 2014 um 16:29 Uhr)
  Mit Zitat antworten Zitat
Kenrai

Registriert seit: 4. Jun 2014
11 Beiträge
 
#4

AW: Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 17:37
Vielen Dank erstmal ihr Zwei!

Natürlich ist das nicht der Sinn von FireMonkey, wegen Multiplatform usw...

Aber diese Anwendung benötige ich ausschließlich in Windows und das ganze ist auch in Firemonkey 3D. Natürlich könnte man das ganze auch in VCL umsetzen aber da wäre die Sache etwas umständlicher da man bei FireMonkey eben schon so viel gegeben habe was ich benötige. Das hat schon alles seine Richtigkeit so

Also falls man jetzt ein Handle "bastelt" wird man das nicht so verwenden können, wenn ich das richtig verstanden habe.
Dann werde ich es wohl anders machen müssen.... Hätte dafür jemand eine Idee?
Kontext: Ich versuche ein Fenster z.B. Notepad bei FireMonkey 3D auf ein 3DLayer zu klatschen und somit das Fenster quasi 3D im Raum zu bewegen... hört sich abstrakt an, aber man könnte es mit einem 3D Desktop vergleichen.
(Ich dachte dabei z.B. Notepad in einer unsichtbare Form abzulegen und dann immer ein Bild von dieser Form mache, dieses Bild dann auf das 3D Layer zu zeichnen und wenn man auf das Bild klickt, die Koordinaten übertragen werden und im unsichtbarem Fenster dann Notepad steuern)

Bis auf den Teil mit den Koordinaten hab ich knapp 0 Ahnung wie ich das anstellen soll In VCL wüsste ich es halbwegs aber ich brauch es ja in FireMonkey also falls da jemand Ideen hat wär das echt super!

Vielen Dank
-Eugeene
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 17:47
Das wird so nicht so einfach gehen. Selbst wenn Du eine Komponente mit Handle hättest und diese Parent von der Notepad wäre, wäre Notepad immer noch 2D welche halt den 3D-Raum überdeckt. Für Dein Vorhaben müsstest Du Screenshoots von Notepad an die 3D-Komponente "Streamen". Noch schwieriger wird es dir Klicks auf "Textur" richtig auf die eigentliche Anwendung zu übertragen.
Markus Kinzler
  Mit Zitat antworten Zitat
Kenrai

Registriert seit: 4. Jun 2014
11 Beiträge
 
#6

AW: Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 18:42
Das mit den Klicks sollte nicht all zu schwierig werden. Um die schräge raus zu rechnen gibt es Formeln.
Dass das Notepad immer noch 2D wäre das hab ich mir auch schon gedacht... deswegen meinte ich ja quasi Screenshots machen. Das ganze soll der User aber nicht mitbekommen... Notepad sollte in eine Form geladen werden, damit Notepad quasi "versteckt" ist. Das Fenster kann man ja weiterhin wie gewohnt Ansprechen... Blos wie man die Screenshots macht während die Form unsichtbar ist in der sich notepad befindet und diese Screenshots dann auf das 3DLayer überträgt, das ist mir ein Rätsel.
Falls damit jemand Erfahrung oder Vermutungen hat, wär das echt supi wenn mir jemand weiterhelfen könnte

Vielen Dank für die schnelle Hilfe!

-Eugeene
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#7

AW: Firemonkey Komponente mit Handle

  Alt 8. Okt 2014, 20:03
Die Suchfunktionen kennst du aber?

Da findet man garantiert etwas, wie man von einer Form, über deren Handle und/oder DC (device context), ein Foto macht.
Bei Google suchenscreenshot form delphi / Hier im Forum suchenscreenshot form
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Okt 2014 um 20:06 Uhr)
  Mit Zitat antworten Zitat
Kenrai

Registriert seit: 4. Jun 2014
11 Beiträge
 
#8

AW: Firemonkey Komponente mit Handle

  Alt 9. Okt 2014, 07:26
Vielen Dank für deine Rückmeldung.

Die Su-Fu kenn ich und habe ich benutzt...
Natürlich auch viel zu dem Thema gefunden, aber eben das meiste für VCL wie z.B.
Delphi-Quellcode:
Function myBMPWindowSnap(var bmp: TBitmap; windowHandle: HWND): boolean;
var rc : TRect;
    huser32 : THandle;
    F : function(Hnd: HWND; HdcBlt: HDC; nFlags: UINT): BOOL; stdcall;
begin
   Result := False;
   huser32 := GetModuleHandle(user32);
   if huser32 <> 0 then begin
     @F := GetProcAddress(huser32, 'PrintWindow');
     if @F <> nil then begin
       GetWindowRect(windowHandle, rc);
       bmp.Width := rc.Right - rc.Left;
       bmp.Height := rc.Bottom - rc.Top;
       bmp.Canvas.Lock;
       try
         Result := F(windowHandle, bmp.Canvas.Handle, 0);
       finally
         bmp.Canvas.Unlock;
         if Result and ((bmp.Width = 0) or (bmp.Height = 0))
           then Result := False;
       end;
     end;
   end;
end;
Doch leider gibts in FireMonkey sachen wie z.B. das Handle von BMP nicht...
Und wenn ich was für FireMonkey gefunden habe, dann nur für sichtbare Fenster

-Edit-
Dazu kommt, dass wenn man z.B. nur die Canvas der 2. Form erwischt, das eingeschnappte Fenster (notepad) nicht dargestellt wird, da es ja nicht wirklich auf der Canvas existiert. D.H. man müsste über das Fenster selbst (notepad) den Screenshot abgreifen. In VCL gäbe es da ein paar Sachen aber in FireMonkey bin ich da nicht so bewandert...
Falls jemand ein bereits vorhandenes Thema zu so etwas hätte das ich nicht gefunden habe, wärs super wenn einer das verlinken könnte

Geändert von Kenrai ( 9. Okt 2014 um 08:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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