• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Dotinho

Progress bar com cor

16 mensagens neste tópico

Boas, eu queria fazer uma progress bar com cor, pois a do windows nao me da esse direito, entao fiz o seguinte:

criei uma picture box, no tamanho que quiser, nao é importante o tamanho, depois fiz uma função que le o tamanho e cria a barra comforme a percentagem.. fica aqui o codigo, achei interessante:

Private Function ll_PbPerc(ByVal pb As PictureBox, ByVal perc As Integer) As Integer

        Dim xy As Size = pb.Size

        Dim xper As Integer = (perc / 100) * (xy.Width - 4)

        pb.SuspendLayout()

        Dim g As Graphics = pb.CreateGraphics

        g.FillRectangle(Brushes.Black, New Rectangle(0, 0, xy.Width, xy.Height))

        If perc < 60 Then

            g.FillRectangle(Brushes.GreenYellow, New Rectangle(0, 0, xper, xy.Height))

        ElseIf perc >= 60 And perc < 75 Then

            g.FillRectangle(Brushes.Yellow, New Rectangle(0, 0, xper, xy.Height))

        ElseIf perc >= 75 And perc < 90 Then

            g.FillRectangle(Brushes.Orange, New Rectangle(0, 0, xper, xy.Height))

        ElseIf perc >= 90 Then

            g.FillRectangle(Brushes.Red, New Rectangle(0, 0, xper, xy.Height))

        End If

        'g.DrawString(perc & " %", New Font("Calibri", 9, FontStyle.Regular, GraphicsUnit.Pixel, 0), _

        '            Brushes.Black, 6, 0)

        pb.ResumeLayout()

Se alguem tiver algum codigo para outro tipo de progress bar, tambem pode postar aqui..

cmps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e como se coloca isto a progredir..só por curiosidade?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

loool, pelo uso..  ll_PbPerc(ByVal pb As PictureBox, ByVal perc As Integer) As Integer

equando chamas a função, tens que declarar duas coias,  pb As PictureBox, é onde declaras a picture box, depois  perc As Integer é onde das o valor da percentagem..

por exemplo :

Sub Teste()

Dim PictureBox1 as new PictureBox

PictureBox1.Location = new size(5,5)

PictureBox1.Size= new size(100,5)

Me.controls.add(PictureBox1)

ll_PbPerc(PictureBox1, 55) As Integer

End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda que este tipo de coisinhas se devam fazer com um pouco mais de encapsulamento e portabilidade (um usercontrol por exemplo), permite-me sugerir algumas alterações entre as inúmeras que se podiam acrescentar:

    Private Function ll_PbPerc(ByVal pb As PictureBox, ByVal perc As Integer, Optional ByVal Grad As Boolean = True) As Integer
        perc = Math.Abs(perc) Mod 101
        Dim xy As Size = pb.Size
        Dim xper As Integer = (perc / 100) * (xy.Width - 4)
        pb.SuspendLayout()
        Dim g As Graphics = pb.CreateGraphics
        g.Clear(Color.Black)

        Dim CentroVertical As Integer = CInt(pb.Height / 2)
        Dim CentroHorizontal As Integer = CInt(pb.Width / 2)

        If perc <> 0 Then
            Dim CorFinal As New Color

            Dim Vermelho As Integer = CInt((perc * 255) / 100)
            Dim Verde As Integer = 255 - Vermelho
            CorFinal = Color.FromArgb(Vermelho, Verde, 0)

            Dim PBRec As Rectangle = New Rectangle(0, 0, xper, xy.Height)
            Dim Gradiente As Drawing2D.LinearGradientBrush

            If Grad = True Then
                Gradiente = New Drawing2D.LinearGradientBrush(New PointF(0, CentroVertical), New PointF(PBRec.Width, CentroVertical), _
                                                               Color.Black, CorFinal)
                g.FillRectangle(Gradiente, PBRec)
            Else
                Gradiente = New Drawing2D.LinearGradientBrush(New PointF(0, CentroVertical), New PointF(PBRec.Width, CentroVertical), _
                                                               CorFinal, CorFinal)

                g.FillRectangle(Gradiente, PBRec)
            End If

        End If

        Dim Fonte As New Font("Arial", 12, FontStyle.Bold, GraphicsUnit.Pixel, 0)
        Dim TamanhoStr As SizeF = g.MeasureString(perc & " %", Fonte)

        g.DrawString(perc & " %", Fonte, _
                     Brushes.White, CentroHorizontal - (TamanhoStr.Width / 2), CentroVertical - (TamanhoStr.Height / 2))

        pb.ResumeLayout()
    End Function

