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?
__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
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
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:
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.
.
.
.
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