Jump to content

GDI+ Subrepor a BitMap existente numa PictureBox


scorch

Recommended Posts

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

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Link to comment
Share on other 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.

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"

Link to comment
Share on other 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.

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"

Link to comment
Share on other 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

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Link to comment
Share on other 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)

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"

Link to comment
Share on other 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)

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"

Link to comment
Share on other 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 😛

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

OS queimadinho... 😛

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"

Link to comment
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
×
×
  • 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.