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