Gibt es eine möglichkeit wie ich normale Komponenten wie z.B. eine einfach ListBox mit einem bestimmten Alpha Wert darstellen kann so das der Hintergrund des Forumlars durch scheint?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also bei Fenster unter Windows 2k/XP gibt es solch eine Möglichkeit. Allerdings lässt sich das auf einzelne Elemente übertragen. Du müsstest diese Elemente komplett von Hand malen und mit dem Hintergrund vermischen.
Wozu brauchst du denn das? Evtl. kann man da ein wenig tricksen und den anschein erwecken, dass es transparent sei.
Ich hab ein Hauptformular auf dem das aktuelle Hintergrundbild angezeigt wird(also nix einfarbiges ). Darauf will ich eine Komponente in die man mit Drag und Drop Dateien rein ziehen kann. Die Komponente wird ne Listbox oder ein einfaches StringGrid. Es würde insgesammt wesentlich besser aussehen wenn die ListBox bzw. das StringGrid etwas Transparent wäre so das ein Teil des Hintergrundes durch scheint...
Das mir Formularen zu realisieren ist kein Problem. Aber mit einzelnen Komponenten...
da fällt mir ein.
Problem 2 : Wenn ich ein Formular lade und auf ein anderes packe indem ich dem Formular als ParentWindow das Haupt Formular zuweise dann funktioniert AlphaBlending und Transparenz bei dem Formular was ich auf das HauptFormular packe nicht mehr... Wie kann ich machen das das funzt?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also das erste Problem könntest du mit einem DrawGrid machen. Das zeichnest du selber und macht es transparent. Allerdings das zweite Problem ist so nicht Lösbar. Dort müsstest du dann alle Komponenten inklusive Fenster selber zeichnen. Und das ist auch die Methode zu der ich dir raten würde, wenn du unbedingt Alphablending haben möchtest. Aber das sinnvollste wird sein, dass du es weglässt.
Aber mal so ne blöde Frage warum hast du eigentlich ein Hintergrundbild in deiner Anwendung?
PS: das Selbermachen eines Buttons kann man recht einfach mit einem TImage erledigen. Eine ListBox kann man selber malen. Wenn du dann den Rand noch per Hand zeichnest sollte das auch kein Problem sein. Schwierig wird es nur bei einem Edit. CheckBox (Radio) könnte man auch über TImage realisiern.
Überall wird es aber so sein, dass du es erst einmal kommplett in ein Bild malen musst. Dann mit dem Hinterdgrund mischen und erst dann darfst du es zeichnen.
Das ist aber alles sehr recheninteniv.
Ich Entwickle die komplett neue Version der Desktop Komponente der Shell Erweiterung SharpE. Das heißt der Windows Desktop wird deaktiviert und durch eine neue Anwendung ersetzt. Die Anwendung ist so groß wie der Desktop und zeigt das aktuelle Win Hintergrundbild. Die Desktop Objekte werden dynamisch aus dll Dateien geladen und auf den Desktop gelegt. Nur werden dabei alle Blend und Transparenz Effekte deaktiviert Ich muß es aber irgendwie erreichen das der Hintergrund eines jeden Desktop Objektes(also dem aus der dll geladenen Formular) Transparenz ist so das das Hintergrundbild angezeigt wird. Es wäre auch noch gut wenn AlphaBlending für die Objekte funktionieren würde.
Hätte ich eine möglichkeit ein Komponente Transparent oder mit AlphaBlending darzustellen dann wäre das kein Problem da die Formulare der Desktop Objekte auf ein TPanel im Hauptformular gelegt werden. Ich müßte also nur das TPanel Transparent bekommen...
oder halt einen komplett anderen Weg finden
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Kannst du mal ein Beispielbild von so einem Desktop posten? Also von einem mittelkomplexem? Geht das? Weil ich kann mir gerade nicht ausmalen, was auf den Elementen alles drauf ist.
Sind die Elemente eigentlich so richtig interaktiv? Also ob diese alle Funktionalitäten von den Standart Delphi Komponenten haben müssen? Also wirklich alle. Weil wenn nicht, dann könntest (solltest du sowieso) die Elemente selber erstellen und diese dann selber blenden.
hm,
ich muß das dann doch genauer erklären. Ich glaub die beschreibung als Komponente ging etwas daneben. Ich hab "SharpE Core Component" einfach frei übersetzt weil ich halt wußte was damit gemeint ist Ok, also. SharpE besteht aus mehreren Anwendungen wobei jede einen Teil des Shell Systems steuert. Alle Anwedungen sind komplett unabhängig voneinander.
Hier ein Screenshot von meinem aktuellen Desktop : http://lowdimension.net/sharpe_screen_shots/1297.jpg so siehts aus(Der Desktop ist bei mir halt nur leer). Der Hintergrund wird halt von der SharpDesk Anwendung gesteuert. Diese Code ich gerade komplett neu. Auf dem SharpE Desktop können wie unter Windows einfach Icons als Links erzeugt werden.
Hier mal noch ein anderer Screenshot wo man die Desktop Objekte der aktuellen Version sieht (oben, links) : http://lowdimension.net/sharpe_screen_shots/1819.jpg Ich erweitere das ganze nun zu einem dynamischen System. Das heißt das was auf dem Desktop an Objekten erzeugt werden kann ist dynamisch in dll's gespeichert.
In jeder dll befindet sich das Formular was einfach in die SharpDesk anwendung geladen wird. Durch das dynamische System sind halt viel komplexere Desktop Objekte möglich... Das laden und nutzen der dll's ist größtenteils schon fertiggestellt und funktioniert problemlos. Auf dem Hauptformular wird für jedes geladene Desktop Objekt ein TPanel erstellt und in dieses TPanel wird das Forumlar eines jeden Desktop Objektes hinein geladen. Da das TPanel und logischerweise das geladene Formular als Parent bzw. ParentWindow nun aber das Hauptformular der SharpDesk Anwendung besitzen werden die AlphaBlend und Transparenz werte des geladenen Objekt Formulars ignoriert. Es ist aber wichtig das die Formulare der Desktop Objekte als ParentWindow das Hauptformular der SharpDesk Anwendung bekommen da sie so an dieses Hauptformular gebunden sind und nicht frei herum schwirren . Da aber ein komplettes Formular aus der dll geladen wird und einfach nur angezeigt wird ist es recht schwierig eine Transparenz zu erzeugen so das das Hintergrundbild des Hautpformulars angezeigt wird. Würde es irgendwie funktionieren einzelnen Komponenten wie einem TPanel eine Transparenz zuzuweisen dann würde dies automatisch auf das geladene Formular übertragen werde wordurch dies auch Transparent werden würde...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Japp. Jetzt ists klarer. Aber wenn du so etwas haben willst dann müsstest du entweder solche OpenGL Komponenten benutzen oder du schreibst eigene Komponenten die das blenden. Ich fürchte das ist eines der Dinge die nicht gehen. Das Windowsblending kannst du auch nur dann nutzen, wenn es eine eigenständiges Fenster ist.
- 3th Party Komponenten
- Selber machen
- irgendwie als Fenster erzeugen. Also kein Kind von einem Fenster
- Oder auf Blending verzichten
Einen anderen Weg wird es da wohl nicht geben.
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Hallo,
keine Ahnung ob richtig liege, aber du kannst auch die Botschaft WM_ERASEBKGND der untergeordneten Fenster, die für das leeren des Fensterhintergrundes zustaendig ist, abfangen und deine eigene Hintergrundzeichenroutine aufrufen.
Die Komponente XPMenu macht dieses für viele Zeichenroutinen, um Delphiprogrammen ein XP - Style zu verpassen.
Um das mit dem Erase Background zu benutzen müßte dann aber jeden mögliche Komponenten die im Formular der Desktop Objekte benutzt wird dies unterstützen. Das ist einfach nur viel zu Aufwändig...
Das mit einer OpenGL Komponente zu mache ist denke ich auch nicht wirklich von Vorteil weil hier richtig viele Objekte Dargestellt werden und das denke ich einfach nur zu viel Leistung braucht.
Auf Blending zu verzichten würde wenns absolut nicht anders geht möglich sein. Aber auf die Transparenz zu verzichten ist absolut nicht möglich da der Hintergrund des Formulars irgendwie Transparent gemacht werden muß...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Mit EraseBackground kannst du da nichts reißen. Daran hatte ich auch schon mal gedacht. Aber dabei wird nur das neuzeichnen des Hintergrundes unterdrückt. Das kann zu häßlichen Grafikfehler führen wenn du irgendetwas darüberziehst (fenster etc).
Also wenn du da überhaupt nicht drauf verzichten kannst dann musst du das wohl oder übel per Hand machen. Allerdings wenn du da viele Objekte hast wird es einfach nur super langsam. Speziell wenn du Blending mit einbaust.
Aber für den Fall, dass du es selber machen möchtest rate ich dir auf einer recht windowsnahen Komponente auzusetzen. Also so etwas wie TWinControl oder sogar TControl. Die haben schon sehr viele Dinge implementiert so das du nur das Zeichnen und die Interaktion implementieren musst.
Ich bin gerade ernsthaft am überlegen ob ich die Formulare der Objekte nicht einfach als unabhängige nicht an das Hauptformular gebundene Objekte lade. Also einfach nur das Form laden und kein Parent Window zuweisen. Das hätte halt nur einfach den Nachteil das windows die Formulare dann als ganz normale Fenster betrachtet und lädt. Dann könnte ich aber AlphaBlending und Trasparenz uneingeschränkt verwenden.
Jetzt wo ihr die funktionsweise so halbwegs verstanden habt kann ich das sicherlich einfach so fragen :
Würde es derbe Nachteile bringen, bzw. wie schlimm wäre es wenn ich die Formulare der Objekte einfach als unabhängige Formulare lade?
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Ich würde das WM_ERASEBKGND nicht unterdrücken, sondern mir den verdeckten Teil des Hintergrundes, also vom übergeordneten Form, holen und einfach neu zeichnen.
Auch der Aufwand hält sich in Grenzen. Du schreibst eine Routine, die sich durch die Controls des zu ladenen Forms iterierst.
1. Klassische Methode:
Du holst mit GetWindowLong(hWnd, GWL_WNDPROC) die Nachrichtenfuncktion und speicherst diese. Mit SetWindowLong(hWnd, GWL_WNDPROC, NeuWndProc) kannst Du dann deine eigene Nachrichtenfunktion eintragen und die Nachricht abfangen. Bei allen anderen rufst Du die zuvor gespeicherte Funktion auf. Das ganze nennt sich Subclassing und wird bei vielen Steuerelementen von Windows so gehabt. Die VCL und XPMenu machen dieses auf diesem Weg.
2. TApplication - Methode
Keine Ahnung ob die geht, ist nur ne Idee. TApplication.OnMessage wird für jede Nachricht aufgerufen. Wenn Du das untergeordnete Formular einhängst, müßten auch die Nachrichten des Formulares abgefangen werden können, so daß Du relativ leicht an diese Infos kommst. Dann must Du nur prüfen, ob das zu zeichende Fenster nicht zu dem Hintergrundformular gehört.
Wie gesagt beides nur grob im Kopf überlegt und nicht geprüft.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich weiß nicht, ob das so gehen würde. Sobald du auf den Hintergrund klickst würden die Formulare in den selbigen rutschen und wären nicht mehr sichtbar. Bzw. Könntest du diese Formulare auch ÜBER Anwendungen ziehen. Da Fenster keiner Z-Order unterliegen. Nur selten jedenfall. StayOnTop föllt auch weg, da sie immer im Vordergrund sind.
Die kleinen Formulare bei einem Klick auf den Hintergrund wieder in den Vordergrund zu schieben würde zwar gehen würde aber in einer wilden Flackerei enden sobald auf den Hintergrund geklickt wird.
Wie ist das eigentlich derzeit gelöst? Da müsste doch das selbe problem mit deinem Hintergrund und den Anwendungen passieren, oder?
PS: MDI (wo sich Fenster in einem anderem Fenster befinden) geht auch nicht, da dort das Blending ausgeschalten wird. Ich hatte es vorhin mal ausprobiert.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.