Einzelnen Beitrag anzeigen

madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#8

Re: Transparente TEdit auch mit XPManifest

  Alt 22. Mär 2009, 14:52
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
  Mit Zitat antworten Zitat