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:
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;
bekomme ich hiermit (auch) den Stack-Überlauf
Delphi-Quellcode:
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;
[/edit]
Alex