Einzelnen Beitrag anzeigen

Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

TForm Komponente ist schwarz wenn XPManifest verwende wird

  Alt 28. Okt 2008, 16:17
Hallo!

Ich bastel gerade an einer Eigenen Komponente, die quasi wie ein Hint funktionieren soll. Es geht um ein Image, wenn man mit der Maus darüber ist soll ein Hint-Fenster angezeigt werden. Der Hint soll recht viele Informationen strukturiert darstellen und nur für diese Komponente gelten. Daher verwende ich keinen echten Hint da sich die Informationen hier nur schlecht strukturieren lassen und für die gesamte Anwendung nur eine Hintklasse genutzt werden kann.

Ich habe mir also eine Klasse TMyHint erstellt, die ein Fenster mit den Informationen erstellt und anzeigt solange der Der Cursor über dem Image ist:

Der Hint:
Delphi-Quellcode:
type
  TMyHintForm = class(TForm)
    // Alle möglichen Komponenten für die Anzeige der Informationen
  end;

  TMyHint = class(TObject)
  protected
    FHintForm: TMyHintForm;
  public
    constructor Create(Infos: TMyHintInfos);
    procedure Show;
    procedure UpdatePos;
    procedure Hide;
  end;

implementation

constructor TMyHint.Create(Infos: TMyHintInfos);
var i: integer;
begin
  FHintForm := TMyHintForm .Create(nil);
  FHintForm.DoubleBuffered := true;

  for i:=0 to FHintForm.ComponentCount-1 do begin
    if (FHintForm.Components[i] is TWinControl) then
      TWinControl(FHintForm.Components[i]).DoubleBuffered := true
  end;

  // Informationen darstellen
  InfosDarstellen(Infos);
  ...
end;

procedure TMyHint.Hide;
begin
  FHintForm.Hide;
end;

procedure TMyHint.UpdatePos;
begin
  FHintForm.Top := Mouse.CursorPos.Y;
  FHintForm.Left := Mouse.CursorPos.X;
end;

procedure TMyHint.Show;
begin
  FHintForm.Top := Mouse.CursorPos.Y;
  FHintForm.Left := Mouse.CursorPos.X;
  FHintForm.Show;
end;

Das Image, dass den Hint anzeigen soll
Delphi-Quellcode:
type
  TMyHintImage = class(TImage)
  protected
    FMyHint : TMyHint;
    FTimer : TTimer;

    procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

    procedure TimerEvent(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

constructor TMyHintImage.Create(AOwner: TComponent);
begin
  inherited;

  FTimer := TTimer.Create(self);
  FTimer.Enabled := false;
  FTimer.OnTimer := TimerEvent;
end;

procedure TMyHintImage.TimerEvent(Sender: TObject);
begin
  FMyHint := TMyHint.Create(SomeInfos);
  FMyHint.Show;

  FTimer.Enabled := false;
  FTimer.Interval := 10000;
  FTimer.Enabled := true;
end;

procedure TMyHintImage.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  FTimer.Interval := 1000;
  FTimer.Enabled := true;
end;

procedure TMyHintImage.CMMouseLeave(var Message: TMessage);
begin
  FTimer.Enabled := false;

  if (FMyHint<> nil) then begin
    FMyHint.Hide;
    FreeAndNil(FMyHint);
  end;

  inherited;
end;

procedure TMyHintImage.WMMouseMove(var Message: TWMMouseMove);
begin
  inherited;
  if (FMyHint<> nil) then FMyHint.UpdatePos;
end;

Das funktioniert alles ganz wunderbar. Wenn ich ein TMyHintImage auf einem Form platziere, das Programm starte und die Maus 1 Sekunde über da Image halte wird das Hint Fenster mit den Informationen angezeigt. Bewege ich die Maus wird die Position des Hintfensters angepasst. Alles so wie es sein sollte.

Wenn ich das Ganze aber auf einem Form verwende auf dem auch das XPManifest genutzt wird, erscheint das Hint Fenster nur noch als schwarzes Rechteck. Alles funktioniert wie zuvor, nur dass in dem Hintfenster keine Informationen mehr zu sehen sind, weil eben alles Schwarz ist.

Was mache ich hier falsch? Wie lässt sich das umgehen?

Besten Dank
Ares
  Mit Zitat antworten Zitat