none
DrawLine y DrawBorder VC++ RRS feed

  • Pregunta

  • Hola,

    Quiero hacer lo siguiente:

    Cargar una imagen en un picture box y pintarle los ejes como si fuese una gráfica.

    He probado distintos métodos:

    1.-  Dibujando líneas con Pen

    int Xini= pictureBox1->Location.X;
          int Yini= pictureBox1->Location.Y;
          int Xfin= pictureBox1->Location.X+ pictureBox1->Size.Width;
          int Yfin= pictureBox1->Location.Y+ pictureBox1->Size.Height;

    e->Graphics->DrawLine( blackPen, Point(Xini, Yini), Point(Xfin,Yini));

    //No dibuja la línea en las coordenadas deseadas.

    2.- Dibujando los bordes del pictureBox

    ControlPaint::DrawBorder(e->Graphics,this->ClientRectangle,Color::Black,ButtonBorderStyle::Solid);

    //Sólo pinta las líneas superio e izquierda!!!??

     

    Y por último, al intentar modificar el tamaña del rectángulo:

    Rectangle rect = this->ClientRectangle.Inflate(-5,8);

    Me da el siguiente error....

    error C2872: 'Rectangle' : símbolo ambiguo
    1>          puede ser 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wingdi.h(3989) : BOOL Rectangle(HDC,int,int,int,int)'
    1>          o       'c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.0\system.drawing.dll : System::Drawing::Rectangle'

    Alguna sugerencia?

    Gracias!

     


    Liiid
    viernes, 1 de julio de 2011 10:58

Respuestas

  • Hola Liiid:

     

    El problema que tienes es el siguiente: 

    this->ClientRectangle  ¿esta linea se refiere al Rectangle del Picture Box o al Rectangle de su Contenedor?.

     

    1. Te paso un fragmento de código que pinta unos ejes de coordenadas en un PictureBox:

     

    <span style="line-height:16px"> private void button5_Click(object sender, EventArgs e)
        {
          using (Graphics g = this.pictureBox1.CreateGraphics())
          {
            using (Pen p = new Pen(Color.Red, 1))
            {
              Rectangle r = this.pictureBox1.ClientRectangle;
              g.DrawLine(p,new Point(r.Width/2,r.Y),new Point(r.Width/2,r.Bottom-1));
              g.DrawLine(p, new Point(0, r.Height / 2), new Point(r.Right - 1, r.Height / 2));
            }
          }
        }</span>
    


    2. Te paso un fragmento de código que pinta los bordes al PictureBox.

     

     private void button4_Click(object sender, EventArgs e)
        {
          using (Graphics g = this.pictureBox1.CreateGraphics())
          {
            using (Pen p = new Pen(Color.Red,1))
            {
              Rectangle r = new Rectangle(new Point(0,0),new Size(this.pictureBox1.Width-1,this.pictureBox1.Height-1));
              g.DrawRectangle(p, r);
            }
          }
          
        }
    

    Como puedes observar tanto el objeto Graphics como el los rectangulos son del PictureBox. No de su contenedor. Para probarlo solamente tienes que crear un proyecto WinForms en

    c# y añadir dos botones. Uno pinta el borde y el otro el eje.

     

    Después pasalo a c++;

    Saludos,

    Pedro.


    phurtado
    • Marcado como respuesta Liiid lunes, 4 de julio de 2011 14:03
    lunes, 4 de julio de 2011 11:55

