Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Halb-durchsichtiges Panel? (https://www.delphipraxis.net/132391-halb-durchsichtiges-panel.html)

PeterPanino 11. Apr 2009 15:53


Halb-durchsichtiges Panel?
 
Hallo, wie kann man ein Panel oder ein ähnliches Objekt halb-durchsichtig machen, sodass alles was darunter liegt, wie durch einen Grauschleier sichtbar ist, also so wie disabled aussieht? Wenn dann die Farbe des Schleiers noch anpassbar wäre, so wäre das noch besser!

Frohe Ostereier an alle!

Yogu 11. Apr 2009 15:59

Re: Halb-durchsichtiges Panel?
 
Hallo,

muss die Komponente andere Komponenten beinhalten können, so wie ein Panel? Wenn ja, geht das IMHO nicht. Sonst könntest du eine von TGraphicControl abgeleitete Kompoente, wie zum Beispiel TImage verwenden. Dem Image kannst du ein Bild zuweisen, das transparent ist, unter XP geht das mit Symbolen.

Die saubere Methode wäre jedoch, selbst eine Kompontente von TGraphicControl abzuleiten, und in der Paint-Methode auf den Canvas etwas halbtransparentes zu zeichnen. Wie genau das geht, weiß ich nicht - aber sicher jemand anderes hier.

Grüße,
Yogu

PeterPanino 11. Apr 2009 16:05

Re: Halb-durchsichtiges Panel?
 
Zitat:

Zitat von Yogu
muss die Komponente andere Komponenten beinhalten können, so wie ein Panel?

Nein, sie soll nur einen Verschleierungseffekt erzeugen.

PeterPanino 11. Apr 2009 16:36

Re: Halb-durchsichtiges Panel?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab jetzt in einem Grafikprogramm ein Graubild mit 50% Transparenz erzeugt und das in TImage verwendet (s. Anhang). Es funktioniert aber nicht: Das TImage erscheint immer völlig transparent, gleichgültig ob ich die TImage-Eigenschaft Transparent eingeschaltet habe oder nicht!

turboPASCAL 11. Apr 2009 16:49

Re: Halb-durchsichtiges Panel?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Man(n) muss dann schon das richtige PNG-Format nutzen:

;)

PeterPanino 11. Apr 2009 17:01

Re: Halb-durchsichtiges Panel?
 
Zitat:

Zitat von turboPASCAL
Man(n) muss dann schon das richtige PNG-Format nutzen:

;)

Vielen Dank!

1. Mit welchem Programm hast du das gemacht?

2. Welches Format muss man benutzen?

3. Was muss man allgemein dabei beachten?

4. Problem: Es funktioniert nicht so wie ich mir das wünsche: Ich muss beim TImage die Eigenschaft Stretch auf True setzen, weil die Fenstergröße zur Laufzeit ja verändert werden kann. Und da ergibt sich ein sehr groß-pixeliges Muster:

http://img53.imageshack.us/img53/4296/bigpixel.gif

mkinzler 11. Apr 2009 17:05

Re: Halb-durchsichtiges Panel?
 
Wiederholt sich das Muster? Dann würde ich nicht stretchen sondern je nach Breite mehrere nebeneinander setzen

PeterPanino 11. Apr 2009 17:17

Re: Halb-durchsichtiges Panel?
 
Zitat:

Zitat von mkinzler
Wiederholt sich das Muster?

Ja, das ganze Bild sieht so aus.

Zitat:

Zitat von mkinzler
Dann würde ich nicht stretchen sondern je nach Breite mehrere nebeneinander setzen

Das wird nicht gehen, weil das Fenster ja sehr groß werden kann. Gibt es denn nichts, was sich dehnt, halb-transparent ist und dabei immer gleich aussieht? (Nein, ich meine eine Delphi-Komponente ;-))

mkinzler 11. Apr 2009 17:20

Re: Halb-durchsichtiges Panel?
 
Ist doch egal wie groß das Fenster wird. Ist das Bild 200 breit und das Fenster auch dann Bild einmal. ist das Fenster > 200 -> Bild 2 Mal, mehr als 400 -> Bild 3 mal usw.

PeterPanino 11. Apr 2009 17:28

Re: Halb-durchsichtiges Panel?
 
Zitat:

Zitat von mkinzler
Ist doch egal wie groß das Fenster wird. Ist das Bild 200 breit und das Fenster auch dann Bild einmal. ist das Fenster > 200 -> Bild 2 Mal, mehr als 400 -> Bild 3 mal usw.

Wie soll man denn die Bilder wiederholen? Etwa zur Laufzeit mit Create erzeugen?

mkinzler 11. Apr 2009 17:30

Re: Halb-durchsichtiges Panel?
 
Nein selber Zeichnen

Yogu 11. Apr 2009 20:07

Re: Halb-durchsichtiges Panel?
 
Versuche es mal mit einer PaintBox. Die ist von TGraphicControl abgeleitet, also könnte das folglich klappen:

Zeichne im OnPaint einfach folgendes Raster:

