![]() |
Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Hallo,
ich habe auf meinem Form ein TRichEdit zu liegen und möchte gern, dass dieses mit der Mouse gescrollt wird; und zwar auch dann, wenn es nicht den Focus besitzt. An sich habe ich das mit folgendem Codeausschnitt geschafft:
Delphi-Quellcode:
In meinem (un)fertigen Programm kommt aber WM_MouseWheel in NewWndProc() nicht an. Ich habe keine Ahnung warum und habe mir in NewWndProc() bereits einige Messages mitloggen lassen. WM_HotKey, WM_DeviceChange, WM_SysCommand z.B. kommen und lassen sich entsprechend verarbeiten. Die Bedingung Msg.Msg = WM_MouseWheel tritt nie ein, egal wie stark "ich am Rad drehe".
type
TMsgsTester = class(TForm) Log : TRichEdit; BtnNewCount : TButton; procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private procedure NewWndProc(var Msg: TMessage); end; var MsgsTester: TMsgsTester; implementation {$R *.dfm} procedure TMsgsTester.FormCreate(Sender: TObject); begin self.WindowProc:=NewWndProc; end; procedure TMsgsTester.FormShow(Sender: TObject); begin BtnNewCount.SetFocus;// <- nur zum Focus verlieren end; procedure TMsgsTester.NewWndProc(Var Msg: TMessage); begin if (not Log.Focused) and (Msg.Msg = WM_MouseWheel) then begin Log.Perform(WM_MouseWheel, Msg.WParam, Msg.LParam); end; inherited WndProc(Msg); end; end. Ich habe mir bereits die Mühe gemacht und mein doch sehr umfangreiches Programm bzgl. der Message-Behandlungsroutinen nachgebaut. Der Nachbau läuft super und ich resigniere langsam. Hat jemand eine Idee, wie ich dem Fehler auf die Schliche kommen kann? Gruß und Danke fürs Mitdenken, Alex |
AW: Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Hallo,
Warum verwendest du nicht einfach das OnMouseWheel der Form und scrollst das RichEdit, wenn es nicht den Focus besitzt?
Delphi-Quellcode:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin with RichEdit1 do if not Focused then begin if WheelDelta > 0 then Perform(WM_VSCROLL, MAKELPARAM(SB_LINEUP, 0), 0) else Perform(WM_VSCROLL, MAKELPARAM(SB_LINEDOWN, 0), 0); Perform(WM_VSCROLL, MAKELPARAM(SB_ENDSCROLL, 0), 0); Handled := True; end; end; |
AW: Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Hallo Alex,
Zarko Gajic bietet ein Stück Code an, das dir vielleicht auch helfen kann: ![]() Gruß Hawkeye |
AW: Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Danke Euch für die schnellen Antworten:
Ich hatte Form.OnMouseWheel bereits am Start. Allerdings würde ich gern das Scrollverhalten von TRichEdit 1:1 kopieren. Dazu gehört eben auch, dass es langsam anfängst zu scrollen und das scrollen auch wieder langsam endet. Das scrollen wirkt damit weicher. Wenn ich die Message WM_MouseWheel wie in meinem Code-Ausschnitt einfach durchreiche, kann ich genau das erreichen. Während WM_VScroll einfach "nur" scrollt. Der Benutzer soll den Eindruck haben, das TRichEdit hätte den Focus. Mit TApplicationEvents hatte ich bislang noch nicht gearbeitet, werde mir das aber mal ansehen. Ich hatte auch schon probiert, mir einfach die Integer-Werte der Ereignisse in meinem laufenden Code anzeigen zu lassen und dann so zu senden. Dann bekomme ich aber einen Stack-Überlauf in TControl.WndProc() ... Irgend etwas muss doch ausgerechnet WM_MouseWheel in der WindowsProc() "verschlucken". Was mich nur wundert, ist der Umstand, dass mein Programm sonst ohne Probleme läuft und TRichEdit super scrollt, wenn es den Focus hat. Genau das würde ich gern ergründen. [edit] Während das funktioniert,
Delphi-Quellcode:
bekomme ich hiermit (auch) den Stack-Überlauf
procedure TForm1.NewWndProc(var Msg: TMessage);
const ScrollUp = $00780000; ScrollDown = -$00780000; begin if (Msg.Msg = WM_MouseWheel) then case Msg.WParam of ScrollUp : Log.Perform(WM_MouseWheel, ScrollUp, makeLParam( Mouse.CursorPos.X, Mouse.CursorPos.Y)); ScrollDown : Log.Perform(WM_MouseWheel, ScrollDown, MakeLParam( Mouse.CursorPos.X, Mouse.CursorPos.Y)); end; inherited WndProc(Msg); end;
Delphi-Quellcode:
[/edit]
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); const ScrollUp = $00780000; ScrollDown = -$00780000; begin if WheelDelta > 0 then Log.Perform(WM_MouseWheel, ScrollUp, makeLParam( Mouse.CursorPos.X, Mouse.CursorPos.Y)); if WheelDelta < 0 then Log.Perform(WM_MouseWheel, ScrollDown, MakeLParam( Mouse.CursorPos.X, Mouse.CursorPos.Y)); end; Alex |
AW: Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Zitat:
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); begin if Msg.message = WM_MOUSEWHEEL then begin Handled := True; SendMessage(RichEdit1.Handle, WM_MOUSEWHEEL, Msg.wParam, Msg.lParam); end; end; |
AW: Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Ich habe die Lösung gefunden :duck:
Ich suche seit mehreren Tagen nach der Lösung und hatte auch ![]()
Delphi-Quellcode:
Als ich im Code von Zarko Gajic gerade eben das TApplicationEvents gelesen hatte, fiel es mir wie Schuppen von den Augen. Da die beiden vermutliche etwas miteinander zu tun haben, scrollt das genauso smooth; stimmt!
procedure TChat.Create(Sender: TObject);
begin Application.OnMessage:=MessageHandler; ... end; procedure TChat.MessageHandler(var Msg: tagMSG; var Handled: Boolean); begin if (Msg.message = WM_MouseWheel) and (not Log.Focused) then begin Log.Perform(Msg.message, Msg.wParam, Msg.lParam); Handled:=True; end; end; Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz