Oppure

Loading
31/10 11:10
nightwolf
buongiorno a tutti, è da un po di tempo che non vengo su questo forum, ho ripreso un vecchio progetto che avevo accantonato x via di mancanza di tempo, premetto che ciò che scrivo non è mio, ho copiato uno schema per avere un custom progressbar x controllare il volume del mio media player, perche la progressbar che da il sistema non mi piace, solo che mi da un errore che non capisco, potete aiutarmi voi gentilmente? allego il codice che ho copiato
ps. scusate se ho copiato ma di disegno progettuale non capisco niente, le mie competenze arrivano fino ad un certo punto.
il form è un form .cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class volume_control : UserControl
    {
        public volume_control()
        {
            InitializeComponent();
            this.Size = new Size(350, 30);
            this.BackColor = Color.Black;
            DoubleBuffered = true;
        }

        int pb_value = 40, pb_Min = 0, pb_Max = 100;

        public int Max { get { return pb_Max; } set { pb_Max = value; Invalidate(); } }
        public int Min { get { return pb_Min; } set { pb_Max = value; Invalidate(); } }
        public int value { get { return pb_value; } set { pb_value = value; Invalidate(); } }
        public int gap = 10;

        Color b_color = Color.Aqua;
        public Color Bar_color { get { return b_color; } set { b_color = value;Invalidate(); } }

        private void volume_control_Paint(object sender, PaintEventArgs e)
        {
            int start_point = 40;
            SolidBrush sb = new SolidBrush(Color.DimGray);
            for (int j = 0; j < (Max * ClientSize.Width / Max - 75) / gap;j++)


            {
                e.Graphics.FillRectangle(sb, new Rectangle(start_point, 0, gap - 5, ClientSize.Height));
                start_point += gap;
            }
            int buffer_point = 40;
            SolidBrush br = new SolidBrush(b_color);

            for(int i=0; i < (pb_value*ClientSize.Width / Max - pb_value) / gap;i++)

            {
                e.Graphics.FillRectangle(br, new Rectangle(buffer_point, 0, gap - 2, ClientSize.Height));
                buffer_point += gap;
            }

            int thum_size = 25;
            SolidBrush thumb = new SolidBrush(Color.White);
            e.Graphics.FillRectangle(thumb, new Rectangle(buffer_point, 0, thum_size, ClientSize.Height));

            if(pb_value>=Min)
            {
                Image left_img = Properties.Resources.down_img;
                e.Graphics.DrawImage(left_img , 5, 0, ClientSize.Height, ClientSize.Height);

            }
            if (pb_value <= 50)
            {
                Image right_img = Properties.Resources.mid_img;
                e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height);

            }
            if (pb_value <= Min)
            {
                Image left_img = Properties.Resources.mute_img;
                e.Graphics.DrawImage(left_img, 5, 0, ClientSize.Height, ClientSize.Height);

            }
            if (pb_value >= 50)
            {
                Image right_img = Properties.Resources.high_img;
                e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height);

            }

        }
        bool mouse = false;
        private void volume_control_MouseDown(object sender, MouseEventArgs e)
        {
            mouse = true;
            Bar_value(thumb_value(e.X));


        }

        private void volume_control_MouseMove(object sender, MouseEventArgs e)
        {
            if (!mouse) return;
            Bar_value(thumb_value(e.X));

        }

        private void volume_control_MouseUp(object sender, MouseEventArgs e)
        {
            mouse = false;
        }

        private void Bar_value(float value)
        {
            if (value < Min) value = Min;
            if (value > Max) value = Max;
            if (pb_value == value) return;
            pb_value = (int)value;
            this.Refresh();

        }
        private float thumb_value(int x)
        {
            return Min + (Max - Min) * x / (float)(ClientSize.Width);

        }
    }
}


il problema è che alla riga 37 mi dice "eccezione non gestita"
System.DivideByZeroException: 'Tentativo di divisione per zero.'

che vuol dire?
grazie mille

aaa
31/10 13:11
Carlo
Prima di usare l'UserControl, devi inserire un valore per Max, altrimenti essendo zero hai l'errore.

Nel codice del form principale:

using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            volume_control1.Max = 100;
        }
    }
}


L'UserControl non sembra pensato per essere inserito da progettazione ma da codice:

using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        volume_control vc = new volume_control(); // nuova ProgressBar vc
        public Form1()
        {
            InitializeComponent();
            vc.Max = 100;
            vc.Left = 100;
            vc.Top = 100;
            this.Controls.Add(vc);
        }
    }
}


In alternativa si potrebbe aggiungere una riga in volume_control_Paint per evitare che Max valga zero: if (Max == 0) Max = 100;
Ultima modifica effettuata da Carlo 31/10 16:10
in programmazione tutto è permesso
31/10 16:23
nightwolf
Grazie mille, quando vado a casa provo
aaa
01/11 9:49
nightwolf
ecco tutto il cod. che uso x il mio player
Imports WMPLib
Imports System.IO
Imports TagLib.Id3v2
Public Class media_pleyer
    Dim numero As Integer
    Dim canzoni() As String
    Dim i As Integer
    Dim musica As String
    Dim indice As Integer
    Dim playing As Boolean

    Private Sub Nexttrack()
        indice = List_canzoni.SelectedIndex
        indice = indice + 1
        If indice = Label4.Text Then
            indice = 0
        End If
        List_canzoni.SelectedIndex = indice

    End Sub

    Private Sub Previoustrack()
        indice = List_canzoni.SelectedIndex
        indice = indice - 1
        If indice < 0 Then
            indice = Label4.Text - 1
        End If
        List_canzoni.SelectedIndex = indice
    End Sub
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles btn_open.Click
        AxWindowsMediaPlayer1.Visible = True
        List_canzoni.Visible = True

        FolderBrowserDialog1.ShowDialog()
        If FolderBrowserDialog1.SelectedPath = "" Then

            Exit Sub
        Else
            canzoni = System.IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath)

        End If
        For i = 0 To canzoni.Length - 1
            ListBox1.Items.Add(canzoni(i))
            List_canzoni.Items.Add(System.IO.Path.GetFileName(canzoni(i)))
        Next

        numero = List_canzoni.Items.Count
        Label4.Text = numero
        btn_play.Enabled = True


    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_play.Click
        Timer2.Enabled = True
        List_canzoni.SelectedIndex = 0
        ListBox1.SelectedIndex = List_canzoni.SelectedIndex
        musica = ListBox1.Text
        AxWindowsMediaPlayer1.URL = musica
        musica = ListBox1.SelectedItem
        AxWindowsMediaPlayer1.URL = musica
        lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name

    End Sub

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles btn_pause.Click
        If playing Then
            AxWindowsMediaPlayer1.Ctlcontrols.pause()
        Else
            AxWindowsMediaPlayer1.Ctlcontrols.play()
        End If
        playing = Not playing
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btn_stop.Click
        AxWindowsMediaPlayer1.URL = ""
        Timer2.Enabled = False
        lb_title.Text = "Title"
        Label3.Text = "00:00"
        Label6.Text = "00:00"
        TrackBar3.Value = 0
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles btn_next.Click
        Nexttrack()
        lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles btn_previous.Click
        Previoustrack()
        lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
    End Sub

    Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles trc_volume.Scroll
        AxWindowsMediaPlayer1.settings.volume = trc_volume.Value
        lb_volume.Text = trc_volume.Value.ToString + "%"
    End Sub

    Private Sub media_pleyer_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        List_canzoni.Visible = False
        trc_volume.Value = AxWindowsMediaPlayer1.settings.volume
        btn_play.Enabled = False
        lb_volume.Text = "50%"

    End Sub
    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles btn_fullscreen.Click
        AxWindowsMediaPlayer1.fullScreen = True
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        Timer2.Interval = 60
        Label3.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentPositionString
        Label6.Text = AxWindowsMediaPlayer1.currentMedia.durationString

        Dim cur As Integer = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition
        Dim len As Integer = AxWindowsMediaPlayer1.currentMedia.duration

        TrackBar3.Value = cur
        TrackBar3.Maximum = len
        If TrackBar3.Value = 100 Then
            TrackBar3.Value = 0
        End If


    End Sub

    Private Sub AxWindowsMediaPlayer1_Enter(sender As Object, e As EventArgs) Handles AxWindowsMediaPlayer1.Enter
        AxWindowsMediaPlayer1.fullScreen = False
    End Sub

    Private Sub TrackBar3_Scroll(sender As Object, e As EventArgs) Handles TrackBar3.Scroll
        AxWindowsMediaPlayer1.Ctlcontrols.currentPosition = TrackBar3.Value
    End Sub
    Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles List_canzoni.SelectedIndexChanged
        Label2.Text = List_canzoni.SelectedIndex
        ListBox1.SelectedIndex = List_canzoni.SelectedIndex
        musica = ListBox1.Text
        AxWindowsMediaPlayer1.URL = musica
        Timer2.Enabled = True
        lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name



    End Sub
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Label7.Text = Now.Hour & ":" & Now.Minute & ":" & Now.Second
    End Sub

