[Delphi] Ist ein bestimmtes Objekt unter der Maus?

Dalai

Grand Admiral Special
Mitglied seit
14.06.2004
Beiträge
7.420
Renomée
262
Standort
Meiningen, Thüringen
Hey Leute,

ich komme mal wieder nicht weiter...
Ich bin grade dabei, eine Funktion zu schreiben, die mir einen Boolschen Wert zurückgibt, ob sich die Maus über einem bestimmten, dabei aber beliebigen Objekt befindet.
Um das näher zu erläutern, schreibe ich mal, was ich bis jetzt habe:

Code:
function blub(Objekt: TForm): Boolean;
var 
  Maus_Pos: TPoint;
begin
  Result:= False;
  Windows.GetCursorPos(Maus_Pos);  //Maus-Position lesen
  //befindet sich die Maus auf der X-Achse innerhalbs des Objekts?
  if ((Maus_Pos.x > Objekt.Left) AND (Maus_Pos.x < Objekt.Left + Objekt.Width)) then
  begin
    //befindet sich die Maus auf der Y-Achse innerhalbs des Objekts?
    if ((Maus_Pos.y > Objekt.Top) AND (Maus_Pos.y < Objekt.Top + Objekt.Height)) then
    begin
      Result:= True;   //Wenn beides zutrifft, dann ist die Maus über dem Objekt
    end;
  end;
end;

Diese Funktion nimmt aber nur Objekte vom Typ TForm entgegen.
Wie kann ich es erreichen, dass ich der Funktion ein beliebiges Objekt übergeben kann (also auch TLabel, TButton usw)?
Geht das mit dem Handle des entsprechenden Objekts? Wenn ja, wie komme ich dann an die Eigenschaften des Objekts ran, also Höhe, Breite usw?
Gibts evtl. schon eine derartige Funktion?

Ich danke euch im Voraus für eure Hilfe/Mühe.
Dalai
 
Zuletzt bearbeitet:
Schau Dir mal die Win-API-Funktion WindowFromPoint() an.
 
Über die Funktion bin ich schon gestolpert, aber ich merke erst jetz, dass mir die was nützen kann ;-)

Ich hole mir also mit dieser Funktion das Handle des Objekts, aber wie mache ich dann weiter?
Wie komme ich an die Eigenschaften des Objekts ran bzw. wie kann ich prüfen, ob sich das gewünschte Objekt (das Objekt, was meiner Funktion übergeben wird) unter der Maus befindet?
 
Code:
function blub(Objekt:TControl): Boolean;
var 
  Maus_Pos: TPoint;
begin
  Result:= False;
  Windows.GetCursorPos(Maus_Pos);  //Maus-Position lesen
  //befindet sich die Maus auf der X-Achse innerhalbs des Objekts?
  if ((Maus_Pos.x > Objekt.Left) AND (Maus_Pos.x < Objekt.Left + Objekt.Width)) then
  begin
    //befindet sich die Maus auf der Y-Achse innerhalbs des Objekts?
    if ((Maus_Pos.y > Objekt.Top) AND (Maus_Pos.y < Objekt.Top + Objekt.Height)) then
    begin
      Result:= True;   //Wenn beides zutrifft, dann ist die Maus über dem Objekt
    end;
  end;
end;

wird aufgerufen mit
blub(Form1 as TControl);
blub(Button as TControl);
blub(Edit as TControl);

Das dürfte die einfachste Lösung sein *fg*
 
Und was ist, wenn das Fenster von einem anderen Fenster verdeckt wird?;) WindowFromPoint() beachtet solche Fälle, Dein Code nicht. Kann natürlich sein, dass das für Dalai unwichtig ist.

@Dalai: Sorry, ich kann kein Delphi, aber geht mit Delphi nicht sowas in der Art: CWnd wnd = new CWnd(hWnd); ? Also dass man eine TForm (oder was auch immer) an ein vorhandenes Fensterhandle hängt, statt ein neues Fenster zu erzeugen?
 
@TiKu:
Und was ist, wenn das Fenster von einem anderen Fenster verdeckt wird? [...]
Kann natürlich sein, dass das für Dalai unwichtig ist
Richtig, das ist unwichtig für mich.
Ich will oder besser muss gezwungenermaßen selbst einen MouseWheelDown/-Up-Handler schreiben, damit ich ein beliebiges Objekt scrollen kann. Das soll es aber nur tun, wenn sich die Maus über diesem Objekt - das nicht unbedingt den Fokus hat (!) - befindet.

aber geht mit Delphi nicht sowas in der Art: CWnd wnd = new CWnd(hWnd); ? Also dass man eine TForm (oder was auch immer) an ein vorhandenes Fensterhandle hängt, statt ein neues Fenster zu erzeugen?
Das gibt mir auch nur ein Handle zurück. Aber ich weiß nicht, wie ich von diesem Handle dann auf die Eigenschaften des Objekts komme.


@Antarctica:
wird aufgerufen mit
blub(Form1 as TControl);
blub(Button as TControl);
blub(Edit as TControl);

Das funktioniert schon wunderbar.

Jetzt gibt es nur noch ein Problem: Wie berechne ich die absoluten Left und Top-Werte des Objekts in Relation zum aktiven Formular? Denn die Left-/Top-Werte des Objekts beziehen sich ja nur auf die Form, wenn dieses auch der Parent ist, nicht jedoch, wenn zb. ein Panel der Parent eines Frames ist und ich die Position des Frames haben will...
 
Ich habe eine Lösung gefunden:

Code:
function blub(Objekt_Handle: THandle): Boolean;
var
  Maus_Pos: TPoint;
  Handle2: THandle;
begin
  Result:= False;
  Windows.GetCursorPos(Maus_Pos);  //Maus-Position lesen
  Handle2:= WindowFromPoint(Maus_Pos);  //Handle des Objekts unter der Maus lesen
  //Wenn die Handles identisch sind, dann muss wohl die Maus über dem
  //gewünschten Objekt sein
  if (Handle2 = Objekt_Handle) then
    Result:= True;
end;
 
@ TiKu: Ich danke dir. Du hattest den richtigen Riecher.

@Antarctica: Danke auch dir. Vielleicht kann ich so etwas später nochmal gebrauchen.

CU Dalai
 
Zurück
Oben Unten