![]() |
Delphi 2007: GlassFrame
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
Ich habe ein Problem mit Delphi 2007 und der handhabung mit dem Glasseffekt. Also ich möchte das komplette Fenster durchsichtig machen. Ist ja auch nicht schwer, im OI einfach GlassFrame.Enabled auf true und SheetOfGlass ebenfalls auf true. Aber jetzt habe ich Probleme mit den Komponenten. Soweit ich weiß muss man ja die Eigenschaft DoubleBuffered von allen Komponeten, die auf dem Glass liegen im FormCreate auf true setzten. Auch das ist kein Problem. Obwohl ein compilierter Button ziemlich blöd aussieht. (siehe Bild) Aber labels haben die Eigenschaft DoubleBuffered ja garnicht und werden auf dem Form später auch garnicht angezeigt. (Siehe Bild) Was mach ich denn da falsch? Ich habe schon Beispiel Programme gesehen, da sah das besser aus. |
Re: Delphi 2007: GlassFrame
Hallo,
Du musst DoubleBuffered auch beim Form direkt einstellen. Gruß xaromz |
Re: Delphi 2007: GlassFrame
Liste der Anhänge anzeigen (Anzahl: 1)
ah, das label ist jetzt da, aber der button sieht immer noch nicht gerade schön aus. Da ist so ein kleiner weißer Rahmen drumherum.
Hab ich da auch noch eine einstellung vergessen? :gruebel: |
Re: Delphi 2007: GlassFrame
hat keiner eine Idee wie ich diesen kleinen weißen rahmen um den button wegbekomme :?:
bild ist in meinem letzten beitrag. |
Re: Delphi 2007: GlassFrame
nimm einfach einen speedbutton!!
|
Re: Delphi 2007: GlassFrame
Also ich weiß nicht ob das klappt aber mein Gefühl hat eben grad zu mir gesagt: "Wenn der Button nach dem Form.Doublebuffered = true nen Rand hat dann stell Doublebuffered beim Button auf false!"
Natürlich reden Gefühle auch manchmal Schwachsinn aber du kannstes ja mal probieren ;) :mrgreen: |
Re: Delphi 2007: GlassFrame
Ich habe irgendwie das selbe Problem.
Habe einen Button auf einem Panel [welches kein glass ist]. Auf dem Panel habe ich ein TImage als Hintergrund. Nur leider hat mein Button wenn er Doublebuffered = true ist immer einen schwarzen Rand. Jemand noch eine Idee? Ohne Doublebuffered hat die Schrift keine richtige Farbe under Rand ist weiss. :( |
Re: Delphi 2007: GlassFrame
Du musst den Button von Hand mit (dem langsamen) GDI+ Zeichnen, da du mit der GDI (ohne Plus) keinen Alphakanal hast, der für den Glass-Effekt unbedingt notwendig ist.
Ich habe vor ein paar Monaten mal etwas herumgespielt und dabei kam das heraus. Sieht zwar noch nicht 100%-tig richtig aus, aber definitiv besser.
Delphi-Quellcode:
uses
Types, UxTheme, DwmApi; type TExtendedButton = class(TButton) private FSheetOfGlassControl: Boolean; protected procedure WndProc(var Message: TMessage); override; published property SheetOfGlassControl: Boolean read FSheetOfGlassControl write FSheetOfGlassControl; end; procedure DrawBuffered(Control: TWinControl; var Message: TMessage; TransparentBorderSize: Integer); var DC, MemDC: HDC; PS: TPaintStruct; PaintBuffer: HPAINTBUFFER; R: TRect; begin DC := BeginPaint(Control.Handle, PS); try PaintBuffer := BeginBufferedPaint(DC, PS.rcPaint, BPBF_COMPOSITED, nil, MemDC); if PaintBuffer <> 0 then begin Control.Perform(WM_ERASEBKGND, MemDC, MemDC); Control.Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT); if TransparentBorderSize > 0 then begin GetWindowRect(Control.Handle, R); OffsetRect(R, -R.Left, -R.Top); BufferedPaintSetAlpha(PaintBuffer, @PS.rcPaint, 0); InflateRect(R, -TransparentBorderSize, -TransparentBorderSize); BufferedPaintMakeOpaque(PaintBuffer, @R); end else BufferedPaintMakeOpaque(PaintBuffer, @PS.rcPaint); EndBufferedPaint(PaintBuffer, True); end; finally EndPaint(Control.Handle, PS); end; end; { TExtendedButton } procedure TExtendedButton.WndProc(var Message: TMessage); begin if (Message.Msg = WM_PAINT) and SheetOfGlassControl and DwmCompositionEnabled then DrawBuffered(Self, Message, 1) else inherited WndProc(Message); end; { TForm1 } procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin if GlassFrame.Enabled and GlassFrame.SheetOfGlass then begin { Do not paint the background because this will cause every control to have a Self.Color border. } with TMessage(Message) do Result := DefWindowProc(Handle, Msg, WParam, LParam); end else inherited; end; |
Re: Delphi 2007: GlassFrame
Hmm. Ich habe den Code eben mal getestet, aber funktionieren tut er nicht. Aufjedenfall hat sich nichts verändert.
Was ich noch anmerken wollte, komischerweise funktionierte es alles in Turbo Delphi ohne Probleme. Nun in Delphi2007 wird werder der Label korrekt angezeigt, wenn die option transparent = true steht, noch eben der button korrekt [ohne rahmen] angezeigt. :( |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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