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