Fortschrtittbalken nach MousePosition ausrichten

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von leonkurt.

    Fortschrtittbalken nach MousePosition ausrichten

    Hallo,

    Ich habe vor einen Fortschritbalken für einen Media Player zu erstellen.

    Das Wiedergabe Element ist ein AxWindowsMediaPlayer.
    Der Balken (eine Picturebox) befindet sich in einen Panel (Füllent gedockt, links und rechts sind ebenfalls Panels, ist also in der Mitte).
    Mitthilfe von einen Timer (Intervall = 1) wird bereits die Picturebox endsprechend des Fortschrittes der Mediadatei skaliert mit diesem Befehl:

    VB.NET-Quellcode

    1. Try
    2. MovBar.Size = New Size((Panel6.Width - 10) * (Player.Ctlcontrols.currentPosition / Player.currentMedia.duration), MovBar.Height)
    3. Catch ex As Exception
    4. End Try
    MovBar ist der Balken, dieser Befindet sich in Panel6, es soll 10 Pixel abstand haben vom rand, deswegen -10. Player ist der AxWindowsMediaPlayer.
    Also gild: Panel (größe - 10) * (Fortschritt in Sekunden / Max. Sekunden der Datei) = Größe des baleken in Pixel Width*Pixel Height

    Doch ich rätzele noch darüber wie man durch Maus klick die Player.Ctlcontrols.currentPosition ändert.
    Ich habe mir bereits überlegt durch ein MouseDown event den Timer anhalten und dann MousePosition als neue Size der Picturebox setzen und dann somit die currentPosition zu ändern.

    Wie bekomme ich es hin das beim MouseDown event die Picturebox.width sich bis zur Mouse ändert???
    Schmeiß mal Try / Catch / End Catch raus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hä?!

    War mein erster Gedanke... ich habe keine Ahnung was du möchtest, könntest du das ganze ein wenig präziser und strukturierter formulieren? Wäre ungemein hilfreich.
    Zuerst dachte ich du wollest deine Progressbar etc. per Mausklick festsetzen und somit zu der Stelle im Video springen.
    Dann laß ich etwas über Pictureboxen, dann stand im Code .Size und nun warte ich darauf, dass ich eine verständlichere Version deines Wunsches erhalte bevor ich mir darüber Gedanken mache.
    Hm, ich hatte bei meinem MP eine Trackbar verwendet, geht aber auch eine Progressbar.
    Hier der Code:

    VB.NET-Quellcode

    1. Dim value As Double
    2. value = (CDbl(e.X) / CDbl(TrackOffset.Width)) * (TrackOffset.MaxValue - TrackOffset.MinValue)
    3. TrackOffset.Value = Convert.ToInt32(value)


    Müsstest nur auf deine Picturebox umschreiben und ggf die Werte anpassen (Ich hab mit Millisekunden gearbeitet).
    hmm funktioniert noch nicht 100%
    Ich hab diesen Code verwendet

    VB.NET-Quellcode

    1. Timer1.Stop()
    2. Dim NW As Double
    3. NW = (CDbl(e.X) / CDbl(MovBar.Width) * (Panel6.Width - 10))
    4. MovBar.Size = New Size(Convert.ToInt32(NW), MovBar.Height)
    Doch skaliert sich die PicBox nicht zur maus, aber schon ansatzweise, doch klicke ich auf die selbe stelle noch mal wirds mal mehr und dann mal weniger...
    Was ist noch falsch?
    würde auch ungefähr wie hatschi vorgehen.
    Probier erstmal die Funktionalität der Steuerung mittels Scrollbar oder Trackbar ühaupt mal hinzukriegen.
    vlt. gugge auch MCI-Player, aber der baut auf MCI auf, nicht mediaplayer (obwohl - die Steuerung könnteste interessant finden).

    Erst im nächsten Schritt versuchen, die Trackbar durch ein stylischeres Control zu ersetzen.
    Gut ich hab mal mit ner trackbar gemacht das funktioniert einigermaßen, auch die übersetzung von Trackbar auf Picturebox, doch gibs da ein kleines problemchen ...
    komicher weise wenn ich auf die pickturebox klicke springt der wert viel zu weit.

    was ist falsch:
    Timer: Moviebar

    VB.NET-Quellcode

    1. Try
    2. MovBar.Size = New Size((Panel6.Width - 10) * (Player.Ctlcontrols.currentPosition / Player.currentMedia.duration), MovBar.Height)
    3. TrackBar2.Maximum = Player.currentMedia.duration
    4. TrackBar1.Value = Player.Ctlcontrols.currentPosition
    5. Catch ex As Exception
    6. End Try


    Picturebox MouseDown: MovBar

    VB.NET-Quellcode

    1. Moviebar.Stop()
    2. Dim value As Double
    3. value = (CDbl(e.X) / CDbl(TrackBar2.Width)) * (TrackBar2.Maximum - TrackBar2.Minimum)
    4. TrackBar2.Value = Convert.ToInt32(value)
    5. Player.Ctlcontrols.currentPosition = TrackBar2.Value
    6. Moviebar.Start()
    Bitte mal ohne Try-Block
    Eventuell liegt es daran das du die Trackbar mit Werten fütterst, die nicht 1zu1 umgesetzt werden können.

    "currentMedia.duration", welche Werte liefert er dir beim Abspielen?

    Ansonsten mal Option Strict ON schalten.
    Ich vermute das die Werte nicht stimmen und mit einem Klick springt die Trackbar etc. nicht exakt auf die Mauszeigerposition.
    Wenn ich Option Strict ON schalte enstehen maßig fehler "Option Strict ON lässt keine implizieten Konvertierungen von Double in Integer / String zu."

    Ansonsten lieferte "currentMedia.duration" wärend des spielens, exakte ergebnisse (zwar liegen diese in 8stelligen Dezeimalbereich).