Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/01/2013, 04:01
frankito5
 
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!