Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi MouseEnter (https://www.delphipraxis.net/101937-mouseenter.html)

taktaky 20. Okt 2007 23:54


MouseEnter
 
Hallo

der Funktioniert bei Panel wollte stattdessen Image verwenden, geht es leider nicht !


Delphi-Quellcode:

  private
  procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;


procedure TForm1.CMMouseEnter(var Message: TMessage);
var
  ptWork : TPoint;
begin
  GetCursorPos(ptWork);
//if WindowFromPoint(ptWork) = Image1.handle then // error !!!
  if WindowFromPoint(ptWork) = Panel1.Handle then // ok
  begin
       Showmessage('hello');;
  end;
end;
Warum funktioniert bei Image1 nicht aber bei Panel1 ja ?

Flocke 21. Okt 2007 00:29

Re: MouseEnter
 
Nur Nachfahren von TWinControl besitzen ein eigenes Fensterhandle, ansonsten verwaltet die VCL das Element selbst - TPanel stammt von TWinControl ab, TImage nur von TControl.

Du kannst deinen Code so abwandeln:
Delphi-Quellcode:
if Form1.ControlAtPos(Form1.ScreenToClient(ptWork), False, True, True) = Image1 then

bitsetter 21. Okt 2007 11:42

Re: MouseEnter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ab Delphi 10 gibt es auch bei einem TImage das Ereignis onMouseEnter, ansonsten könnte man es auch selber machen. Das wäre imho die bessere Variante als es über das onMouseEnter des Formulars zu machen.

taktaky 21. Okt 2007 12:01

Re: MouseEnter
 
Hallo zusammen

der Code von @Flocke
Delphi-Quellcode:
if Form1.ControlAtPos(Form1.ScreenToClient(ptWork), False, True) = Image1 then ...
und auch der Code in Demo von Dir @bitsetter funktionieren sehr gut und genau was ich gerne wollte.

Besten Dank!

Muetze1 21. Okt 2007 12:35

Re: MouseEnter
 
Ich würde empfehlen das "Form1." in der IF Abfrage noch wegzulassen.

taktaky 21. Okt 2007 13:11

Re: MouseEnter
 
Zitat:

Zitat von Muetze1
Ich würde empfehlen das "Form1." in der IF Abfrage noch wegzulassen.

Das stimmt, "Form1" ist nicht nötig und es funktioniert ohne :thumb: :
Delphi-Quellcode:
if {Form1.}ControlAtPos(Form1.ScreenToClient(ptWork), False, True) = Image1 then ...

taktaky 21. Okt 2007 20:40

Re: MouseEnter
 
Nun habe ich ein kleines Problem

ich möchte den Cursor mit sleep() deactivieren solang er drauf bewegt

Ich möchte aber keine Zeit eingeben.

Ist das möglich ?
Delphi-Quellcode:
procedure TForm1.CMMouseEnter(var Message: TMessage);

var
  ptWork : TPoint;

begin
  GetCursorPos(ptWork);
  if ControlAtPos(Form1.ScreenToClient(ptWork), False, True) = Image1 then

  begin

    sleep(); // hier möchte ich keine Zeit eingeben
  end;
end;
Hat jemand eine Idee?

Konse 21. Okt 2007 20:49

Re: MouseEnter
 
hi

Zitat:

Zitat von taktaky
Nun habe ich ein kleines Problem

ich möchte den Cursor mit sleep() deactivieren solang er drauf bewegt

Ich möchte aber keine Zeit eingeben.

Ist das möglich ?
Hat jemand eine Idee?

nein das ist nicht möglich, damit legst du den ganzen thread schlafen.
Wenn der cursor nichts klicken soll musst du die mouseevents abfangen in diesem bereich,
sowas wie onmousemove oder onclick.
Wenn du lieber anstatt den cursor ne eieruhr haben möchtest, dann solltest du dort den cursor wechseln.


Gruß Konse

taktaky 21. Okt 2007 21:19

Re: MouseEnter
 
mouseevents schaft sowas nicht.
Ich habe fast alles erledigt, wieso ändere ich alles!

Blackheart 21. Okt 2007 21:34

Re: MouseEnter
 
Zitat:

Zitat von taktaky
Hallo zusammen

der Code von @Flocke
Delphi-Quellcode:
if Form1.ControlAtPos(Form1.ScreenToClient(ptWork), False, True) = Image1 then ...
und auch der Code in Demo von Dir @bitsetter funktionieren sehr gut und genau was ich gerne wollte.

Besten Dank!

Man beachte den Schluss vom Satz, funktionierender Code ist schon was feines :wink:
Ich konnts mir einfach nicht verkneifen - Sorry

Konse 21. Okt 2007 21:39

Re: MouseEnter
 
ich filtere alle mouseevents die noch vorhanden sind, die von den einzelnen kontrolls beinhalten meist nicht alle.
in der msdnn sind die restlichen für die mouse beschrieben, die du filtern musst.

wie gesagt ist nur ein vorschlag

Gruß Konse

PS:
Dachte du wolltest verhindern dass mit der mouse während des disabled zustandes etwas gemacht wird.

taktaky 21. Okt 2007 21:48

Re: MouseEnter
 
Zitat:

Zitat von Blackheart
...
Ich konnts mir einfach nicht verkneifen - Sorry

Der Code ist super und reagiert wesentlicher schneller als Timer
Delphi-Quellcode:
if ControlAtPos(Form1.ScreenToClient(ptWork), False, True) = Image1 then ...
Nun kommt der Teil 2 und zwar der Teil "then"

Ich möchte damit den Cursor tot machen ohne ihn ausblenden zu müssen.
Den Cursor kann man ausblenden aber der Cursor macht immer was in Hintergrund :mrgreen:

Deswegen möchte ich die sleep() verwenden

Konse 21. Okt 2007 22:15

Re: MouseEnter
 
@Blackheart
weiss nicht ob du es gelesen hast, aber es kam noch ein requirement hinzu...

@taktaky
also wenn du wirklich mit sleep deinen thread für die controlls schlafen legen willst, wie sollen generell die messages von deiner form abgearbeitet werden?

meiner meinung nach bleibt dir nichts übrig ausser die mouseevents für diese region zu filtern, bzw die region zu disablen (was auch nur die nachrichtenbehandlung für ein paar messages ausschaltet)


Falls du es mit sleep schaffst, sag mir bescheid :D

Beste Grüße
Konse

taktaky 21. Okt 2007 23:23

Re: MouseEnter
 
wie kann mit den mouseevents für diese Region (image1) filtern?
Ich möchte den Cursor nicht ausblenden sondern nur seine Wirkung tot machen.

Konse 22. Okt 2007 00:05

Re: MouseEnter
 
hi, also nochmal
wenn du die funktionalität der maus in dieser region verhindern willst, so musst du meiner meinung nach, buttons+buttonwheel deiner maus deaktivieren. diese messages werden einem windowsfenster zugeordnet. Denke in diesem fall wird die form dein window sein, wo du dein image draufhast.

D.h. du filterst deine mousemessages von der form.
In dieser filterprozedur überprüfst du ob sich dein cursor innerhalb dieser region befindet, wenn ja dann eliminierst du diese nachricht (oft mit #0, kommt aber darauf an), ansonsten nicht.

Damit kannst du mit deiner maus in deiner form alles bedienen, nur die region von deinem bild eben nicht.


Hoffe das war etwas verständlicher, ich schreibe meist etwas umständlich ;-)

Beste Grüße
Konse

ps:falls jemandem eine bessere möglichkeit bekannt ist, währe neugierig diese zu erfahren ;-)

sirius 22. Okt 2007 08:40

Re: MouseEnter
 
Du kannst mit MSDN-Library durchsuchenenablewindow Ein Fenster mit einem Schlag "inaktiv" schalten.

oder

Du arbeitest mit TApplicationevents. Speziell dann mit dem Ereignis onMessage. Dort gehen alle Messages an dein Programm durch und du kannst die Mousemessages abfangen, wenn dir danach ist:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if stopMouseMessages then
    handled:= ((msg.message>= WM_MouseFirst) and (msg.message<= WM_MouseLast));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz