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 Transparente TEdit auch mit XPManifest (https://www.delphipraxis.net/83062-transparente-tedit-auch-mit-xpmanifest.html)

kurt 26. Dez 2006 18:06


Transparente TEdit auch mit XPManifest
 
Hallo NG,
weiß einer von Euch Profis (ich leider noch nicht) wie man auch mit Einsatz von
XPManifest in D7 zum Beispiel TEdit Componenten transparent gestalten kann ?
Das Überschreiben von WMEraseBkGnd und Co. funktioniert leider mit XPManifest nicht.

Wäre ganz nett - Danke
Kurti

madas 19. Mär 2009 17:40

Re: Transparente TEdit auch mit XPManifest
 
Ich schließe mich dieser Frage an. Alle Beispiele die man findet sind nur für Forms ohne das
Xp Manifest geeignet (für die Forms habe ich schon eine funktionierende Variante).

Also wie kriegt man das ganze für Forms mit Xp Manifest hin?

Vielen Dank.

MfG

DeddyH 19. Mär 2009 18:13

Re: Transparente TEdit auch mit XPManifest
 
Und wenn man das Theming für Edits deaktiviert, funktioniert es dann?

madas 20. Mär 2009 13:27

Re: Transparente TEdit auch mit XPManifest
 
Zitat:

Zitat von DeddyH
Und wenn man das Theming für Edits deaktiviert, funktioniert es dann?

Wenn du mir verräts wie das geht, dann könnte ich das mal versuchen.
Bedingung wäre natürlich, dass das Theming für alle Edits deaktiviert wird.
Weiterhin sollte es auch ohne Zusatzkomponenten möglich (Thememanager).

Vielen Dank.

madas

jaenicke 20. Mär 2009 13:44

Re: Transparente TEdit auch mit XPManifest
 
Ich weiß ja nicht wie du es ausprobiert hast, das hast du ja nicht genau verraten. Aber abgesehen davon, dass unter Vista der Hintergrund im Edit etwas verschoben ist funktioniert das hiermit z.B. schon:
http://www.delphi3000.com/articles/article_3576.asp?SK=

madas 20. Mär 2009 14:59

Re: Transparente TEdit auch mit XPManifest
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, die Komponente habe ich auch schon durch.

Naja und das Ergebnis hat mit Transparenz nicht viel zu tun (siehe Anhang).

rollstuhlfahrer 20. Mär 2009 15:12

Re: Transparente TEdit auch mit XPManifest
 
HI,

so wie ich das Ergebnis sehe, egibt sich für mich folgende Frage: Muss das unbedingt ein TEdit sein? Wenn nicht, nimm einfach ein TLabel und setze Transparent auf true. Dann kannst du auch noch zum editieren sagen: Beim Doppelklick auf das Label soll ein Edit kommen, in dem man den Wert des Labels aktualisiert. Somit wäre das Problem einfach umgangen.
Wenn ja, kann ich leider keine Lösung bieten

Bernhard

EDIT: Speichere deine Bilder bitte direkt im Forum per Anhang ab. Dann kannst du sie als noch per [img] anzeigen. Wir sind dann nicht mehr auf die ImageHack-Server angewiesen.

madas 22. Mär 2009 13:52

Re: Transparente TEdit auch mit XPManifest
 
Zitat:

Zitat von rollstuhlfahrer
HI,

so wie ich das Ergebnis sehe, egibt sich für mich folgende Frage: Muss das unbedingt ein TEdit sein? Wenn nicht, nimm einfach ein TLabel und setze Transparent auf true. Dann kannst du auch noch zum editieren sagen: Beim Doppelklick auf das Label soll ein Edit kommen, in dem man den Wert des Labels aktualisiert. Somit wäre das Problem einfach umgangen.
Wenn ja, kann ich leider keine Lösung bieten

Bernhard

EDIT: Speichere deine Bilder bitte direkt im Forum per Anhang ab. Dann kannst du sie als noch per [img] anzeigen. Wir sind dann nicht mehr auf die ImageHack-Server angewiesen.

Ja es muss ein TEdit sein.

So ich glaube ich habe jetzt eine Lösung für ein Form mit Xp-Manifest:

Delphi-Quellcode:
unit TransEdit;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Graphics;

type
  TTransEdit = class(TEdit)
  private
    { Private declarations }
    procedure SetTransparent(Value: Boolean);
    function GetTransparent: Boolean;
  protected
    { Protected declarations }
    procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
  public
    { Public declarations } 
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations } 
    property Transparent: Boolean read GetTransparent write SetTransparent default False;
  end;

procedure Register;

implementation

{ TTransEdit } 

uses
  Forms, Themes;

procedure Register;
begin
  RegisterComponents('Test', [TTransEdit]);
end;

constructor TTransEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TTransEdit.Destroy;
begin
  inherited Destroy;
end;

procedure TTransEdit.SetTransparent(Value: Boolean);
begin
  if Transparent <> Value then
  begin
    if Value then
      ControlStyle := ControlStyle - [csOpaque]
    else
      ControlStyle := ControlStyle + [csOpaque];
    Invalidate;
  end;
end;

function TTransEdit.GetTransparent: Boolean;
begin
  Result := not (csOpaque in ControlStyle);
end;

procedure TTransEdit.CNCtlColorEdit(var Message: TWMCtlColorEdit);
begin
  with ThemeServices do
    if ThemesEnabled and Transparent then
    begin
      SetBkMode(Message.ChildDC, Windows.TRANSPARENT);
      DrawParentBackground(Handle, Message.ChildDC, nil, False);
      Message.Result := GetStockObject(NULL_BRUSH);
    end
    else
      inherited;
end;

end.
Wäre nett wenn das mal jemand testen würde. Einziger Nachteil von dem Edit ist,
wenn das Edit über mehrere Controls geht, flackert es ein bissel.

Aber dafür findet sich sicher auch eine Lösung. Hat jemand eine Idee, wie man
noch das Flackern beseitigen kann?

Vielen Dank.

madas

jaenicke 22. Mär 2009 14:43

Re: Transparente TEdit auch mit XPManifest
 
Also unter Vista scheint der Hintergrund des Formulars durch, wenn ich das Edit z.B. über ein Memo lege.

Gegen das Flackern habe ich einmal DoubleBuffered getestet, aber das gibt Grafikfehler, auch inkl. DoubleBuffered Fix.

madas 2. Apr 2009 07:18

Re: Transparente TEdit auch mit XPManifest
 
Zitat:

Zitat von rollstuhlfahrer
Wenn nicht, nimm einfach ein TLabel und setze Transparent auf true. Dann kannst du auch noch zum editieren sagen: Beim Doppelklick auf das Label soll ein Edit kommen, in dem man den Wert des Labels aktualisiert.

Wir haben jetzt diesen Vorschlag umgesetzt. Er macht zwar das Handling in der Anwendung ein wenig komplizierter, aber
von der Anzeige her sieht es so i.O. aus


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