![]() |
Delphi-Version: 5
AlphaBlend auf normale Controls
Heyho ;)
Ich habe auf meiner Form mehrere Controls, genauer gesagt abgeleitete Panels, die ich gerne langsam ausblenden möchte. Also nicht einfach Panel.Visible := false; sondern fließend. Bei der Form an sich geht das ja mit AlphaBlend, kann man dieses Konzept auch auf normale Komponenten anwenden? Wenn ja, wie? Gibts evtl ne andere Möglichkeit, AlphaBlend quasi zu simulieren? Hoffe jmd kann mir helfen, danke im voraus! :) LG |
AW: AlphaBlend auf normale Controls
Soweit ich weiß geht das mit den WinForms leider nicht. Selbst die Glass-Komponenten von TMS funktionieren nicht so wie man es sich denkt.
|
AW: AlphaBlend auf normale Controls
Mhm, das wäre natürlich schade ...
Aber die Form macht das doch mit AlphaBlend auch. Wenn die das kann muss sie es ja irgendwie machen (immerhin werden dabei ja auch die Controls transparent), das heißt doch das es eigentlich eine Möglichkeit geben muss ... Bei Bitmaps gehts ja (wenn ich mich nicht irre auch) ... hmmm ... Gibts evtl ne Möglichkeit, das zu simulieren wenn der Hintergrund einfarbig ist, und man dessen Farbe kennt? |
AW: AlphaBlend auf normale Controls
sieh dir mal
![]() |
AW: AlphaBlend auf normale Controls
Du kannst nur Controls transparent bekommen die nicht von TWincontrol abgeleitet sind.
Hier kannst Du beliebige Controls basteln, diese können aber niemals Parent anderer Controls sein. |
AW: AlphaBlend auf normale Controls
Du kannst sehr wohl Panels Transparent faden.
Vorrausgesetzt es ist eine von dir eigens erstellte Komponente in NONVCL Ich habs gemacht und funktioniert sehr gut.. gruss |
AW: AlphaBlend auf normale Controls
@EWeiss
hey, lässt Du mal einen Fetzen Code rüberwachsen?:-D |
AW: AlphaBlend auf normale Controls
Erstmal danke für die zahlreichen Antworten!
@ WM_Close: Das ganze sieht genau nach dem aus, was ich brauche. So Sachen wie AnimateWindow(Panel.Handle,200,AW_Center or AW_Hide); funktionieren auch super, es gibt aber ein Problem: AW_Blend kann nur auf top level windows angewendet werden, also auf Windows ohne Parent. Aber wie kann ich nen Panel auf die Form zeichnen, ohne nen Parent anzugeben?? mhmmm ... @ EWeiss: Was kann ich denn in eigenen Panels einstellen, das ich nicht durch Ableitung eines bereits vorhandenen Panels ergänzen kann? @ Bummi: /sign, bin ich auch dafür! :) |
AW: AlphaBlend auf normale Controls
Zitat:
Kann dir aber bei bedarf meinen Code zusenden bzw.. müßtest du von meinem Server runterladen. Bild sieht nicht so gut aus das Forum hier konvertiert den Kram nach .JPG Zitat:
Zitat:
Delphi-Quellcode:
EffectPanel := TSkinPanel.Create(hMain, SK_FOLDER + 'Panel.png', '', 643, 48, 158, 366, ID_EFFECTPANEL, 0); SetAnchorMode(EffectPanel.Handle, ANCHOR_RIGHT); SetZorder(EffectPanel.Handle, HWND_TOP); PanelEffectHandle := EffectPanel.Handle;
Delphi-Quellcode:
gruss
constructor TSkinPanel.Create(hOwner: HWND; FullpathImageName: string;
skLabel: PAnsiChar; x, y, xW, yH, ButID, StateMax: integer); var wc: TWndClassEx; zClass: PAnsiChar; begin with SkinEngine do begin zClass := SKPANEL; wc.cbSize := SIZEOF(wc); IsInitialized := GetClassInfoEx(skInstance, zClass, wc); if IsInitialized = False then begin wc.cbSize := SIZEOF(wc); wc.style := CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS or CS_PARENTDC; wc.lpfnWndProc := @PanelProc; wc.cbClsExtra := 0; wc.cbWndExtra := EXTEND_EXTRA * 4; wc.hInstance := skInstance; wc.hIcon := 0; wc.hCursor := 0; wc.hbrBackground := 0; wc.lpszMenuName := nil; wc.lpszClassName := zClass; wc.hIconSm := wc.hIcon; if RegisterClassEx(wc) <> 0 then IsInitialized := True; end; if IsInitialized = True then begin // Erstelle das GDIPLUS image von Datei Img := AddResource(PAnsiChar(FullpathImageName)); if Img <> 0 then begin // Hole die Thumb GDIPLUS image größe GetImageSize(Img, imgW, imgH); Style := WS_CHILD or WS_VISIBLE or WS_TABSTOP; FHPanel := CreateWindowEx(WS_EX_TRANSPARENT, SKPANEL, '', Style, x, y, xW, yH, hOwner, ButID, skInstance, nil); if FHPanel <> 0 then begin if StateMax < 1 then StateMax := 1; // Speichere das Image Handle in die Property SetImageProperty(FHPanel, PROP_STYLE, BS_GROUPBOX); SetImageProperty(FHPanel, PROP_IMAGE_BACK, Img); SetImageProperty(FHPanel, PROP_STATEMAX, StateMax); end else // Image löschen wenn Fehler DeleteResource(Img); end; end; end; end; |
AW: AlphaBlend auf normale Controls
Was passiert bei dem Code, wenn ich unter dem transparenten Panel einen Button platziere? Ich habe bisher noch nirgends gesehen, dass ein Panel wirklich transparent dargestellt werden kann -- wenn das funktionieren würde wäre das echt genial für eine Komponente von mir...
|
AW: AlphaBlend auf normale Controls
Ich habe gerade nicht die Zeit es zu testen, aber gehe ich Recht in der Annahme dass das ganz funktioniert wie mein Kram
![]() Die Komponenten reichen die Malroutine durch an das Hauptfenster und das sieht ähnlich aus wie dieser Code?
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
var DestPoint, srcPoint:TPoint; winSize:TSize; DC : HDC; blendfunc : BLENDFUNCTION; Owner : HWnd; curWinStyle:Integer; p:TGPPen; g:TGPGraphics; exStyle:Dword; begin if not Assigned(Fbackimage) then Exit; prep; DC := GetDC(0); try winSize.cx := width; winSize.cy := Height; srcPoint.x := 0; srcPoint.y := 0; DestPoint := BoundsRect.TopLeft; exStyle := GetWindowLongA(handle, GWL_EXSTYLE); if (exStyle and WS_EX_LAYERED = 0) then SetWindowLong(handle, GWL_EXSTYLE, exStyle or WS_EX_LAYERED); With blendFunc do begin AlphaFormat := 1; //=AC_SRC_ALPHA; BlendFlags := 0; BlendOp := AC_SRC_OVER; SourceConstantAlpha := 255 - FAlphaValue; // here you can set Alpha end; UpdateLayeredWindow(Handle, DC, @DestPoint, @winSize, Fbackimage.Canvas.Handle, @srcPoint,FSheetColor, @blendFunc, 2);//=ULW_ALPHA finally ReleaseDC(0, DC); end; end; |
AW: AlphaBlend auf normale Controls
Zitat:
Es bleibt Transparent da ändert sich nix. Auf meinem Bild kannst sehen das die Button NONVCL ebenfalls Transparent sind im Rechten Panel. Dies sind Standard Button die über das integrieren eines Manifest (und der Initialisierung von InitCommonControl) überzeichnet wurden. Ohne Initialisierung bleiben sie Grau also Standard Button. Zitat:
Ist aber auch möglich das hier zu realisieren. Schick mal deinen Code und ich schau was sich machen läßt.. Ja ist kein Opensource ich weis;) |
AW: AlphaBlend auf normale Controls
Ich meinte, wenn das Panel eben einen Button überlagert. Ich habe noch keine Panels gesehen, die richtige Transparenz, auch über mehrere Ebenen (ein Panel über einem anderen etc.), darstellen konnten. Kannst du mir evtl. mal den Quelltext zukommen lassen? Würde mir das gerne näher anschauen.
|
AW: AlphaBlend auf normale Controls
Zitat:
Ansonsten schließe ich mich voll und ganz Shark an... |
AW: AlphaBlend auf normale Controls
Zitat:
Ansonsten ist die Frage doch was ist ein Panel? Im Grunde nichts anderes als ein Container für Kinder die dort abgelegt werden können. Wobei hier GroupBoxen sinnvoller wären. Das kann ein Frame ein Shape und in Delphi halt Panel genannt sein. Eigentlich kann man genausogut einen Button dafür mißbrauchen. Letztendlich nur ein aufpeppen zur übersichtlichkeit der Anwendung. (Ohne Sinn und Zweck) gruss |
AW: AlphaBlend auf normale Controls
Gibt es eine Möglichkeit an den Code deiner Komponente zu kommen? Würde mich ziemlich dafür interessieren!
|
AW: AlphaBlend auf normale Controls
Zitat:
Naja und das Projekt ist 19MB groß um also ein Funktionstüchtiges Sample zu erstellen dafü fehlt mir die Zeit. Habe das Projekt (Soundmachine) Bummi mal geschickt .. glaube ich. Und ob es das ist was du suchst weiss ich auch nicht. gruss |
AW: AlphaBlend auf normale Controls
Ein Control ausblenden ist doch gar nicht so schwer, man muss nur wissen, wie es dahinter aussieht. Ich habe das vor Ewigkeiten mal so gelöst, das ich es kurz ausblende, einen Screenshot mache, wieder einblende. Das merkt man gar nicht.
Der Rest ist kinderleicht. |
AW: AlphaBlend auf normale Controls
alzaimar: was passiert aber, wenn ich evtl. viele Ebenen mit vielen Controls haben will, die teilweise transparent sind? Das kann unter Umständen, in welchen Konstellationen auch immer, zu unschönen Nebeneffekten führen, die ich aus Prinzip schon mal vermeiden will. Daher würde mich eben besagte Lösung interessieren
Zitat:
Zitat:
|
AW: AlphaBlend auf normale Controls
Mhm okay ... meine ursprüngliche Idee das AlphaBlend-Prinzip welches die Form kann einfach auf andere Controls anzuwenden war wohl wieder etwas zu naiv ... ;)
Da mir die Kenntnisse fehlen um mir hierfür was vernünftiges zu schreiben (was anscheinend recht schwierig is, wenn ich unsere Fachleute hier richtig verstanden hab ^^), habe ich mal wieder einen Workaround entwickelt, der wenigstens das Verhalten für meine Zwecke halbwegs vernünftig simuliert: Ich erstelle ggf einfach eine neue Form in Farbe des Hintergrundes, lege diese auf den Panels ab und blende diese Form mit AlphaBlend schrittweise aus bevor ich sie wieder zerstöre. So entsteht optisch der Eindruck, als würden die Panels langsam erscheinen (also Fade-In), was für meine Zwecke an sich reicht. Das Ganze geschieht beim Wechseln des Tabs einer PageControl, d.h. im OnChange wird die Form sofort erstellt. Hier gibts aber wieder ein kleines Problem: Es funktioniert alles so wie ich es haben will, allerdings wird ein Teil dessen was sich auf dem Tab befindet erst NACH Abschluss meines Blendvorgangs eingetragen (Text der Edits und ListBoxen, alle ComboBoxen & Buttons, Border & Caption der Panels), im Gegensatz zum gesamten Rest (zB Farbe der Panels, Rest der Edits, alle Labels,Shapes etc). Ich hoffe ihr versteht was ich meine ;) Scheint mir so, als würde das dafür zuständige Ereignis irgendwie erst später aufgerufen ... Hab allerings keine Ahnung warum dann ein Teil vernünftig erscheint und ein anderer Teil nicht ... Woran kann das liegen und wie umgehe ich das? LG ;) |
AW: AlphaBlend auf normale Controls
Es könnte daran liegen, dass Dein MainForm in dem Moment möglicherweise nicht das aktive Form ist.
Evtl. zeichnen sich die Controls dann erst verzögert komplett... |
AW: AlphaBlend auf normale Controls
Daran hat es auf jeden Fall nicht gelegen, die letzte Zeile vor dem Beginn des Fades war ein
Delphi-Quellcode:
Ich hab mittlerweile mal versucht eine der betroffenen Komponenten mittels Komponente.Repaint vor dem Faden neu zu zeichnen, seltsamerweise hat sich das sogar nicht nur auf diese, sondern auch auf andere ausgewirkt, die jetzt ebenfalls richtig gezeichnet werden. Die wenigen die das nicht gemacht haben, haben noch ein einzelnes Repaint bekommen und waren damit offenbar zufrieden ... ^^
MainForm.BringToFront;
Scheint mir so, als hätte Delphi da nen kleinen Bug oder so ... |
AW: AlphaBlend auf normale Controls
Ich weiß nicht, wie die Transparenz im Formular gelöst ist. Daher mal eine Überlegung:
Vielleicht macht das TranspForm eine Art Screenshot von seinem Untergrund und bearbeitet das Bild dann. In dem Moment waren Deine Controls irgendwie noch nicht vollständig. Vielleicht bekommt das TranspForm vom MainForm bei Zeichenfunktionen eine Nachricht "He Du, hinter Dir ist was verändert". Dann macht das TransForm einen neuen Screenshot (in dem dann auch die anderen Controls inzwischen aktualisiert sind). Vielleicht ist es aber auch ganz anders... :wink: PS: Kannst ja mal interessehalber ein Label oder Panel durch einen Timer hin und her laufen lassen, wie das System damit zurecht kommt. |
AW: AlphaBlend auf normale Controls
Hab das mal getestet ... meinen beiden Forms is völlig egal ob da nen Label durchläuft, solange der Blendvorgang im Gange ist, ist dieses nicht zu sehen ...
Lasse ich aber kurz vorher eine von den anderen, nicht richtig sichtbaren Komponenten repainten, sieht man auch das Label. Seltsam ... ^^ |
AW: AlphaBlend auf normale Controls
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte die letzten paar Tage das gleiche Problem und hab dies mit der
![]() Bei der Benutzung in einem meiner größeren Programme gab es Zugriffsverletzungen deshalb habe ich im Anhang eine minimal verbesserte Variante von mir. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz