ProgressBar zum Lautstärke regeln!



  • Hallo,

    Ich will eine ProgressBar als Lautstärkeregler benutzen. Nun will ich mit der Maus die Eigentschaft ProgressBar::Position verändern.

    Überlegung (Mit Frage versehen):

    bool changing=false;
    
    [i]ProgressBar::OnMouseDown[/i]
    changing=true;
    int StartX=X; //X-Wert der Maus Position merken! (Ursprungspunkt)
    
    [i]ProgressBar::OnMouseMove[/i]
    if(changing){
       int EndX=X; //X-Wert des Neuen 2.Punktes speichern!
       int diff=StartX-EndX; //X-Achsenverschiebung (Differenz)
       diff=  //Wie wird jetzt in einen "POSITION-Wert" umgerechnet?
    
       if(StartX>EndX) //Wenn nach Links verschoben wurde
         ProgressBar->Position-=diff;
       else //Es wurde nach Rechts oder garnicht verschoben
         ProgressBar->Position+=diff;   
    }
    
    [i]ProgressBar::OnMouseUp[/i]
    changing=false;
    

    Vielen Dank im Voraus!

    mfg
    cb



  • Warum nimmst du keinen TrackBar?



  • das sieht doch hübscher aus mit trackbar. 👍
    hab mal ein winamp mod gesehn, dass nur aus touchscreen elementen bestand 🕶

    [edit] irgendwie bin ich heut durchn wind [edit]



  • int Range = ProgressBar->Max - ProgressBar->Min; // Bereich in POS. Werten (%?)
    int Step = ProgressBar->Width / Range; // Bereich in Pixeln
    
    diff /= Step; // Differenz von POS. zu Pixeln
    
    // oder in einer Zeile
    
    diff /= ( ProgressBar->Width / (ProgressBar->Max - ProgressBar->Min) );
    

    hoff da sind jetzt nicht wieder x fehler drin..

    [edit] eben doch [/edit]



  • Hallo,

    ne also das funzt noch nicht wirklich :DD Wenn ich jetzt versuche die Position der ProgressBar mit Hilfe der Maus zu verändern (Startwert=50 Max=100), ist es egal in welche Richtung ich diese bewege, der Positions-Wert nimmt ab bis zu 0 und fertig.

    Weiß jemand Rat?

    mfg cb



  • poste nochmal dein aktuellen code bitte



  • Hallo,

    hier der aktuelle Code: (Vol = ProgressBar, und Variablen StartX EndX und changing im Header deklariert!)

    void __fastcall TfrmPlayer::VolMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    changing=true;
    StartX=X; //X-Wert der Maus Position merken! (Ursprungspunkt)
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmPlayer::VolMouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    changing=false;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmPlayer::VolMouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    if(changing){
       EndX=X; //X-Wert des Neuen 2.Punktes speichern!
       int diff=StartX-EndX; //X-Achsenverschiebung (Differenz)
       diff /= ( Vol->Width / (Vol->Max - Vol->Min) );
    
       if(StartX>EndX) //Wenn nach Links verschoben wurde
    	 Vol->Position-=diff;
       else //Es wurde nach Rechts oder garnicht verschoben
         Vol->Position+=diff;  
    }
    }
    //---------------------------------------------------------------------------
    

    mfg
    cb



  • OK also ein Fehler behoben! Jetzt gehts nach rechts und links, jedoch sehr rupig und auch teils verzögert. Außerderm kommt wenn ich als Max-Wert 1000 und Position auf 500 setzte, bei der ersten Bewegung Fehler wegen Division durch Null!:

    void __fastcall TfrmPlayer::VolMouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    changing=true;
    StartX=X; //X-Wert der Maus Position merken! (Ursprungspunkt)
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmPlayer::VolMouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    changing=false;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmPlayer::VolMouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    if(changing){
       EndX=X; //X-Wert des Neuen 2.Punktes speichern!
       int diff=StartX-EndX; //X-Achsenverschiebung (Differenz)
       diff /= ( Vol->Width / (Vol->Max - Vol->Min) );
       Vol->Position-=diff;
    }
    }
    //---------------------------------------------------------------------------
    

    mfg
    cb



  • folgendes:
    meine rechnung hatte nen Fehler
    die pixel-pro-step muss man durch die anzahl pixel teilen, war grad verkehrt rum.
    die zero division natürlcih abfangen
    die startpos musste nach jedem move auf die aktuelle pos setzten

    EndX = X; 
       diff=EndX-StartX; 
       step = ( ProgressBar1->Width / (ProgressBar1->Max - ProgressBar1->Min) );
       if( diff != 0 )                    //<--- Hier
    		diff = step/diff;     //<--- Hier
       Label1->Caption = IntToStr( diff );
       ProgressBar1->Position+=diff;
       StartX = X;                        //<--- Hier
    

    ein problem hab ich noch, das verhältniss stimmt nicht..
    in welcher einheit sind die X/Y koordinaten der mouse? Sind das nicht pixel?



  • Hallo,

    Gute Frage! In der Hilfe steht zur Point-Struktur nur:
    Stellt ein geordnetes Paar von x- und y-Koordinaten als Ganzzahlen dar, das einen Punkt in einem zweidimensionalen Raum definiert.

    mfg cb



  • 1310-Logik schrieb:

    in welcher einheit sind die X/Y koordinaten der mouse? Sind das nicht pixel?

    Ja, das sind Pixel.


Anmelden zum Antworten