End Class
aaa
01/11 9:54
nightwolf
scusate ho sbagliatp post dove postare il cod, ma non so come cancellarlo, questo è il cod, che uso x il mio player e dove voglio usare la custom progrressbar per il controllo del volume
aaa
01/11 18:27
nightwolf
grazie mille adesso tutto funziona. un altra domanda, è possibile usare questo controllo nel mio progetto vb.net essendo un progetto in c#? come posso importarlo?
aaa
01/11 21:14
Thejuster
creare una libreria in vb.net, in seguito importare la libreria ed usarlo nel progetto c#.

Edit:

Comunque non sò, ma rileggendo un pò il codice a me sembra corretto carlo.


int pb_value = 40, pb_Min = 0, pb_Max = 100;

public int Max { get { return pb_Max; } set { pb_Max = value; Invalidate(); } }



In tutti i miei progetti C# con controlli che realizzo, eseguo la medesima procedura.
Alla fine Max è solo una proprietà che restituisce pb_Max, e assegna pb_Max il valore, ridisegnando il controllo.
Mi sembra strano che gli abbia dato errore in quel punto.

Ad esempio qui
github.com/MakingItalia/MMORpgmaker/blob/master/Client/Controls/…

Alcune proprietà come IsPassword o Visibile sono gestite direttamente dalle variabili.
e non vengono assegnate al costruttore.

Magari non so il contesto è diverso, non saprei spiegarmi la motivazione altrimenti.
ho scritto tutto questo giusto per curiosità, perché mi sembra molto strano.

Ultima modifica effettuata da Thejuster 01/11 21:28
mire.forumfree.it/ - Mire Engine
C# UI Designer
02/11 1:02
Carlo
Postato originariamente da Thejuster:

Comunque non sò, ma rileggendo un pò il codice a me sembra corretto carlo.



Sono perplesso anche io, l'userControl così come scritto se trascinato nel form da progettazione viene correttamente inserito e nelle proprietà Max vale 100. E' sufficiente uscire da progettazione e rientrare e l'userControl segnala la divisione per zero, le proprietà non sono più accessibili...
Ho provato cn VS2017 e VS2022.

@nightwolf

Il controllo lo puoi usare da vb.net come indicato da Thejuster, oppure convertirlo in VB.Net, meglio sarebbe se converti il tuo programma in C#, ma questo esula dalla discussione.

Per usare l'userControl nel tuo progetto VB.Net procedi come segue:
Su [Esplora soluzioni] sopra al nome del progetto clicca con il tasto destro e scegli dal menù: Aggiungi/Controllo utente, dai il nome all'userControl: volume_control.vb
si apre la pagina progettazione dell'userControl, vai al codice con F7, incolla il codice vb:

Partial Public Class volume_control

    Public Sub New()
        InitializeComponent()
        Me.Size = New Size(350, 30)
        Me.BackColor = Color.Black
        DoubleBuffered = True
    End Sub

    Private pb_value As Integer = 40, pb_Min As Integer = 0, pb_Max As Integer = 100

        Public Property Max As Integer
            Get
                Return pb_Max
            End Get
            Set(ByVal value As Integer)
                pb_Max = value
                Invalidate()
            End Set
        End Property

        Public Property Min As Integer
            Get
                Return pb_Min
            End Get
            Set(ByVal value As Integer)
                pb_Max = value
                Invalidate()
            End Set
        End Property

        Public Property value As Integer
            Get
                Return pb_value
            End Get
            Set(ByVal value As Integer)
                pb_value = value
                Invalidate()
            End Set
        End Property

        Public gap As Integer = 10
        Private b_color As Color = Color.Aqua

        Public Property Bar_color As Color
            Get
                Return b_color
            End Get
            Set(ByVal value As Color)
                b_color = value
                Invalidate()
            End Set
        End Property

    Private Sub volume_control_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
        If Max = 0 Then Max = 100
        Dim start_point As Integer = 40
        Dim sb As SolidBrush = New SolidBrush(Color.DimGray)

        For j As Integer = 0 To (Max * ClientSize.Width / Max - 75) / gap - 1
            e.Graphics.FillRectangle(sb, New Rectangle(start_point, 0, gap - 5, ClientSize.Height))
            start_point += gap
        Next

        Dim buffer_point As Integer = 40
        Dim br As SolidBrush = New SolidBrush(b_color)

        For i As Integer = 0 To (pb_value * ClientSize.Width / Max - pb_value) / gap - 1
            e.Graphics.FillRectangle(br, New Rectangle(buffer_point, 0, gap - 2, ClientSize.Height))
            buffer_point += gap
        Next

        Dim thum_size As Integer = 25
        Dim thumb As SolidBrush = New SolidBrush(Color.White)
        e.Graphics.FillRectangle(thumb, New Rectangle(buffer_point, 0, thum_size, ClientSize.Height))

        If pb_value >= Min Then
            Dim left_img As Image = My.Resources.down_img
            e.Graphics.DrawImage(left_img, 5, 0, ClientSize.Height, ClientSize.Height)
        End If

        If pb_value <= 50 Then
            Dim right_img As Image = My.Resources.mid_img
            e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height)
        End If

        If pb_value <= Min Then
            Dim left_img As Image = My.Resources.mute_img
            e.Graphics.DrawImage(left_img, 5, 0, ClientSize.Height, ClientSize.Height)
        End If

        If pb_value >= 50 Then
            Dim right_img As Image = My.Resources.high_img
            e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height)
        End If
    End Sub

    Private mouse As Boolean = False

    Private Sub volume_control_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown
        mouse = True
        Bar_value(thumb_value(e.X))
    End Sub

    Private Sub volume_control_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If Not mouse Then Return
        Bar_value(thumb_value(e.X))
    End Sub

    Private Sub volume_control_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        mouse = False
    End Sub

    Private Sub Bar_value(ByVal value As Single)
            If value < Min Then value = Min
            If value > Max Then value = Max
            If pb_value = value Then Return
            pb_value = CInt(value)
            Me.Refresh()
        End Sub

    Private Function thumb_value(ByVal x As Integer) As Single
        Return Min + (Max - Min) * x / CSng((ClientSize.Width))
    End Function

End Class


Dovresti riscontrare la presenza di 4 errori perché mancano le immagini, salva tutto, vai su [Esplora soluzioni] e clicca sopra al nome del progetto con il tasto destro, questa volta dal menù scegli: proprietà, nella pagina che si apre scegli: Risorse, nei menù seleziona: Aggiungi risorsa/Aggiungi file esistente: scegli le 4 immagini che serviranno a personalizzare la grafica, i nomi devono essere: down_img, mid_img, mute_img e high_img.
Ora non ci devono essere più errori.
Bisogna attivare gli eventi, torna in volume_control.vb(progettazione), in basso a destre c'è la pagina delle proprietà, clicca l'iconcina a forma di fulmine per visualizzare gli eventi, scorri gli eventi e trova: MouseDown a destra seleziona la routine che deve essere eseguita quando si schiaccia il mouse: volume_control_MouseDown
fai lo stesso con:
MouseMove - volume_control_MouseMove
MouseUp - volume_control_MouseUp
Paint - volume_control_Paint

Salva tutto, vai in media_pleyer(progettazione) e sulla casella degli strumenti trovi in alto l'userControl: volume_control, trascina nel form ed usalo come una HScrollBar normale.

Se hai problemi chiedi.
Ultima modifica effettuata da Carlo 02/11 1:09
in programmazione tutto è permesso