Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()

  Alt 6. Sep 2010, 16:40
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
Alex Winzer

Geändert von Schwedenbitter ( 6. Sep 2010 um 17:04 Uhr)
  Mit Zitat antworten Zitat