Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Delphi 2007: GlassFrame (https://www.delphipraxis.net/96074-delphi-2007-glassframe.html)

Xzeer 18. Jul 2007 10:24


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.

xaromz 18. Jul 2007 10:29

Re: Delphi 2007: GlassFrame
 
Hallo,

Du musst DoubleBuffered auch beim Form direkt einstellen.

Gruß
xaromz

Xzeer 18. Jul 2007 10:33

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:

Xzeer 24. Jul 2007 16:44

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.

Mark90 8. Aug 2007 20:12

Re: Delphi 2007: GlassFrame
 
nimm einfach einen speedbutton!!

Neutral General 8. Aug 2007 20:15

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:

Jonas 1. Aug 2008 19:58

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. :(

jbg 1. Aug 2008 20:35

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;

Jonas 1. Aug 2008 21:56

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 09:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz