AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 2007: GlassFrame

Ein Thema von Xzeer · begonnen am 18. Jul 2007 · letzter Beitrag vom 1. Aug 2008
Antwort Antwort
Benutzerbild von Xzeer
Xzeer

Registriert seit: 6. Jul 2007
106 Beiträge
 
#1

Delphi 2007: GlassFrame

  Alt 18. Jul 2007, 11:24
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.
Miniaturansicht angehängter Grafiken
form_n_570.jpg   form_c_161.jpg  
Marvin
Xzeer
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Delphi 2007: GlassFrame

  Alt 18. Jul 2007, 11:29
Hallo,

Du musst DoubleBuffered auch beim Form direkt einstellen.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Xzeer
Xzeer

Registriert seit: 6. Jul 2007
106 Beiträge
 
#3

Re: Delphi 2007: GlassFrame

  Alt 18. Jul 2007, 11:33
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?
Miniaturansicht angehängter Grafiken
button_100.jpg  
Marvin
Xzeer
  Mit Zitat antworten Zitat
Benutzerbild von Xzeer
Xzeer

Registriert seit: 6. Jul 2007
106 Beiträge
 
#4

Re: Delphi 2007: GlassFrame

  Alt 24. Jul 2007, 17:44
hat keiner eine Idee wie ich diesen kleinen weißen rahmen um den button wegbekomme

bild ist in meinem letzten beitrag.
Marvin
Xzeer
  Mit Zitat antworten Zitat
Mark90
(Gast)

n/a Beiträge
 
#5

Re: Delphi 2007: GlassFrame

  Alt 8. Aug 2007, 21:12
nimm einfach einen speedbutton!!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: Delphi 2007: GlassFrame

  Alt 8. Aug 2007, 21:15
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Jonas

Registriert seit: 6. Feb 2005
266 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Delphi 2007: GlassFrame

  Alt 1. Aug 2008, 20:58
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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Delphi 2007: GlassFrame

  Alt 1. Aug 2008, 21:35
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;
  Mit Zitat antworten Zitat
Jonas

Registriert seit: 6. Feb 2005
266 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Delphi 2007: GlassFrame

  Alt 1. Aug 2008, 22:56
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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