![]() |
Knob value wie feiner abstimmen
Jemand eine Idee wie ich mein Knob Controll noch feiner abstimmen kann?
Benutze schon single aber das scheint nicht auszureichen da beim drehen der Knobs es sehr schwierig ist die benötigte Value zu treffen. Manchmal springt es einfach 2 Frames weiter vor allem dann wenn ein ImageStrip wie bei Speed 300 Bilder enthält. Gibt es da noch was akurateres als Single?
Delphi-Quellcode:
const
KNOB_HORZ = -1; KNOB_VERT = 0; KNOB_NONE = 1; KNOB_GAP = 45 * pi / 180; KNOB_ANGLE_RANGE = 2 * pi {360°} - KNOB_GAP; KNOB_OFFSET_ANGLE = 0.5 * pi {90°, also "unten"} + 0.5 * KNOB_GAP; KNOB_IMAGE = 1; KNOB_MINVAL = 2; KNOB_MAXVAL = 3; KNOB_VALUE = 4; KNOB_MOVING = 5; KNOB_WAS_VALUE = 6; KNOB_DEFAULT_VALUE = 7;
Delphi-Quellcode:
function ValueFromAngle(Angle: single): single;
var RelativeAngle: single; begin RelativeAngle := Angle - KNOB_OFFSET_ANGLE; if RelativeAngle < 0 then RelativeAngle := RelativeAngle + 2 * pi; Result := (RelativeAngle) / KNOB_ANGLE_RANGE; if Result > 1.0 then if RelativeAngle < 0.5 * KNOB_ANGLE_RANGE + pi then Result := 1 else Result := 0 end; procedure UpdateFramePosition(WinHandle: HWND); var Img, imgW, imgH: cardinal; begin //with SkinEngine do //begin Img := SkinEngine.GetProperty(WinHandle, KNOB_IMAGE); SkinEngine.GetImageSize(Img, imgW, imgH); XOffset := FFrame mod tmax; YOffset := FFrame div tmax; dXOffset := integer(imgW) div tmax; dYOffset := 0; //end; end; procedure SetKnobLocation(WinHandle: HWND; x, y: single); var rc: TRect; Img, imgW, imgH: cardinal; begin //with SkinEngine do //begin GetClientRect(WinHandle, rc); Img := SkinEngine.GetProperty(WinHandle, KNOB_IMAGE); SkinEngine.GetImageSize(Img, imgW, imgH); tMin := SkinEngine.GetProperty(WinHandle, KNOB_MINVAL); tMax := SkinEngine.GetProperty(WinHandle, KNOB_MAXVAL); Angle := arctan2(y - rc.Bottom div 2, x - rc.Right div 2); Value := ValueFromAngle(Angle) * tMax ; FFrame := round(Value) mod tMax; UpdateFramePosition(WinHandle); SkinEngine.SetProperty(WinHandle, KNOB_VALUE, round(Value)); if Value <> SkinEngine.GetProperty(WinHandle, KNOB_WAS_VALUE) then begin SkinEngine.FUpdateWindow(WinHandle, False); SetToolTipText(WinHandle, PWideChar(IntToStr(round(Value)))); end; SkinEngine.SetProperty(WinHandle, KNOB_WAS_VALUE, round(Value)); //end; end; // Berechne die X, Y koordinaten abhängig von der aktuellen tVal procedure GetKnobLocation(WinHandle: HWND); var Img, imgW, imgH: cardinal; begin //with SkinEngine do //begin Img := SkinEngine.GetProperty(WinHandle, KNOB_IMAGE); SkinEngine.GetImageSize(Img, imgW, imgH); tMax := SkinEngine.GetProperty(WinHandle, KNOB_MAXVAL); Value := SkinEngine.GetProperty(WinHandle, KNOB_VALUE); if Value <= (tMax - 1) then begin FFrame := round(Value) mod tMax; UpdateFramePosition(WinHandle); end else begin FFrame := round(Value - 1) mod tMax; UpdateFramePosition(WinHandle); end; //end; end; // Default Value setzen procedure SetKnobDefaultValue(WinHandle: HWND; tVal: Integer); begin //with SkinEngine do //begin tMin := SkinEngine.GetProperty(WinHandle, KNOB_MINVAL); tMax := SkinEngine.GetProperty(WinHandle, KNOB_MAXVAL); if tMin > tMax then SWAP(tMin, tMax); tVal := MIN(MAX(tMin, tVAL), tMax); if tVal <> SkinEngine.GetProperty(WinHandle, KNOB_VALUE) then begin SkinEngine.SetProperty(WinHandle, KNOB_VALUE, tVal); SkinEngine.SetProperty(WinHandle, KNOB_WAS_VALUE, tVal); SkinEngine.FUpdateWindow(WinHandle, False); end; //end; end; |
AW: Knob value wie feiner abstimmen
Hab mir deinen Code jetzt nicht komplett angeschaut, aber ab und an verwende ich logarithmische Skalen und keine linearen.
Und was sind Knob Controls? :stupid: |
AW: Knob value wie feiner abstimmen
Es gibt akkurateres als Single, nämlich Double und Extended. Aber das wird dir hier nichts nützen, denn das Problem ist einfach, dass du den Mauszeiger nur in ganzen Pixelschritten bewegen kannst. Da du, wenn ich es recht in Erinnerung habe, den Bereich, indem man die Maus bewegen darf, auf den Bereich des Knobs beschränkst, hast du so nur sehr begrenzte Auswahl an möglichen Cursorpositionen. Lass dieses „Cursor-Clipping“ mal weg, dann kann man den Cursor in einem größeren Radius bewegen und hat so feinere Einstellmöglichkeiten.
|
AW: Knob value wie feiner abstimmen
Zitat:
Das ist eine Komponente in Nonvcl Siehe mein VirtualPiano gruss |
AW: Knob value wie feiner abstimmen
Zitat:
Hmm wenn ich mir das im steinberg SDK anschaue ist das extrem Akkurat. So sollte es auch bei mir sein :) Sonst bekommt der User krämpfe wenn er die Dinger drehen muss. gruss |
AW: Knob value wie feiner abstimmen
Ich habe jetzt auch nicht allzu genau auf den Code geschaut, bin aber ebenfalls von der Einschätzung her eher bei Integer-Maus-Koordinaten als bei Float-Präzision als wahrscheinlichtem Problem. Die Genauigkeit dürfte selbst bei Single sehr locker reichen. Mit einem Low-Level-Mousehook käme man an jedes Fitzelchen Mausbewegung, auch sub-pixel genau. Vielleicht wäre das was.
Eine andere Idee wäre eine non-lineare Skala, die um wahrscheinlichste Werte (z.B. den beschrifteten, oder was auch immer der Einsatzzweck so fordert) höher auflöst - da könnte man mit einer Sinusfuktion z.B. was doktorn. Dat würd aber schon recht knifflig, und könnte sich auch komisch "anfühlen" - bewusst gesehen hab ich sowas noch nicht in freier Wildbahn :) Aber man kann ja mal so philosophieren... |
AW: Knob value wie feiner abstimmen
Andere Idee der Bedienung: User muss via Klick dieses Ding aktivieren und kann dann per Mausrad noch oben und unten steuern. So kannst du im Hintergrund eine Auflösung wählen, die dir passt und das dann halt entsprechend darstellen. Klar, wenn die Änderungen bei einem Dreh am Mausrad nicht all zu groß sind, dann sieht der Nutzer nicht unbedingt viel, daher sollte vielleicht noch eine Zahlenskala dazu geklatscht werden.
Oder: man kann diesen Knob steuern, wie bisher auch, was allerdings recht grob ist. Drückt der User zusätzlich Alt/Strg/Shift dann wird etwas feiner oder gröber gesteuert. Habe ich auch schon des öfteren gesehen. |
AW: Knob value wie feiner abstimmen
denke auch normalerweise dürfte single reichen.
Aber wie gesagt das ist nicht langsam(fein) genug so das man wirklich jede Value erwischt. Teste mal das angehängte projekt ;) So sollte es sein. VST Plugin Analyser starten und die DLL(Plugin) Advanced Clipper.DLL einladen. Anschließend mal die Knobs drehen. So sollte es sein bekomme es aber nicht hin mit meinem Controll. gruss |
AW: Knob value wie feiner abstimmen
Hab
![]() |
AW: Knob value wie feiner abstimmen
Zitat:
Zahlenskala ist vorhanden einmal direkt als String so das man den Endwert immer vor Augen hat. Und beim drehen als ToolTip.. EDIT: Zitat:
Siehe Anhang so sollte es sein. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz