Entwickler-Ecke

Windows API - MouseWheel - Drehrichtung


M. Raab - Mo 21.04.03 14:41
Titel: MouseWheel - Drehrichtung
Hallo NG,

irgendwas mache ich falsch :nixweiss:


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:
{------------------------------------------------------------------}
{  Message-Behandlung des Programs festlegen                       }
{------------------------------------------------------------------}
function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
begin
  case (Msg) of
    WM_MOUSEWHEEL:
      begin
        if Drehrichtung>HIWORD(wPARAM) then
          begin
            Drehrichtung:=HIWORD(wPARAM);
            skalar:=skalar-0.05;
            form1.normierung;
            result:=0;
          end;
        if Drehrichtung<HIWORD(wPARAM) then
          begin
            Drehrichtung:=HIWORD(wPARAM);
            skalar:=skalar+0.05;
            form1.normierung;
            result:=0;
          end;
      end;
    WM_CREATE:


Die Variabel DREHRICHTUNG ist global und auf 120 gestellt. Ich möchte damit vergrössern bzw. verkleinern, je nachdem in welche Richtung das Rad gedreht wird. Problem nun: wenn ich die Maus um einen Zacken dreh (egal in welche Richtung) funktioniert das. Ab dann ist schluss und die Grafik fängt an zu zittern - sie vergrössert sich 1x und verkleinert sich dann wieder um 1x. Es scheint so zu sein, als ob ich nicht richtig auf das Richtungereignis reagiere.

Verknüpfe ich das mit einem Tastaturereignis (Cursor rauf oder runter) klappt alles. Ist aber unschön. Kann mir jemand helfen, auf das Wheel-Richtungsereignis richtig zu reagieren ?

Gruss und Danke


Markus


wulfskin - Mo 21.04.03 22:10

Hallo!

Ich blick dein Quelltext net, ganz. Egal, ich versuch dir trotzdem zu helfen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    WM_MOUSEWHEEL:
      begin
        if HIWORD(wParam) then
          skalar := skalar - 0.05
        else
          skalar := skalar + 0.05;
        form1.normierung;
        Result := 0;
      end;
Und was geht das jetzt genau nict, oder klappt das?

Gruß wulfskin!


M. Raab - Mi 23.04.03 13:16

Hallo,

bei Deinem Vorschlag bekomme ich ne Meldung: Ausdruck muss BOOELAN sein. Das liegt am: HIWORD(wParam)

Ich habe den Text jetzt wie folgt geändert:



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
begin
  case (Msg) of
    WM_MOUSEWHEEL:
      begin
        if HIWORD(wPARAM)>0 then
          begin
            skalar:=skalar-0.05;        <-  Drehrichtung nach Vorne
            form1.normierung; 
            result:=0;
          end else begin
            skalar:=skalar+0.05;       <-  Drehrichtung nach Unten
            form1.normierung;
            result:=0;
          end;
      end;
    WM_CREATE:


Der Werst SKALAR ist nur ein Vergrösserungs-/Verkleinerungsfaktor. Mit der Funktion FORM1.NORMIERUNG normiere ich dann die Daten neu und zeichne sie neu. Wenn ich den Text so lasse, reagiert alles auf das Mausrad recht gut. Aber nur in eine Richtung: er verkleinert jetzt alles nur (d.h. SKALAR:=SKALAR-0.05). Wenn ich in den APIs lese, steht da was von 120 als Normwert und von positiver und negativer Abweichung - je nach Drehrichtung des Rades. Irgendwie klappt aber das Feststellen der Drehrichtung bei mir nicht.

Kannst DU helfen ?


Gruss


Markus


wulfskin - Mi 23.04.03 19:31

Hallo Herr Raab ;)!

Es lag nur an einem kleinen Fehler, nämlich der Typumwandlung. Du musst speziell angeben, dass es sich um ein SmallInt handelt, da es sonst keine negativen Werte gibt.
Hier ein Beispiel, was nun auch berücksichtig, wie "weit" gedreht wurde:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Delta: SmallInt;
begin
  [...]
    WM_MOUSEWHEEL:
      begin
        Delta := HIWORD(wParam);
        if Delta > 0 then
          begin
            skalar:=skalar - 0.05 * Delta / WHEEL_DELTA;
            result:=0;
          end else begin
            skalar:=skalar + 0.05 * Delta / WHEEL_DELTA;
            form1.normierung;
            result:=0;
          end;
      end;
Gruß wulfskin!


M. Raab - Do 24.04.03 11:21

Hallo


Vielen DANK - klappt jetzt super. :D

Kleine Ursache, große Wirkung.

Gruss


Markus