AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Knob value wie feiner abstimmen

Ein Thema von EWeiss · begonnen am 5. Mai 2011 · letzter Beitrag vom 6. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Knob value wie feiner abstimmen

  Alt 5. Mai 2011, 22:57
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;

Geändert von EWeiss ( 5. Mai 2011 um 23:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Knob value wie feiner abstimmen

  Alt 5. Mai 2011, 23:11
Hab mir deinen Code jetzt nicht komplett angeschaut, aber ab und an verwende ich logarithmische Skalen und keine linearen.

Und was sind Knob Controls?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Knob value wie feiner abstimmen

  Alt 5. Mai 2011, 23:17
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Knob value wie feiner abstimmen

  Alt 5. Mai 2011, 23:36
Hab mir deinen Code jetzt nicht komplett angeschaut, aber ab und an verwende ich logarithmische Skalen und keine linearen.

Und was sind Knob Controls?
Ach mano ärger mich doch nicht!

Das ist eine Komponente in Nonvcl
Siehe mein VirtualPiano

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Knob value wie feiner abstimmen

  Alt 5. Mai 2011, 23:39
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.
Das habe ich schon lange entfernt also die Maus wird nicht mehr im Knob festgehalten.

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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Knob value wie feiner abstimmen

  Alt 6. Mai 2011, 00:04
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...
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Knob value wie feiner abstimmen

  Alt 6. Mai 2011, 00:23
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Knob value wie feiner abstimmen

  Alt 6. Mai 2011, 00:24
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

Geändert von EWeiss ( 9. Jul 2019 um 08:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#9

AW: Knob value wie feiner abstimmen

  Alt 6. Mai 2011, 00:25
Hab meinen Beitrag oben nochmals editiert! Hatte da noch zusätzlich eine Idee.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Knob value wie feiner abstimmen

  Alt 6. Mai 2011, 00:26
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.
Mit dem MausRad wäre eine Alternative.
Zahlenskala ist vorhanden einmal direkt als String so das man den Endwert immer vor Augen hat.
Und beim drehen als ToolTip..

EDIT:
Zitat:
Drückt der User zusätzlich Alt/Strg/Shift dann wird etwas feiner oder gröber gesteuert. Habe ich auch schon des öfteren gesehen.
Darum geht es mir ja die Frage nur wie muss mal schaun ob ich mit double da mehr erreiche.
Siehe Anhang so sollte es sein.

gruss

Geändert von EWeiss ( 6. Mai 2011 um 00:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:39 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