2009-04-17 6 views
3

Aus irgendeinem Grund werden transparente Steuerelemente auf einem Formular undurchsichtig auf einigen Computern. Ich habe Berichte darüber auf einem "Acer Netbook" und einem "Thinkpad x600" erhalten. Die Anwendung wird mit Delphi gebaut 2007.Delphi: Transparente Steuerelemente werden auf Netbooks undurchsichtig

Dies ist, wie es aussieht: link

Während es sollte wie folgt aussehen: link

Die undurchsichtige Steuerelemente auf dem Formular ist TLabels und TStaticTexts.

(Ich verwende TStaticText-Steuerelemente, um anklickbare Bereiche zu definieren, da Mausnachrichten an handle-lose Steuerelemente (wie Labels) an den Handler WM_NCHITTEST gehen. Der "Button" am unteren Rand ist schwarz, weil ich versehentlich seine Farbe auf clNone festgelegt es sollte überhaupt nicht sichtbar sein.)

Warum passiert es und wie kann dies verhindert werden (außer Workarounds wie das Rendern des Textes zum Hintergrundbild)?

Edit: Ich habe es geschafft, das Problem auf meinem Laptop zu reproduzieren, der Windows XP in 32-Bit-Farbe ausführt und zertifizierte ATI-Treiber verwendet.

+1

Ich hatte ein ähnliches Problem, in IDE die Etiketten waren transparent, aber waren in der Laufzeit undurchsichtig. In meinem Fall musste ich die labels transparency property auf false setzen, Projekt speichern und dann transparent wieder in true umwandeln. Danach waren sie sowohl für die Designzeit als auch für die Laufzeit transparent. Ich benutze Delphi XE3. – drzymala

Antwort

8

Gibt es ein TImage zwischen dem TLabel und dem Formular? Wenn dies der Fall ist, legen Sie die Farbe des Formulars auf Schwarz. Wenn Sie ein TLabel auf transparent setzen, wird es auf das übergeordnete Element gezeichnet, und TImage kann keine untergeordneten Steuerelemente haben. In der Tat wird die Farbe des Formulars auf das Etikett gerendert, da das Formular das übergeordnete Element ist.

Zwei andere mögliche Umgehungslösungen gehören, das Bild direkt auf das Formular zu painting (nicht mit einem TLabel), aber ich weiß nicht, ob das funktionieren würde. Eine andere Möglichkeit wäre, ein eigenes Bildsteuerelement zu erstellen, das von TWinControl (anstelle von TGraphicControl) stammt und Untersteuerelemente enthalten kann. YMMV auf diese Lösungen obwohl.

Ich vermute, der Grund, warum es auf einigen Computern nicht funktioniert, ist die zugrunde liegende Windows-API-Bibliothek ist anders.

+0

Der erste Workaround funktionierte nicht, und ich konnte mich nicht darum kümmern, den zweiten zu machen, also hackte ich einfach herum Problem mit Ihrem Vorschlag, die Hintergrundfarbe der Etiketten zu setzen. Ich muss das gleiche für eine Anwendung mit einem nicht-soliden Hintergrund tun, also werde ich wahrscheinlich etwas schreiben, um alle Beschriftungen zu durchlaufen und sie manuell auf dem Formular zu zeichnen. –

+0

Oh, und ja, es gibt ein TImage zwischen dem TLabel und dem Formular. Beats me, warum es auf meinem Vista-Rechner und auf einem anderen XP-Rechner funktioniert, funktioniert aber nicht auf anderen XP-Rechnern ... –

3

Dies hat nichts mit der Marke des Systems als solches zu tun. In der Reihenfolge der Wahrscheinlichkeit, überprüfen Sie diese (vorausgesetzt, Sie sprechen über Windows-Systeme):

  • Transparenz erfordert die Anzeige Bittiefe 32 werden, wenn die Anzeige auf 16-Bit-Farbe eingestellt ist, können Sie‘ t zeichnen transparente Kontrollen. Benutzer fixierbar, sollten Sie Modi nicht automatisch wechseln.

  • Videotreiberproblem - stellen Sie sicher, dass die Benutzer die vom Hersteller empfohlenen Videotreiber haben. Wenn diese fehlschlagen, versuchen Sie die neuesten.

  • Transparenz (Alpha-Blending, tatsächlich) wird nur unter Windows 2000 oder höher unterstützt - Sind Sie sicher, dass sie nicht etwas älteres laufen?

Es würde viel helfen, wenn Sie mehr Daten von Ihren Benutzern bekommen (oder wenn Sie die Daten haben, können Sie es schreiben.) Wir drehen hier blind da man nicht einmal das Betriebssystem verwendet, erwähnt hat.

+3

Das TLabel bezieht sich tatsächlich auf seine Eltern und wird nicht durch Windows transparent gemacht, also glaube ich nicht, dass es ein Treiberproblem ist. Ich bin ziemlich sicher, dass das TLabel seit mindestens Delphi 3 die transparente Eigenschaft hatte, die vor Windows 2000 war). –

+0

Das ist wahr, dachte nicht, Delphi verwendet Alpha nicht für Etiketten (in diesem Fall ist es wahrscheinlich ein Treiberproblem.) Wir haben immer noch nicht genug Informationen - es kann gut sein, die 16-Bit oder palettiert Videomodus-Problem gepaart mit nicht genügend verfügbaren Farben. –

+2

Ich habe es geschafft, das Problem auf meinem Laptop zu reproduzieren, auf dem Windows XP in 32-Bit-Farbe ausgeführt wird. Es verwendet auch zertifizierte ATI-Treiber, daher denke ich, dass keiner der von Ihnen angegebenen Punkte zutrifft ... –

0

zwar nicht die perfekte Lösung, aber würde besser funktionieren bei der Behandlung Ihrer Transparenz Problem würde überhaupt keine Transparenz verwenden, legen Sie die Hintergrundfarbe des Etiketts mit dem Hintergrund übereinstimmen, dann verwenden Sie die Ausrichtung mit Margen-Eigenschaft und setzen Sie Ihre Ränder, um die Beschriftungen auf dem Formular zu positionieren.Für die nächsten Schaltflächen zum Schließen und Minimieren würde ich diese separaten Grafiken erstellen, um jegliche Schriftarten- oder DPI-Probleme zu vermeiden.

+0

Die Schließen/Minimieren-Buttons, sowie der "Weiter" -Button, werden tatsächlich auf dem zugrunde liegenden TImage gerendert .Ich verwende leere TStaticText-Steuerelemente, um Mausnachrichten zu erfassen. –

+0

Ich benutze einmal eine Hotspot-Komponente, um genau das zu tun, wonach Sie fragen. Ich bin mir nicht sicher, aber das ist die http://www.torry.net/vcl/graphics/other/amhotspot.zip .. Sie müssen vielleicht leichte Anpassungen vornehmen, um Ihre Version von Delphi zu behandeln, aber es sollte funktionieren . – skamradt

0

Ich hatte dieses Problem und es machte mich verrückt.

Meine Anwendung verwendet TLabels anstelle von TButtons. Zur Laufzeit erstelle ich TShapes, die auf das Label zugeschnitten sind. Ich habe OnMouseEnter und OnMouseLeave Ereignisse festgelegt, um die Farbe der TShape zu ändern. Es funktionierte gut auf jeder Maschine, die ich getestet habe, bis ich zu dieser XP-Installation kam, wo ich auf das Problem des OP stieß.

Ich habe endlich eine Lösung gefunden, die funktioniert.

for i := 0 to frm.ComponentCount-1 do begin 
    if (frm.Components[i] is TLabel) and 
    (((TLabel(frm.Components[i]).Tag > 999) and 
    (Length(TLabel(frm.Components[i]).Caption) > 1) and (Assigned(TLabel(frm.Components[i]).OnClick))) or 
    (TLabel(frm.Components[i]).Caption = 'Close')) then 
    begin 
     //setting this to false here, then to true at the bottom eliminates the "opaquing" problem 
     TLabel(frm.Components[i]).Transparent := False; 

     ls := TShape.Create(frm); 
     ls.Name := 'ClickLabel' + IntToStr(i) + TWinControl(frm.Components[i]).Name; 
     ls.Parent := TWinControl(frm.Components[i]).Parent; 
     ls.Hint := TWinControl(frm.Components[i]).Hint; 
     ls.ShowHint := True; 
     ls.Top := TWinControl(frm.Components[i]).Top-4; 
     ls.Left := TWinControl(frm.Components[i]).Left-7; 
     ls.Width := TWinControl(frm.Components[i]).Width + 12; 
     ls.Height := TWinControl(frm.Components[i]).Height + 8; 
     ls.Shape := stRoundRect; 
     ls.BringToFront; 
     TWinControl(frm.Components[i]).BringToFront; 
     ls.Visible := TWinControl(frm.Components[i]).Visible; 
     ls.Tag := TWinControl(frm.Components[i]).Tag; 

     ls.OnMouseEnter := EvHandler.lblNavMouseEnter; 
     ls.OnMouseLeave := EvHandler.lblNavMouseLeave; 
     ls.Anchors := TLabel(frm.Components[i]).Anchors; 

     ls.Pen.Width := 2; 

     TLabel(frm.Components[i]).Transparent := True; 
    end; 
end; 
1

Wenn TForm mit TImage und TLabel drauf ist - gibt es ein Problem mit Transparenz, ist einige Male Etikett nicht transparent, auch wenn TLabel.Transparent Eigenschaft als True angezeigt wird.

Ich habe dieses Problem mit VMWare und Windows XP/Windows 7 reproduziert. Um es geschehen zu lassen, musste ich "Windows Classic" -Thema aktivieren. Windows 7 hat Windows Aero-Design, Windows Basic und Windows Classic-Designs. Problem tritt nur auf, wenn das Thema "Windows Classic" aktiviert ist. (Windows XP hat dieses Thema auch).

Die TLabel hat bereits Transparent Eigenschaft, es ist True Standard sein. Und das Label ist transparent, außer wenn das "Windows Classic" -Thema aktiviert ist. Wenn Sie ein neues Etikett auf dem Formular platzieren, wird die Transparent -Eigenschaft als True angezeigt, aber es wird nicht angezeigt fett im Objektinspektor. Um das Problem mit der Transparenz zu beheben, müssen Sie einfach die Eigenschaft Transparent des Labels umschalten: Setzen Sie es zunächst auf False und dann zurück auf True. Dadurch wird die Transparent -Eigenschaft des Labels als True angezeigt, aber der Wert lautet bold. Oder bearbeiten Sie einfach .dfm Datei und fügen Sie Transparent = True zu allen Etiketten hinzu, die Transparenz benötigen.

Das Problem ist aktuell für Delphi 10.2 Tokyo.