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

nokPT

[Resolvido] Desenhar em VB.NET ou Imagens sobrepostas

Recommended Posts

nokPT

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,


Ricardo Timóteo

Share this post


Link to post
Share on other sites
jpaulino

Olá,

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

Simplifica!

Share this post


Link to post
Share on other sites
C0PILHA

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

????


========================================================Errar é humano, mas para se fazer uma monstruosa cagada é preciso um computador!!!========================================================

Share this post


Link to post
Share on other sites
Nazgulled

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.

Share this post


Link to post
Share on other sites
C0PILHA

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


========================================================Errar é humano, mas para se fazer uma monstruosa cagada é preciso um computador!!!========================================================

Share this post


Link to post
Share on other sites
nokPT

Relativamente à imagem aqui está:

http://img204.imageshack.us/my.php?image=desenhood4.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 30/01/2009 às 04:19, Nazgulled disse:

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?


Ricardo Timóteo

Share this post


Link to post
Share on other sites
Nazgulled

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

Share this post


Link to post
Share on other sites
Joca

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.

Share this post


Link to post
Share on other sites
Joca

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

Share this post


Link to post
Share on other sites
Nazgulled

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

Share this post


Link to post
Share on other sites
nokPT

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


Ricardo Timóteo

Share this post


Link to post
Share on other sites
nokPT

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


Ricardo Timóteo

Share this post


Link to post
Share on other sites
Nazgulled

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.

Share this post


Link to post
Share on other sites
nokPT

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)


Ricardo Timóteo

Share this post


Link to post
Share on other sites

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

×

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.