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

scorch

GDI+ Subrepor a BitMap existente numa PictureBox

15 mensagens neste tópico

Boas, estou a desenvolver uma aplicação, a primeira com que trabalho com GDI+. Ora, tenho uma PictureBox que tem uma imagem predefinida, neste caso, o tabuleiro para um jogo. Depois, eu quero desenhar certos elementos por cima da PictureBox.

Tenho este código:

       Dim B As New Bitmap(Me.img_tabuleiro.Width, Me.img_tabuleiro.Height)
       Dim G As Graphics = Graphics.FromImage(B)

       G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

       G.FillEllipse(Brushes.Black, 20, 20, 20, 20)

Já tentei também:

Me.img_tabuleiro.Image = B

Mas, como é óbvio, ele altera-me a imagem toda e coloca-me só o Elipse, e o que estava lá no inicio desaparece. :wallbash:

Alguém sabe como posso fazer para colocar isto a funcionar? :)

Cumps,

Scorch

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A tal imagem do tabuleiro tem de ser "externa". Não a podes reaproveitar porque levaria sempre o resto atrás.

Imagina por exemplo que tens a imagem nos teus recursos, sobre o nome "Tabuleiro":

        Dim B As New Bitmap(PictureBox1.Width, PictureBox1.Height)
       Dim G As Graphics = Graphics.FromImage(B)

       'primeiro o tabuleiro
       G.DrawImage(My.Resources.Tabuleiro, 0, 0)
       'depois o resto
       G.DrawEllipse(Pens.Black, 0, 0, 5, 5)

       'e por fim, dás-lhe a composição
       PictureBox1.Image = B

Podes alternativamente, desenhar directamente da picturebox:

        Dim G as Graphics = PictureBox1.CreateGraphics

É solução sapateira mas dá para entenderes e dares a volta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dei-te uma elipse de 2,5 de raio como exemplo.

Explica lá melhor o que queres fazer e vamos chegar a uma solução mais específica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O tabuleiro tem vários quadrados. É tipo um tabuleiro de damas. Eu preciso de desenhar círculos conforme as posições das peças. Mas a imagem que me fica pequena é a do background, a original.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é estranho porque estás a "desenhar" sobre um bitmap com as dimensões da picturebox, e o drawimage só pede um ponto para o canto superior esquerdo, desenhando o resto da imagem crua, de qualquer maneira.

Tenta o seguinte:

Não uses picturebox, só por motivos de rastreio.

Eu costumo usar Panels e os seus BackGroundImage para esse tipo de coisas.

Mais porque normalmente interessa-me ter controlos por cima.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tentei e nada. Aqui fica um screenshot. O da esquerda é a PictureBox sem GDI+, o da direita é o do Panel com GDI+.

gdi.png

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É só isto. :)

Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class frm_init

   Private Sub frm_init_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim B As New Bitmap(Me.img_tabuleiro.Image.Width, Me.img_tabuleiro.Image.Height)
       Dim G As Graphics = Graphics.FromImage(B)

       G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

       G.DrawImage(My.Resources.Rrastros_Tabuleiro2, 0, 0)

       G.FillEllipse(Brushes.Black, 30, 20, 20, 20)

       Me.Panel1.BackgroundImage = B

   End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class frm_init

   Private Sub frm_init_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim B As New Bitmap(Me.img_tabuleiro.Image.Width, Me.img_tabuleiro.Image.Height)
       Dim G As Graphics = Graphics.FromImage(B)

       G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

       G.DrawImage(My.Resources.Rrastros_Tabuleiro2, 0, 0)

       G.FillEllipse(Brushes.Black, 30, 20, 20, 20)

       Me.Panel1.BackgroundImage = B

   End Sub
End Class

Procura saber, em debug, que valores estão a entrar para dar o tamanho ao bitmap.

O problema só pode residir aí (ou assim me parece)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alguma coisa me está a escapar no teu código.

Exprimenta trocar o BackGroundImageLayout (ou coisa assim parecida) para outro. Se estiver zoom, ou stretch, e o tamanho for outro, ele vai adaptar a imagem.

Toma um projecto que está a funcionar perfeitamente, acabei de o fazer, para tentares perceber o que raio está a acontecer aí.

(o teu também deveria, à primeira vista... dado que os valores entram correctos)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hoje de manhã descobri o problema, embora não possa ter vindo ao fórum. Basta fazer isto:

G.DrawImage(My.Resources.Rrastros_Tabuleiro2, 0, 0, 180, 180)

Assim já funciona. B)

Obrigado pela ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que coisa manhosa.

Penso que nunca me aconteceu mandar desenhar um bitmap e ele sair com outras dimensões que não fossem as originais, quando não usava o overload com a largura e altura.

Mas tu já deves é ter a maquina engatada :P

Lembras-te do QAT eXplorer? Vieste a descobrir que era por causa de fontes ?

OS queimadinho... :P

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