Laden...

[erledigt] NummericUpDown + MouseWheel ++/--

Erstellt von Eddie vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.827 Views
Eddie Themenstarter:in
2 Beiträge seit 2008
vor 16 Jahren
[erledigt] NummericUpDown + MouseWheel ++/--

Hallo zusammen,

// Blumen on
ein supergeiles Forum!
// Blumen off

Hab mir jetzt lange Zeit die MSDN und weitere Zahlreiche Internetseiten angesehen, aber in keiner finde ich einen Hinweis zu meinem kleinen Problem. Vielleicht habe ich es auch gelesen und nur nicht gerafft was zu tun ist.

Ich bin gerade dabei mich in C# weiter reinzulesen. Grundlagenverständnis ist vorhanden.

Also zu meinem Prob:

__Situation:
3 x NumericUpDown
RGB (Red, Green, Blue)
Min-Wert: 0
Max-Wert: 255
Sprung: 1

__Was will ich?

  1. klick in eines der NUD-Felder
  2. MouseWheel up = NumericUpDown +1
  3. MouseWheel down = NumericUpDown -1

__Wo ist das Problem?
MouseWheel springt 12 Werte (MouseWheelDelta = 120)


.
.
.
  this.nud_Red.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.nud_Red_MouseWheel);
.
.
.
  private void nud_Red_MouseWheel(object sender, MouseEventArgs mea)
  {
    //MessageBox.Show(Convert.ToString(mea.Delta));

    int value = 1;

    if (mea.Delta > 120) // wheel up
    {
      this.nud_Red.Value = ++value;
    }
    else // wheel down
    {
      this.nud_Red.Value = --value;
    }
    Refresh();

  }

Würde gerne dieses Delta auf 1 Setzen. Klappt aber nicht. Darf es nicht überschreiben. Selbst mit protected override void ... funktioniert es nicht.

Vielen Dank für Eure Hilfe.

Lieben Gruss
Eddie

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Eddie,

beim MouseWheel-Ereignis ist es m.E. schon zu spät. Da kannst du nichts mehr ändern.

Die Schrittweite ist übrigens nicht fest 12, sondern immer SystemInformation.MouseWheelScrollLines. Allerdings kann man diese Eigenschaft nicht ändern und wenn man es könnte, würde sie wohl unerwünschterweise auf alle Programme durchschlagen.

Du könntest in NumericUpDown.ValueChanged gucken, ob sich der Wert um mehr als eins geändert hat und dann die Änderung korrigieren.

herbivore

Eddie Themenstarter:in
2 Beiträge seit 2008
vor 16 Jahren
Gelöst! NummericUpDown + MouseWheel ++/--

Hallo herbivore,

vielen Dank für deinen Hilfestellung.

beim MouseWheel-Ereignis ist es m.E. schon zu spät. Da kannst du nichts mehr ändern.

Das hatte ich bereits vermutet gehabt ...

Die Schrittweite ist übrigens nicht fest 12, sondern immer SystemInformation.MouseWheelScrollLines.

Ja, hab ich grad nachgelesen.

Der Petzold "Windows Programmierung mit C#" geht hin und berechnet in den Methoden OnMouseWheel und OnResize mit Hilfe der Methode Math.Min und Math.Max die Laufweite des Scrollens. Bei Text eine Tolle Sache ...

...würde sie wohl unerwünschterweise auf alle Programme durchschlagen.

Ist es nicht so, dass es sich nur auf das aktuelle Form bezieht? Krass.

... NumericUpDown.ValueChanged ... dann die Änderung korrigieren

Probiert und gescheitert. 😕

Habe aber zwei verschiedene Ansätze gefunden und ausprobiert:

  1. Kein MouseWheel mehr
  public class NoScrollNummericUpDown : NumericUpDown
  {

    protected override void WndProc(ref Message m)
    {

      const int WM_MOUSEWHEEL = 0x20A;

      if (m.Msg != WM_MOUSEWHEEL)

        base.WndProc(ref m);

    }

  }

Neue Klasse anlegen > Objet NoScrollNumericUpDown > Resultat > nix mehr MouseWheel. Muss gestehen dass ich diesen Ansatz (noch) nicht ganz verstehe. Keine Ahnung was da genau passiert. Kann es nur ahnen.

  1. Ansatz > LÖSUNG!

.
.
.
    this.nud_Red.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.nud_Red_MouseWheel);
.
.
.
private void nud_Red_MouseWheel(object sender, MouseEventArgs mea)
  {
    ((HandledMouseEventArgs)mea).Handled = true;

    bool up = true;

    int wheelDelta = 0;
    wheelDelta += mea.Delta;

    if (wheelDelta < 0)
    {
      up = false;
    }
    if (up)
    {
      this.nud_Red.UpButton();
    }
    else
    {
      this.nud_Red.DownButton();
    }
  }

Woher soll man denn sowas wissen? 🙂

 ((HandledMouseEventArgs)mea).Handled = true;

Da wäre ich nie drauf gekommen.

Man täuscht quasi das MouseEvent als erledigt vor und kann dann wunderbar das Rädchen zum scrollen / zum Inkrementieren/Dekrementieren um 1, innerhalb des NumericUpDown verwenden. Warum UpButton und DownButton? Hab irgendwo gelesen das innerhalb von NumericUpDown, sobald der Wert geändert wird sowieso die beiden Methoden aufgerufen werden. D.h. dass der Code von vorher mit dem --value und ++value sowieso die Button Methoden aufgerufen hätten. Somit einen Schritt gespart. Liege ich doch richtig in der Annahme oder?

Dieses Problem scheint auch schon zu MS vorgedrungen zu sein.
MS Conect - NumericUpDown

Also, nochmals Danke.

Lieben Gruss
Eddie