AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()

Ein Thema von Schwedenbitter · begonnen am 6. Sep 2010 · letzter Beitrag vom 6. Sep 2010
Antwort Antwort
Schwedenbitter

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

Wie Fehler suchen: WM_MouseWheel nicht in WindowProc()

  Alt 6. Sep 2010, 15:35
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:
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.
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".

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
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

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

  Alt 6. Sep 2010, 15:49
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;
Thomas
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 6. Sep 2010, 15:53
Hallo Alex,

Zarko Gajic bietet ein Stück Code an, das dir vielleicht auch helfen kann: klick

Gruß Hawkeye
  Mit Zitat antworten Zitat
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
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

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

  Alt 6. Sep 2010, 17:32
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.
So scrollt es nach meinem Empfinden genau so "smooth":

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;
Thomas
  Mit Zitat antworten Zitat
Schwedenbitter

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

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

  Alt 6. Sep 2010, 17:34
Ich habe die Lösung gefunden
Ich suche seit mehreren Tagen nach der Lösung und hatte auch das hier bereits angesehen. Ich hatte mich wohl vom Suchen des Controls blenden lassen und damit das hier nicht hinbekommen:
Delphi-Quellcode:
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;
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!

Danke
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 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