none
otra sobre Grapics RRS feed

  • Pregunta

  • hola a todos, ya pude puedo dibujar a mano alzada.

    miren el codigo:

    primero declaro como una variable global.

    bool bol;

    luego en el evento MouseDown de un pictureBox

    private: System::Void pictureBox1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                       bol=true;             

                 }

    luego en el evento MouseUp del mismo pictureBox.

    private: System::Void pictureBox1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                       bol=false;

                 }

    por ultimo al evento MouseMove

    private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

          int x,y;         

          Brush^ cep;

          Graphics^ g=pictureHoja->CreateGraphics();          

          if(bol==true){   

          cep=gcnew SolidBrush(Color::Blue);            

          g->FillEllipse(cep,e->X,e->Y,20,20);                      

                 }}

    cuando ejecuto mi programa inicia y ya puedo pintar

    pero lo que e intentado es que haga lo mismo pero solo cuando hago click un boton.

    lo he intentado muchas veces hasta me he pasado horas, pero nada de nada.

    http://s3.subirimagenes.com:81/imagen/previo/thump_5636450cap.png

    otro problema es que cuando minimizo o pongo una ventana delante delante se borra todo lo pintado.

    que sugerencia o idea me pueden dar.

    sábado, 11 de diciembre de 2010 14:55

Respuestas

  • Pues podrías crearte otra lista con los puntos a dibujar para el otro pincel, y según el boton que tengas presionando lo guardas en una lista o en otra.

    Si vas a realizar algo más complejo con varios tipos de pinceles o herramientas, podrías crear una entidad llamada, por ejemplo Accion, que contenga la herramienta a aplicar (el pincel en este caso) y como se aplica (la lista de puntos). De modo que cada vez que haces una pincelada se registre como una acción que quedaría determinada por los tres eventos: MouseDown - MouseMove - MouseUp. Espero que con esto último que te he explicado no te lies más...

    • Marcado como respuesta NovaG8 martes, 11 de enero de 2011 12:55
    lunes, 13 de diciembre de 2010 21:44

Todas las respuestas

  • hola

    la verdad estoy un

    private: System::Void pictureBox1_Click(System::Object^  sender, System::EventArgs^  e)
    {
       bol = !bol;            
    }

    por supuesto define la variable "bol" por defecto en falso apenas comience el programa, de esta forma al primer click pasara a true y comenzara a dibujar, cuando vuelva a presionar click pasara a false y dejara de hacerlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 12 de diciembre de 2010 4:07
  • gracias Leandro,  voy a probar al llegar a mi cuarto por que estoy en un cyber.

    si no seria mucha molestia me podrias decir si sera lo mismo para varios botones que contenga diferenres pinceles.

    lo que he intentado es algo como esto(disculapa si esta mal pero soy novato):

    private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                   

          Brush^ cep;

          Graphics^ g=pictureHoja->CreateGraphics();

          if(boton1->presset){   //esto seria si preciono en boton1    

          if(bol==true){     

          cep=gcnew SolidBrush(Color::Blue);            

          g->FillEllipse(cep,e->X,e->Y,20,20);                      

                 }}

          if(boton2->presset){  //esto seria si preciono el boton1

           if(bol==true){   

           cep=gcnew SolidBrush(Color::Red);            

    }

    }

    disculpa si no tiene concordancia el codigo, como ya dige soy novato.

    espero respuestas, gracias.

     

     

         

          g->FillEllipse(cep,e->X,e->Y,20,20); 

    domingo, 12 de diciembre de 2010 14:43
  • uyuyuy disculpen hubo un error y ya no deja editar.

    g->FillEllipse(cep,e->X,e->Y,20,20);

    va despues de :

    cep=gcnew SolidBrush(Color::Red);

    domingo, 12 de diciembre de 2010 14:59
  • El problema que tienes a la hora de minimizar y restaurar la ventana, o en cualquier otra situacion que se produzca el repintado del componente es que a la hora de que se repinte este no contiene ninguna información adicional para poder dibujar lo que tu has añadido. Por lo tanto eso debes controlarlo tu, tienes dos formas: o controlas el evento Paint, o creas una clase que herede de PictureBox y sobreescribes el método OnPaint para que se pinte el componente según la info que tengas almacenada.
    lunes, 13 de diciembre de 2010 16:53
  • si ese es el problema, pero no lo he podido implentar. no se como, si serias tan amable podrias poner un ejemplo de codigo:

     

    lunes, 13 de diciembre de 2010 19:21
  • Vale, lo que veo que haces es que en el evento MouseMove pintas una elipse sobre el picturebox: g->FillEllipse(cep,e->X,e->Y,20,20). Lo que tienes que hacer es en el MouseMove guardar esos puntos en una lista y a la hora de repintar, pintas los puntos que hay almacenados en la lista. Ten en cuenta que si en algún momento tienes que borrar el contenido del picture box, tendrás que borrar el contenido de esa lista.

    Te dejo un código de ejemplo, que aunque está escrito en C#, no creo que te suponga problema comprenderlo:

     

    private List<Point> _points = new List<Point>();
    
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
      _points.Add(new Point(e.X, e.Y));
    }
    
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
      Graphics g = e.Graphics;
      SolidBrush brush = new SolidBrush(Color.Black);
    
      foreach (Point p in _points)
      {
        g.FillEllipse(brush,p.X,p.Y,20,20);
      }
    }
    
    
    lunes, 13 de diciembre de 2010 19:47
  • gracias parece comprencible, la verdar es todos los codigos que encontrado han sido de c# y como la sintaxis es casi igual lo he podido pasar a visual c++.

    voy a ver si me sirve.

    Otra cosa que pregunte es como lo haria si tuviera varios pinceles en diferentes botones, hay probado con este codigo, que mediante if selecciona pero no me ha funcionado, no se si sera valido.

    private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {

                   

          Brush^ cep;

          Graphics^ g=pictureHoja->CreateGraphics();

          if(boton1->presset){   //esto seria si preciono en boton1    

          if(bol==true){     

          cep=gcnew SolidBrush(Color::Blue);            

          g->FillEllipse(cep,e->X,e->Y,20,20);                      

                 }}

          if(boton2->presset){  //esto seria si preciono el boton1

           if(bol==true){   

           cep=gcnew SolidBrush(Color::Red);            

    }

    }

     

    lunes, 13 de diciembre de 2010 20:48
  • Pues podrías crearte otra lista con los puntos a dibujar para el otro pincel, y según el boton que tengas presionando lo guardas en una lista o en otra.

    Si vas a realizar algo más complejo con varios tipos de pinceles o herramientas, podrías crear una entidad llamada, por ejemplo Accion, que contenga la herramienta a aplicar (el pincel en este caso) y como se aplica (la lista de puntos). De modo que cada vez que haces una pincelada se registre como una acción que quedaría determinada por los tres eventos: MouseDown - MouseMove - MouseUp. Espero que con esto último que te he explicado no te lies más...

    • Marcado como respuesta NovaG8 martes, 11 de enero de 2011 12:55
    lunes, 13 de diciembre de 2010 21:44
  • gracias, ya termine mi trabajo. disculpa la demora.
    martes, 11 de enero de 2011 12:55