Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema gráficos en pictureBox C#

Estas en el tema de Problema gráficos en pictureBox C# en el foro de .NET en Foros del Web. Saludos programadores, tengo varios problemas a la hora de pintar gráficos sobre un pictureBox que contiene una foto. Lo que pretendo es dibujar algunos rectángulos ...
  #1 (permalink)  
Antiguo 29/01/2013, 04:01
 
Fecha de Ingreso: enero-2011
Mensajes: 2
Antigüedad: 13 años, 3 meses
Puntos: 0
Problema gráficos en pictureBox C#

Saludos programadores,

tengo varios problemas a la hora de pintar gráficos sobre un pictureBox que contiene una foto. Lo que pretendo es dibujar algunos rectángulos sobre la imagen (hasta ahí todo bien) pero cuando desde el hilo principal del programa salta algún mensaje o bien, simplemente presiono Alt+Tab para cambiar la vista al escritorio los rectángulos desaparecen. Por otro lado, para borrar el último rectángulo dibujado, cargo de nuevo la imagen y pinto todos los rectángulos salvo el último (tengo las coordenadas del raton guardadas en una estructura), pero se borran todos y no se repintan, con el prácticamente el mismo código con el que uno a uno si se pintaban. No tengo mucha experiencia con los gráficos en C#, por lo que agradecería mucho una ayudita.

Aqui el fragmento de código que pinta uno tras uno el rectangulo cuando pincho dos veces sobre el pictureBox:

void pictureBoxOriginal_MouseClick(object sender, MouseEventArgs e)
{
try
{
if (checkBoxMascara.Checked)
{
if (indMascara < 10)
{ // MAX. 10 MÁSCARAS

nVecesClick++;

if (nVecesClick == 1)
{
posRaton[indMascara].xl = e.X;
posRaton[indMascara].yt = e.Y;

coordX1 = (int)(posRaton[indMascara].xl / xScale);
coordY1 = (int)(posRaton[indMascara].yt / yScale);

posMascara[indMascara].xl = coordX1;
posMascara[indMascara].yt = coordY1;
}

if (nVecesClick == 2)
{
posRaton[indMascara].xr = e.X;
posRaton[indMascara].yb = e.Y;

coordX2 = (int)(posRaton[indMascara].xr / xScale);
coordY2 = (int)(posRaton[indMascara].yb / yScale);

posMascara[indMascara].xr = coordX2;
posMascara[indMascara].yb = coordY2;



Bitmap b = new Bitmap(pictureBoxOriginal.Width, pictureBoxOriginal.Height);
Graphics g = Graphics.FromImage(b);
g = pictureBoxOriginal.CreateGraphics();

int ancho = (int)Math.Abs(posRaton[indMascara].xr - posRaton[indMascara].xl);
int alto = (int)Math.Abs(posRaton[indMascara].yb - posRaton[indMascara].yt);

System.Drawing.Rectangle r = new System.Drawing.Rectangle(posRaton[indMascara].xl, posRaton[indMascara].yt, ancho, alto);
System.Drawing.SolidBrush brush1 = new System.Drawing.SolidBrush(Color.Black);
g.FillRectangle(brush1, r);
g.DrawRectangle(Pens.Red, r);
g.Dispose();

indMascara++;
textBoxNumMascaras.Text = indMascara.ToString();
nVecesClick = 0;
}
}

else
MessageBox.Show("Se ha excedido el número máximo de máscaras a introducir.");
}
}

catch
{
MessageBox.Show("Fallo al insertar una máscara de comparación.");
}
}



Aquí el fragmento de código que borra el último rectángulo:

private void buttonBorrarUltimaMascara_Click(object sender, EventArgs e)
{
try
{
if (indMascara > 0)
{
pictureBoxOriginal.Image.Dispose();
pictureBoxOriginal.Image = null;
mostrarImagenPictureBox(mRutaImagenOriginal, pictureBoxOriginal, out xScale, out yScale);

indMascara--;
textBoxNumMascaras.Text = indMascara.ToString();

Bitmap b = new Bitmap(pictureBoxOriginal.Width, pictureBoxOriginal.Height);
Graphics g = Graphics.FromImage(b);
g = pictureBoxOriginal.CreateGraphics();

for (int i = 0; i < indMascara; i++)
{
int ancho = (int)Math.Abs(posRaton[i].xr - posRaton[i].xl);
int alto = (int)Math.Abs(posRaton[i].yb - posRaton[i].yt);

System.Drawing.Rectangle r = new System.Drawing.Rectangle(posRaton[i].xl, posRaton[i].yt, ancho, alto);
System.Drawing.SolidBrush brush1 = new System.Drawing.SolidBrush(Color.Black);
g.FillRectangle(brush1, r);
g.DrawRectangle(Pens.Red, r);
}

g.Dispose();
b.Dispose();

}
}

catch { }
}


private void mostrarImagenPictureBox(string ruta, PictureBox pb, out float xS, out float yS)
{
FileStream fs = new FileStream(ruta, FileMode.Open);
pb.Image = System.Drawing.Image.FromStream(fs);
anchoImagenOriginal = pb.Image.Width;
altoImagenOriginal = pb.Image.Height;
xS = ((float)pb.Width) / anchoImagenOriginal;
yS = ((float)pb.Height) / altoImagenOriginal;
fs.Close();

pb.SizeMode = PictureBoxSizeMode.StretchImage;
//SetImage(pb);
}


Muchas gracias de antemano!

Etiquetas: picturebox
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:30.