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

nokPT

[Resolvido] Desenhar em VB.NET ou Imagens sobrepostas

15 mensagens neste tópico

Bom dia,

Estou a fazer um orçamento e necessito da ajuda do pessoal mais experiente, todas as dicas são úteis.

O que o cliente pretende é o seguinte, numa determinada área do ecran, tenho que criar um sinóptico do estado da instalação.

O sinóptico será composto por uma série de rectângulos (nem todos regulares), paralelepípedos, arcos (preenchidos) etc... estas figuras geométricas representarão tubagens, condutas, equipamentos de controlo e medida.

Parte do desenho será estático, no entanto, necessito de mudar a cor dos equipamentos de controlo e de medida dependendo do estado (verde = ligado, cinza = desligado, vermelho = alarme, etc...)

Em cada imagem poderei ter até 20 equipamentos. Mais uma imagem de fundo (estática).

Imagino que haja várias maneiras de fazer o que pretendo:

* a primeira ideia seria desenhar todos os equipamentos em código, assim posso mudar facilmente as cores, mas é também o mais trabalhoso. Tirei que desenhar em código algumas centenas de figuras geométricas (e controlar centenas de coordenadas), para não falar em alterações demoradas e trabalhosas.

* a segunda ideia seria desenhar imagens png e acrescentar as várias imagens a uma picturebox ou várias picturebox. Andei a pesquisar e percebi que também não é tarefa simples. Por exemplo na seguinte imagem tenho 2 picturebox: uma maior com a imagem de fundo estática e uma pequena (assinalada) com fundo transparente e com uma imagem também com fundo transparente só que o resulta não é o que esperava, a picturebox pequena sobrepõem-se à grande sem ficar transparente.

(não consigo meter a imagem no forum)

Os softwares que costumo usar são proprietários e têm estas funções, só que têm um custo elevado e não preenchem todos os requisitos deste projecto.

Neste momento, tenho apenas que prever mais ou menos a facilidade de executar o trabalho e quanto tempo vou levar.

Atentamente,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguém tem uma dica ou ideia que me possa ajudar?

Qualquer coisa serve...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Coloca a imagem num site qualquer e depois coloca aqui o endereço.

Simplifica!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nooossa, saber fazer uma picturebox ficar transparente junto à outra seria legal, fiquei tentando fazer isso no vb por meses, depois desistí.

No Delphi é tão fácil, não sei pq esse recurso não existe no vb.

Será que não existe maneira de fzer isso pessoal

????

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vez de usares a PictureBox podias experimentar "pintar" o png directamente no evento Paint do Form... Julgo que a transparência, pelo menos assim, tem de funcionar correctamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Até a transparencia de uma picturebox sobre a outra picturebox ?

Pq o máximo que jah consegui éra que o fundo da pb ficasse tampando a outra pb, o fundo dela éra a imagem do form, mas tampava a outra.... =/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente à imagem aqui está:

desenhood4.th.jpg

Está desenhada (e assinalada) uma válvula por cima duma tubagem, o fundo da válvula é transparente, mas na realidade na vez de vermos a imagens de baixo, vemos o fundo da form.

Relativamente ao Delphi, já ouvi falar, que é muito potente (e fácil) no tratamento de imagens, mas é pago e não queria ter que estudar mais uma linguagem.

Em vez de usares a PictureBox podias experimentar "pintar" o png directamente no evento Paint do Form... Julgo que a transparência, pelo menos assim, tem de funcionar correctamente.

Isso quer dizer, fazer as linhas, rectângulos, à mão com código? Quantos dias de código para fazer imagens 10x mais complicado que o desenho central (o resto é fácil)? Alguma ideia?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, podes fazer como disseste, com imagens em .png. A diferença é que não usas pictureboxes para colocar lá as imagens.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui há algum tempo atrás, tentei fazer algo do género, usando duas pictureBox e duas forms.

"Aldrabei" um pouco, colocando uma form como segunda form e, colocando as pictureBoxes nessa segunda form.

A primeira form foi usada como "pano de fundo" que se movia sempre que movia a segunda form...

Não ficou nada "agradável"...