Delphi-Quellcode:
var i, j: Integer;
begin
  for i := 0 to PaintBox1.Width div 2 do
    for j := 0 to PaintBox1.Height div 2 do
    begin
      PaintBox1.Canvas.Pixels[i*2, j*2] := clBlack;
      PaintBox1.Canvas.Pixels[i*2+1, j*2+1] := clBlack;
    end;
end;
Das sieht zwar nicht so ganz professionell aus, weil man eben doch ein Raster erkennt, aber so geht es am einfachsten.

lbccaleb 11. Apr 2009 20:16

Re: Halb-durchsichtiges Panel?
 
Abwechselnd zeichnen kannst du so:
Delphi-Quellcode:
        for w := 0 to VISWIDTH do
          begin
            if odd(w) then
              for h := 0 to VISHEIGTH do
                if odd(h) then
                  setpixel(hdcmem, w, h, RGB(127, 127, 127));
          end;

Du musst dir das nur selber umformen, es geschrieben, um den hintergrund eines Fenster karriert zu zeichnen, also direkt in der OnPaint message...

EDIT:
Wenn du wissen willst, wie ich es angewendet hab, dann kannst du dir hier das bsp. runterladen, und direkt ansehen, so ähnlich könntest du es dann auch mit dem Panel machen!

Graph Test

PeterPanino 11. Apr 2009 21:19

Re: Halb-durchsichtiges Panel?
 
Zitat:

Zitat von Yogu
Versuche es mal mit einer PaintBox. Die ist von TGraphicControl abgeleitet, also könnte das folglich klappen:

Zeichne im OnPaint einfach folgendes Raster:

Delphi-Quellcode:
var i, j: Integer;
begin
  for i := 0 to PaintBox1.Width div 2 do
    for j := 0 to PaintBox1.Height div 2 do
    begin
      PaintBox1.Canvas.Pixels[i*2, j*2] := clBlack;
      PaintBox1.Canvas.Pixels[i*2+1, j*2+1] := clBlack;
    end;
end;
Das sieht zwar nicht so ganz professionell aus, weil man eben doch ein Raster erkennt, aber so geht es am einfachsten.

Vielen Dank, Yogu! Die PaintBox sieht zwar recht hübsch aus, aber sie wird immer HINTER den anderen Steuerelementen gezeichnet:

http://img264.imageshack.us/img264/5942/paintbox.gif

Natürlich habe ich im Designfenster der IDE die Funktion "Nach vorne bringen" für die PaintBox bzw. "Nach hinten bringen" für das andere Steuerelement verwendet, aber es half nichts. Die PaintBox soll ja nun die anderen Elemente verdecken.

Wieso wird denn nun die PaintBox hinter dem Edit gezeichnet?

lbccaleb 11. Apr 2009 21:41

Re: Halb-durchsichtiges Panel?
 
kannst du die paintbox nicht einfach auf ein panel setzen?

Yogu 11. Apr 2009 22:32

Re: Halb-durchsichtiges Panel?
 
Mist. Daran hab ich nicht gedacht.
Zitat:

Zitat von PeterPanino
Wieso wird denn nun die PaintBox hinter dem Edit gezeichnet?

Weil die PaintBox ein GraphicControl ist, und das Edit ein WinControl. Anders ist es leider nicht möglich, einen Transparenteffekt zu erzeugen.

Du kannst mit der PaintBox zum Beispiel ein Image verschleiern, oder ein Label. Aber so gut wie alles andere geht nicht. Du könntest die Methode Paint des Formulars überschreiben:

Delphi-Quellcode:
procedure TForm1.Paint;
begin
  inherited Paint;
  { ... }
end;
Im Platzhalter fügst du nun den Kariert-Code ein und änderst noch "0", "0" (die beiden Initialisierungswerte), "PaintBox1.Width" und "PaintBox1.Height" in die absoluten Koordinaten des Schleiers (siehe ClientToScreen). Ich hoffe jedenfalls, dass das klappt. :?

Wenn du noch fragen zu einzelnen Punkten haben, stell sie einfach :)

Grüße,
Yogu

Edit:
Zitat:

Zitat von lbccaleb
kannst du die paintbox nicht einfach auf ein panel setzen?

Dann ist sie aber nicht mehr transparent bzw. wendet die Transparenz nur auf das Panel an ;)

turboPASCAL 12. Apr 2009 08:35

Re: Halb-durchsichtiges Panel?
 
Gerade wieder gefunden, http://www.delphipraxis.net/internal...=384598#384598
Sollte man sich mal durchlesen etc. pp.

:stupid:

Yogu 12. Apr 2009 09:42

Re: Halb-durchsichtiges Panel?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Genial, die Eigenschaft kannte ich noch gar nicht: csOpaque. Klar, wenn man die Deckkraft abstellt, dann ist das Control transparent.

Leider zeichnet das Transparente Panel nur den Rahmen und den Caption, nicht jedoch einen transparenten Inhalt. Ich hab mal was in der Richtung versucht (siehe Anhang), aber leider ist 1. Canvas.Pixels viel zu langsam (und ich kenne nichts à la ScanLine eines Canvas'), und zweitens stimmt die Hintergrundfarbe nicht wirklich. Du kannst dir ja mal anschauen, was ich in den Zeilen 122-130 geschrieben habe, vielleicht fällt dir ja noch was ein.

Grüße,
Yogu


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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