Es gibt dafür ja mehrere möglichkeiten. Ich brauche das ganze aber so das es die Transparenten Teile von Bildern mit Transparent macht. Deshalb kann ich das schonmal nicht mit Regionen machen die dann ausgeblendet werden. (Mir bekannte möglichkeit Nr. 1 fällt weg). Wenn ich die Transparenz der Form erzeuge indem ich in Form1.OnCreate die Brush Style auf Clear setzte funktioniert das nur teilweise. Da tritt das Problem auf das er beim Bewegen des Formulars die Transparenten Teil nicht sofort aktualisiert.
So schwer kann das aber denke ich nicht sein
hm,
wo wir einmal dabei sind,
wie kann ich ein Formular Bewegen in dem ein anderes Element als TitelLeiste dient? Ich hatte dazu mal ein Tutorial wo das ganze mit ein paar Zeilen ging,... nur finde ich das nicht mehr. Und das ganze per Hand über OnMouseMove zu machen ist finde ich nicht gerade toll
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Entweder hab ich dich nicht ganz verstanden, oder Du machst einen Fehler (tippe eher auf ersteres, da ich die Nacht durch Videoabend mit Freunden gemacht hab bis vor 10min).
Wieso kannst du keine Regionen verwenden? Musst dann doch nur die Region so erstellen, dass sie auch die Transparenten Teile der Images nicht enthält.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Nach Möglichkeit würde ich auch sagen, dass du es über Regionen versuchen solltest. Das ist einfach der beste Weg. Aber wenn es tatsächlich nicht geht, dann bleiben dir nur 2 Möglichkeiten.
1. Du schießt ein Bild von deinem Bildschirm und zeichnest das dann in ein Fenster. Und das andere Alles drüber ist ja klar. So macht das der Acrobat Reader 6 mit seinem Splashscreen.
Diese Methode geht aber auch nur, wenn das fenster nicht so superlange da ist und sich nichts an deinem Windows änder. (also eher unbrauchbar)
2. Du musst bei jedem verschieben deines Fenster das Fenster neu Zeichen. mit Brush bsClear. So wie du es jetzt schon machst. Du musst dann nur noch die Message WM_MOVE überschreiben.
Allerdings weiß ich jetzt auch nicht, wie sich das verhält wenn sich ein Fenster unter deinem Fenster verhält. Das dürfte sich ja da auch nicht updaten. Also müsstest du das ncht nur im WM_MOVE sondern eigentlich immer also in einer Schleife machen.
Eine andere Möglichkeit ist mir jetzt nicht bekammt um Fenster aus seiner 4 eckigen Form zu bringen.
das mit dem Fenster bewegen klappt schonmal, das ist genau das was ich gesucht habe gibts so nen einfachen weg auch fürs Größe ändern?
Ich würds ja auch über Regionen machen aber er nimmt dabei einfach die Transparenz der Bilder nicht mit. Und die Regionen nochmal extra auf die Transparenten bereiche der einzelnen Bilder anpassen halte ich für zu aufwändig.
Das ganze beim verschieben jedesmal komplett neu Zeichnen sollte eigentlich funktionieren.
Wenn ich das Fenster habe und es minimiere und wieder maximiere passen sich die Transparenten Bereiche dem neuen Hintergrund wieder an. Wenn ich jedoch einfach mit dem Timer Form.repaint aufrufe paßt sich da gar nix an...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Bei einem Einfachen Repaint kann so etwas passieren. Da zeichnet er das Fenster nur neu er macht aber intern ein (WM_)EraseBackground. Versuch mal invalidate. Damit sollte es klappen.
Zum Größe Verändern gibt es ein Event vom Formular (OnResize).
Kannst du evtl mal ein Bildposten wo man sehen kann, ob sich nicht doch eine Region anbietet. Die müsste ja nur einmal gemacht werden und so etwas könnte man ja auch als Function machen. Also, dass er sich de scheiß selber zusammensucht.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Die Regionen der Transparenten Bereiche kann man doch recht leicht mit ner Funktion erstellen:
-per Scanline die Pixel des Bitmaps auslesen
-ist die Farbe des Pixels = transpranter Farbe dann region erzeugen und mit bisheriger Region kombinieren
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Zum Größe Verändern gibt es ein Event vom Formular (OnResize).
Das bringt nicht viel wenn das Form als BorderStyle bsnone hat und man erst gar nicht das Resize starten kann
Ich brauchte das mit der Transparenz halt einfach für mein Skin System. Um es mit regionen zu machen müßte man jeden Pixel jedes Bildes wo Transparenz drin ist beim laden des Skins aus der Sichtbaren Region raus schneiden. Das kann recht schnell zu sehr Komplexen Regionen führen...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hattest du nicht was von Größe ändern gesagt? Na ja. Egal.
Okay. Bei vielen Bildern ist das auch so eine Sache. Das wirde ein wenig schwieriger.
Evtl könnte man alles was nicht transparent ist ein Bild werfen und hätte dann eine Bild in dem Alles transparente schwarz und alles andere Weiß wäre aber das wäre wohl auch ein übertrieben.
Beim C# Builder kann man für eine Form eine transparente Farbe einstellen. Man kann durch alle Flächen dieser Farbe hindurchsehen und klicken. Das geht sogar soweit, wenn man weiß eingestellt hat, dann ist der Hintergrund einen RichEdit durchsichtigt und wenn man nicht genau einen Buchstaben erwischt, dann klickt man auf das Fenster dahinter. Also muß man das in Windows irgendwie einstellen können.
also bleibt wohl nix anderes als Stundenlang durch die win32sdk Hilfe zu wühlen Aber erstmal probier ich das mit dem Invalidate.
und nochmal weißt jemand eine möglichkeit zum Größte ändern des Formulars über Komponenten? Also so das als wenn ich an den Rand einer normalen Form klicke... . Wenns geht genauso einfach wie das Verschieben
Registriert: Mo Mai 27, 2002 16:29 Beiträge: 77 Wohnort: Düsseldorf
Der Windows-Befehl mit dem das geht, heißt SetLayeredWindowAttributes:
Zitat:
The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.
BOOL SetLayeredWindowAttributes( HWND hwnd, // handle to the layered window COLORREF crKey, // specifies the color key BYTE bAlpha, // value for the blend function DWORD dwFlags // action ); Parameters hwnd Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created. crKey Pointer to a COLORREF value that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro. bAlpha Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque. dwFlags Specifies an action to take. This parameter can be one or more of the following values. Value Meaning LWA_COLORKEY Use crKey as the transparency color. LWA_ALPHA Use bAlpha to determine the opacity of the layered window..
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Seit Delphi 7 geht das auch, und deine Form hat zwei Eigenschaften namens TransparentColor und TransparentColorValue, die wohl genau das machen was du bräuchtest.Under D6 gibts diese allerdings noch nicht.
hab diese funktion mal ausprobiert,
funktioniert an sich gut. Nur stört es wirklich das dann alles dieser Farbe Transparent ist. Kann man das dann nicht für bestimmte Komponenten abstellen?
Außerdem funzt es nicht mit OpenGL. Die Frames brechen extrem ein wenn das aktiviert ist.
Also werde ich es wohl doch mit ScanLine machen müssen.
Ich hab ScanLine bis jetzt aber nur mit nem PByteArray benutzt. Nur hab ich jetzt keine Lust für die ganzen Pixel Formate die Umkonvertierung in TColor Werte zu machen - Wie kann ich ScanLine direkt so benutzen das er mir TColor Werte ausspuckt?
Mitglieder in diesem Forum: 0 Mitglieder und 13 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.