Já não tenho o projecto agora mas, julgo que, na altura, atribuí à TransparencyKey da segunda form a mesma cor que queria transparente nas pictureBoxes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Andei aqui de novo à volta da questão da transparência e, descobri que afinal é possível fazê-lo.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        
        'Fundo com uma foto ou imagem personalizada:
        Me.BackgroundImage = System.Drawing.Image.FromFile("C:\ImagemPersonalizada.bmp")



        Dim MeuBitmap As New Bitmap("c:\circuloFuro.bmp")
        ' A imagem é um círculo de cor vermelha com um furo ou buraco a azul.

        'Se a cor que pretendes que seja transparente é a cor 
        'azul, então:
        MeuBitmap.MakeTransparent(Color.Blue)
        'Caso pretendas usar uma imagem personalizada, como fundo da 
        'tua Form, deverás fazer também:
        PictureBox1.BackColor = Color.Transparent


        'Por fim, atribuis a imagem à PictureBox:
        PictureBox1.Image = MeuBitmap


    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tanta chatice não sei para quê, basta usar pngs com a devida transparência (até pode ter vários níveis de transparência - alpha) que funciona logo, algo assim, chega:

Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        e.Graphics.DrawImage(Image.FromFile("image0.png"), Panel1.ClientRectangle)
        e.Graphics.DrawImage(Image.FromFile("image1.png"), Panel1.ClientRectangle)
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled, acertaste em cheio, funciona se só quiser chamar 1 vez, mas realidade necessito de actualizar os estados dos equipamentos a cada segundo.

Para isso activei um timer e segundo mudo as cores dos equipamentos conforme o seu estado, SÓ que provoca muito Flicker, ou seja a imagem está constantemente a piscar, o que é muito irritante para os olhos...

Alguma ideia de como anular este fenómeno?:

    Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        e.Graphics.DrawImage(Image.FromFile("C:\Documents and Settings\Ricardo Timóteo\Ambiente de trabalho\ANTIGO\MyDoc\My Web Sites\CSC-EA\automacao\imagens\chamas_cepsa.jpg"), Panel1.ClientRectangle)
        If ValvulaEstado = 0 Then
            e.Graphics.DrawImage(Image.FromFile("C:\Documents and Settings\Ricardo Timóteo\Os meus documentos\As minhas imagens\VálvulaOff.png"), 120, 20)
        End If
        If ValvulaEstado = 1 Then
            e.Graphics.DrawImage(Image.FromFile("C:\Documents and Settings\Ricardo Timóteo\Os meus documentos\As minhas imagens\VálvulaOn.png"), 120, 20)
        End If
        If ValvulaEstado = 2 Then
            e.Graphics.DrawImage(Image.FromFile("C:\Documents and Settings\Ricardo Timóteo\Os meus documentos\As minhas imagens\VálvulaAlarme.png"), 120, 20)
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If ValvulaEstado < 2 Then
            ValvulaEstado = ValvulaEstado + 1
        Else
            ValvulaEstado = 0
        End If
        'Panel1.Refresh()
        Panel1.Invalidate()
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há alguma maneira de fazer isto sem ser no Paint_Event?

Ou dizer só que parte do ecran quero actualizar?

Porque ao actualizar como está, o ecran está sempre a piscar, o resultado é horrível... O ecran mais parece uma psicadélica, é impossível estar alguns segundos a olhar para o ecran...

Já lí algures no doublebuffer, mas ou não percebi ou não funciona...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vez de usares o Timer podes invalidar o Panel1, no caso do meu exemplo.

Ou seja, "pintas" sempre todo no evento "Paint". Este evento é chamado em vários alturas mas tu podes obriga-lo a ser chamado quando quiseres e para isso fazes Panel1.Invalidate() quando achares necessário.

Vê se isso resulta...

E já agora, uma sugestão... Não sei bem ao certo como funciona o VB.NET (.NET no geral vá) e tendo Image.FromFile() várias vezes no evento Paint talvez não seja boa escolha. O melhor é carregares os ficheiros necessários uma única vez, para variáveis globais ou até mesmo uma classe para isso. E depois é só usa-los...

Para terminar, também podes dizer que parte do ecrã actualizar, basta que no Invalidate() passes um parâmetro do tipo Region ou Rectangle especificando a área que queres invalidar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nazgulled, perfeito, obrigado, é mesmo isso

acrescentei as coordenadas no invalidate e fazendo com que só pisque efectivamente o que estou a actualizar, mas tudo bem, estou a actualizar não é crítico.

        Dim rc As Rectangle
        rc.X = 120
        rc.Y = 20
        rc.Width = 50
        rc.Height = 50
        Panel1.Invalidate(rc)

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