Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Form2 in Form1 verkleinert darstellen
draco - Do 06.01.11 23:55
Titel: Form2 in Form1 verkleinert darstellen
Hallo,
ich habe gerade angefangen ein kleines Präsentationsprogramm für Texte zu erstellen.
Das Programm besteht aus 2 Formularen, eins zum Steuern der Präsentation und eins das die Präsentation auf dem 2.Monitor anzeigt.
Um dem Bediener einen kleinen gefallen zu machen würde ich jetzt gerne in dem Steuerungsformular eine verkleinerte Version von dem Präsentationsformular einblenden.
Wie macht man das am geschicktesten? Hatte es mal mit einem Frame probiert, allerdings wurde dort durch verkleinern nur der Ausschnitt des Frames verkleinert und nicht die komplett ansicht.
Gruß
Tom
Tilman - Fr 07.01.11 00:34
Angenommen du willst ein Bild von Form2 machen, und es in einer Paintbox in Form1 anzeigen, dann kannst du das so machen:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.SpeedButton1Click(Sender: TObject); begin paintbox1.Canvas.CopyRect(form1.paintbox1.ClientRect,form2.Canvas,form2.ClientRect); end; |
So bekommst du Form2 (allerdings ohne Titelleiste und so). Das kann man auch irgendwie bekommen, glaube mittels getDC oder so. Aber vielleicht reicht's ja so.
//edit: ne, getWindowDC wars. Damit kannst du ein Handle bekommen, das du einem TCanvas-Objekt zuweisen kannst, dann bekommst du das gesamte Fenster. :)
draco - Fr 07.01.11 00:40
Ok, danke!
Das probiere ich bei Gelegenheit mal aus und gucke wie das von der Geschwindigkeit her ist, für den Anfang dürfte es aber reichen.
Bergmann89 - Fr 07.01.11 00:54
Hey,
wenn du Form2 1 zu 1 in Form1 darstellen willst, dann kannst du die Parent-Eigenschaft von Form2 auch auf Form1 setzen:
Delphi-Quelltext
1:
| Form2.Parent := Form1; |
Dann wird Form 2 vom System aus auf dem Client von Form 1 gezeichnet und man kann sie trotzdem noch ganz normal benutzen. Wenn du Form2 dann wieder freigeben willst einfach die Parent-Eigenschaft auf
nil setzen.
MfG Bergmann.
BenBE - Fr 07.01.11 07:30
Zusätzlich kann man via GDI die Viewport-Settings des Canvas auf dem Form2 gezeichnet wird so anpassen, dass eine Koordinaten-Transformation stattfindet. Man also z.B. 10kPx horizontal zeichnen kann, das aber auf dem Bildschirm nur 1kPx sind; ohne selbst rechnen zu müssen. Siehe Dokumentation der GDI bzw. der Window Viewports.
Auf Grund der Sateliten-Verbindung, über die ich im Death Valley grad surfe, verzichte ich aber mal darauf, im MSDN Lib nachzugucken, wie die Funktion genau heißt (Google-Ping ~2000ms). Kann ich aber ggf. nach meinem Urlaub nachholen.
jaenicke - Fr 07.01.11 08:25
Ich habe gerade keine Zeit nachzuschauen, aber hier ist auf jeden Fall der richtige Einsprungspunkt in die Doku:
http://msdn.microsoft.com/en-us/library/dd145104(v=VS.85).aspx
SetWorldTransform gibt es da, das müsste es schon sein, und wenn du links über die Kategorien weiterschaust, findest du auch noch viele andere Funktionen. Damit sollte sich sowas machen lassen was
BenBE geschrieben hat.
draco - Sa 08.01.11 23:20
Ok, danke!
Werde mir das mal durchlesen und ausprobieren, bei Problemen schreie ich hier einfach nach Hilfe :D
Bergmann89 - So 09.01.11 03:18
Hey,
ich hab das ganze grad eben mal ausporbiert, weil ich mich auch dafür interessiere, aber iwie haut das noch nich so ganz hin:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var m: XForm; h: THandle; e: Cardinal;
m.eM11 := 0.5; m.eM12 := 0.0; m.eM21 := 0.0; m.eM22 := 0.5; m.eDx := 0.0; m.eDy := 0.0; h := GetDC(Handle); if not SetWorldTransform(h, m) then begin e := GetLastError; Caption := 'Error '+IntToStr(e); end else Caption := 'SUCCESS'; |
Damit sollte ja die Form jetzt 50% kleiner dargestellt werden, aber SetWorldTransform wird nicht erfolgreich ausgeführt und die Caption ist 'Error 0' (ERROR_SUCCESS --> The operation completed successfully.) Jmd ne Idee woran das liegt?
MfG Bergmann
jaenicke - So 09.01.11 04:52
Du hast den Eintrag in der Doku nicht bis zum Ende gelesen. ;-)
| Zitat: |
| The SetWorldTransform function will fail unless the graphics mode for the given device context has been set to GM_ADVANCED by previously calling the SetGraphicsMode function. [...] |
Direkt auf ein Formular habe ich das bisher allerdings nicht angewendet. ;-)
Bergmann89 - So 09.01.11 05:48
Hey,
jetzt werden die Funktionen korrekt ausgeführt, aber an der Darstellung hat sich nich wirklich was geändert, alles wie vorher.
MfG Bergmann.
bummi - So 09.01.11 11:46
Häng den Code mal ins OnPaint des Forms rein....
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| var m: XForm; h: THandle; e: Cardinal; begin Canvas.Ellipse(10,10,100,100); m.eM11 := 0.5; m.eM12 := 0.1; m.eM21 := 0.0; m.eM22 := 0.5; m.eDx := 0.1; m.eDy := 0.0;
h := Canvas.Handle; SetGraphicsMode(h,GM_ADVANCED); h := Canvas.Handle; if not SetWorldTransform(h, m) then begin e := GetLastError; Caption := 'Error '+IntToStr(e); end else Caption := 'SUCCESS'; Canvas.Ellipse(10,10,100,100);
end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!