Jump to content

Recommended Posts

Posted

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

Luis Lourenço

Posted

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

Luis Lourenço

Posted

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

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

Tem piada é construír as nossas próprias  😉

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

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

Luis Lourenço

Posted

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.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

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

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

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.

Luis Lourenço

Posted

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.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

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.

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Posted

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

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. 😛

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Posted

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...

Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.