Todas las respuestas

  • hola

    cuando gtraticas tienes en cuenta que las coordenas simrpe son desde la esquina superior izquiera

    ademas veo que haces

    int Xini= pictureBox1->Location.X

    pero alli se toma la posicion del control dentro del formulario, no creo que sea bueno para tomar como coordenada de un punto dentro del propio Picturebox, para dibujar

    si pones puntos de coordenadas de forma fija se grafican als lineas ? o sea para descartar que las lineas si parecen si pones valores directos, proque creo que un problema es que el trabajr con el Locatiuon esta dando valores incorrectos, como comente este es la posicion del picturebox en el form

    'Rectangle' : símbolo ambiguo

    puede que estes teniendo conflictosson dos librerias que definen la clase Rectangl, si pones

    System.Drawing.Rectangle rect = ...

    o sea con el namespace completo sigue con el fallo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 1 de julio de 2011 11:12
  • Las líneas que quiero pintar no son dentro del picturBox, son en los bordes o 1/2 pixel por fuera...por eso tomo esa referencia...pero los valores que me da no son los reales de localización del pictureBox...Me pinta líneas pero no donde quiero.

    Con respecto al otro punto, he conseguido crear un rectángulo:

    System::Drawing::Rectangle rect = this->ClientRectangle;
    rect=rect.Inflate(-5,8); //aquí falla!

    ¿Cómo puedo modificar las dimensiones?


    Liiid
    viernes, 1 de julio de 2011 12:03
  • Hola:

     

    Te voy a pasar el codigo en c# para pintar que hace años y ya no me acuerdo de c++ :)

     

    Lo que tienes que hacer es lo siguiente:

     

    Rectangle r = new Rectangle(this.ClientRectangle.X,this.ClientRectangle.Y,this.ClientRectangle.Width-1,this.ClientRectangle.Height-1);

    Eso te va a solucionar el problema de 

     

    //No dibuja la línea en las coordenadas deseadas.

     

    Saludos.


    phurtado
    viernes, 1 de julio de 2011 12:39
  • Hola Pedro,

     

    He probado con tu solución pero me pasa lo mismo que con DrawBorder, me pinta sólo las líneas superior e izquierda.

    He probado sumando y restando pixeles pero esas dos líneas no aparecen nunca...

     

    Saludos.


    Liiid
    lunes, 4 de julio de 2011 6:51
  • Hola Liiid:

     

    El problema que tienes es el siguiente: 

    this->ClientRectangle  ¿esta linea se refiere al Rectangle del Picture Box o al Rectangle de su Contenedor?.

     

    1. Te paso un fragmento de código que pinta unos ejes de coordenadas en un PictureBox:

     

    <span style="line-height:16px"> private void button5_Click(object sender, EventArgs e)
        {
          using (Graphics g = this.pictureBox1.CreateGraphics())
          {
            using (Pen p = new Pen(Color.Red, 1))
            {
              Rectangle r = this.pictureBox1.ClientRectangle;
              g.DrawLine(p,new Point(r.Width/2,r.Y),new Point(r.Width/2,r.Bottom-1));
              g.DrawLine(p, new Point(0, r.Height / 2), new Point(r.Right - 1, r.Height / 2));
            }
          }
        }</span>
    


    2. Te paso un fragmento de código que pinta los bordes al PictureBox.

     

     private void button4_Click(object sender, EventArgs e)
        {
          using (Graphics g = this.pictureBox1.CreateGraphics())
          {
            using (Pen p = new Pen(Color.Red,1))
            {
              Rectangle r = new Rectangle(new Point(0,0),new Size(this.pictureBox1.Width-1,this.pictureBox1.Height-1));
              g.DrawRectangle(p, r);
            }
          }
          
        }
    

    Como puedes observar tanto el objeto Graphics como el los rectangulos son del PictureBox. No de su contenedor. Para probarlo solamente tienes que crear un proyecto WinForms en

    c# y añadir dos botones. Uno pinta el borde y el otro el eje.

     

    Después pasalo a c++;

    Saludos,

    Pedro.


    phurtado
    • Marcado como respuesta Liiid lunes, 4 de julio de 2011 14:03
    lunes, 4 de julio de 2011 11:55
  • Hola sopita:

    Totalmete de acuerdo con lo que dices.

     

    Saludos,

     


    phurtado
    lunes, 4 de julio de 2011 13:09
  • Oh!Gracias!! Qué despiste y lo peor que con todas las vueltas que le he dado no lo veía...

    Efectivamente el fallo estaba en:

    this->ClientRectangle;

     

    Se refería al pictureBox así que...

     

    this->pictureBox1->ClientRectangle;

     

    Gracias!


    Liiid
    lunes, 4 de julio de 2011 14:02
  • No lo sabía y me ha ayudado también para esto...

     

    Gracias!


    Liiid
    lunes, 4 de julio de 2011 14:03