- Protecção contra valores percentuais fora do alcance 0-100

- Gradação automática de cor

- Efeito gradiente opcional

- Informação de percentagem centrada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ribeiro55, da-me erro de memoria nestas linhas, como nunca usei este tipo de desenhos, nao sei muito bem com ocorrigir isto..alguma sugestão?

  If Grad = True Then

                Gradiente = New Drawing2D.LinearGradientBrush(New PointF(0, CentroVertical), New PointF(PBRec.Width, CentroVertical), _

                                                              Color.Black, CorFinal)

                g.FillRectangle(Gradiente, PBRec)

            Else

                Gradiente = New Drawing2D.LinearGradientBrush(New PointF(0, CentroVertical), New PointF(PBRec.Width, CentroVertical), _

                                                              CorFinal, CorFinal)

                g.FillRectangle(Gradiente, PBRec)

            End If

cmps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Erro de memória?

Isso está testado. Testo sempre código antes de postar. :dontgetit:

Não sei de cor se todas as classes são apenas FW2.0. Tens a 3.5 instalada?

Já agora, mostra lá a descrição do erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

loool, pelo uso..  ll_PbPerc(ByVal pb As PictureBox, ByVal perc As Integer) As Integer

equando chamas a função, tens que declarar duas coias,  pb As PictureBox, é onde declaras a picture box, depois  perc As Integer é onde das o valor da percentagem..

por exemplo :

Sub Teste()

Dim PictureBox1 as new PictureBox

PictureBox1.Location = new size(5,5)

PictureBox1.Size= new size(100,5)

Me.controls.add(PictureBox1)

ll_PbPerc(PictureBox1, 55) As Integer

End Sub

Devo estar a ficar um bocadinho lerdo...

Imagina que num ciclo, eu quero fazer progredir a barra conforme a execução de determinada tarefa... como posso fazer isso usando o código como o escreveste...fiquei curioso... crias uma nova picture box a cada iteração? como é?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao lool, eu explico..

Por exemplo do design, desnhas a form como quiseres, ate podes por a picturBox no sitio que queres a progress bar (mas poes uma picurebox)

no teu codigo, quando quiseres alterar a percentagem, apenas chamas a função..

olha, para percebers mesmo bem, em vez de pores Progressbar1.Value=55, passas a por ll_PbPerc(PictureBox1, 55)

se sabes usar uma progress bar, assim tambem sabes usar a minha progressbar atravez de uma pictureBox, só tens que a por no sitio da progressbar.. é simples

==MODIFICADIO===

Ah, fazes copy paste do meu codigo ou do codigo alterado do ribeiro55, é uma função que chamas em vez de progressbar1.value, como te disse á pouco.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A utilização está errada, sim.

Mas não deixa de ser funcional... o método até funciona.

Dentro do ciclo, chamas o método enviando referência a uma picturebox e a percentagem que queres mostrar.

Novamente, não estou a dizer que é uma boa política... não o é. Mas funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok.... assim já estou esclarecido... eu e todos os utilizadores que podem ler o post!

É que não me estava a parecer muito util.....no fundo no ciclo ficaria qualquer coisa como (nao testei,.. mas o principio deve ser este).

for i = 0 to 10

ll_PbPerc(PictureBox1, i)

next

Já agora.. outro reparo..pk e que ambos puseram isso como function a retornar um integer, quando não fazem um return de nada um sub não resolvia o problema?... só por curiosidade... é que eu sou um tipo curioso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que é uma function, e porque raio devolve Integer, quando não devolve nada é que já me ultrapassa :P

Limitei-me a agarrar no exemplo dele e aprimorá-lo um pouco.

EDIT: Um sub não só resolvia o problema como deveria ser a solução. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

yap..era precisamente ai que queria chegar...

para além de ter percebido o modo de funcionamento à primeira...só que achei que devia ser esclarecido...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora