Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Mausrad aktiv nur über einer Komponente ?
realerHanno - Do 05.05.11 09:45
Titel: Mausrad aktiv nur über einer Komponente ?
Hallo,
habe trotz vieler sehr spezieller Beiträge zum MouseWheel nichts dergleichen gefunden:
Ich möchte das Mausrad nur dann aktivieren, wenn der Mauszeiger über einer Komponente steht.
Mein sehr einfacher Code, um die Radbewegung hoch-/runterzählen zu lassen, reagiert nur
auf der gesamten Form.
Ich bekomme es nicht hin, es nur
innerhalb einer Komponente (zB. Shape) reagieren zu lassen.
Doch hier erst mal der Basic-Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| ... protected procedure WndProc(var Message: TMessage); override; ... implementation
procedure TForm1.WndProc(var Message: TMessage); begin if Message.Msg = WM_MOUSEWHEEL then begin; if Message.WParam>0 then n:=n+1 else n:=n-1; Edit1.Text :=IntToStr(n); end else inherited WndProc(Message); end; |
Hier fehlt mir einfach der Gedankenblitz :idea: :?: zu einer einfachen Lösung.
Danke und Gruß
realerHanno
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 05.05.2011 um 11:04
markus5766h - Do 05.05.11 14:18
Hallo,
hab gerad' kein Delphi zur Hand, daher etwas in's blaue geschossen :
zusätzlich noch das Shape.OnMouseMove abfragen, falls ein TShape diese property besitzt.
realerHanno - Do 05.05.11 14:36
Hallo markus6766h,
natürlich hat das shape (war ja auch nur als Beispiel gedacht) die onMouseMove prop. Hiermit habe ich vergeblich gebastelt.
Weil: das OnMouseMove hat eine eigene Pozedur. Ich habe also die procedure1.ShapeOnMouseMove(..) und die procedure2.FormMouseWheel(..). Ich bin einfach zu blöd, diese beiden Prozeduren zu vereinigen (war schon immer Einzelgänger). Das ist mein MainProb.
(Achtung: die Namen der beiden Prozeduren sind zur besseren Erkennbarkeit nicht identisch mit den wirklichen Namen)
Danke trotzdem und erstmal
Vielleicht kann mir hier jemand einen Kick geben...
jaenicke - Do 05.05.11 14:44
Schau doch einfach nach, ob die Maus gerade über der Komponente ist:
Delphi-Quelltext
1:
| if PtInRect(MyShape.ClientRect, MyShape.ScreenToClient(Mouse.CursorPos)) then |
bummi - Do 05.05.11 14:54
Du brauchst ein fokusiertes Wincontrol, anbei ein Beispiel, vorzugsweise in eine eigene Komponente giessen und anpassen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TMyShape=Class(TPAnel) Private FShape:TShape; public procedure WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); message WM_MOUSEWHEEL; End; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TMyShape.WMMOUSEWHEEL(var Msg: TWMMOUSEWHEEL); begin inherited; if Msg.WheelDelta>0 then Color := clred else Color := cllime; Caption := IntToStr(Msg.WheelDelta);
end;
procedure TForm1.Button1Click(Sender: TObject); begin With TMyShape.Create(self) do begin Parent := self; left := 0; top := 0; Width := 100; height := 100; ParentColor := false; ParentBackground := false; DoubleBuffered := true; SetFocus; end; end;
end. |
realerHanno - Do 05.05.11 15:47
Hallo zusammen,
vielen Dank für die vielen Anregungen. Ich habe die von jaenicke bevorzugt, weil das die kürzeste Lösung (1 Zeile!) war.
Und weil das genau die Funktion "OnMouseOver" ist. Ist eben leider nicht so schnell zu finden...
Gruss
realerHanno
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!