jueves, 9 de febrero de 2012

Dibujo De Un Rectángulo Utilizando La API De Windows (Versión 2)

Bueno chavos que onda!, pues en esta ocasión continuaremos con la aplicación para dibujar rectángulos que hicimos la vez anterior ¿recuerdan? Bueno pues trabajaremos con ese programa como base modificando varias cosas para realizar algo más avanzado.

Bueno primero tendremos que modificar la forma que teníamos y al final tenemos que tener una forma con los siguientes componentes:
-5 botones
-3 Edit (conocidos en C# como textBox)
-2 UpDown los cuales tendremos que asociar con 2 de los edit a través de su propiedad "Associate"
-7 TrackBar
-1 ComboBox
-6 Labels

Acomodamos los componentes de la siguiente manera:


Los botones realizan las mismas acciones que explicamos en la aplicación pasada, ahora la novedad de esta aplicación es que podemos manejar a nuestro gusto el tamaño de el rectángulo que deseamos dibujar, así como el color y estilo de la brocha (relleno) y el color y estilo del contorno (pluma).

El ancho y alto los manejamos con los Edit asociados con los UpDown, el color de relleno los cambiamos con los TrackBar de la parte superior combinando los 3 colores primarios (el famoso RGB), el ComboBox lo utilizamos para cambiar el estilo de pluma del contorno y los 3 TrackBar restantes los dejamos para manejar el color del contorno. Finalmente agregamos otro botón solo para cerrar la aplicación. El código es el siguiente:

int red=0, green=0, blue=0, largo=0, ancho=0, pred=255, pgreen=0, pblue=0, top=50, left=70;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int ps = ComboBox1->ItemIndex;
        HPEN hpen, hpenOld;
        HBRUSH hbrush, hbrushOld;
        HDC hdc = this->Canvas->Handle;
        hpen = CreatePen(ps, TrackBar4->Position, RGB(pred, pgreen, pblue));
        hbrush = CreateSolidBrush(RGB(red, green, blue));
        hpenOld = SelectObject(hdc, hpen);
        hbrushOld = SelectObject(hdc, hbrush);
        Rectangle(hdc, top,left, Edit1->Text.ToInt()+top,Edit2->Text.ToInt()+left);
        SelectObject(hdc, hpenOld);
        DeleteObject(hpen);
        SelectObject(hdc, hbrushOld);
        DeleteObject(hbrush);
        largo = Edit1->Text.ToInt();
        ancho = Edit2->Text.ToInt();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
    red = this->TrackBar1->Position;
    Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
     green = this -> TrackBar2 -> Position;
     Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar3Change(TObject *Sender)
{
     blue = this -> TrackBar3 -> Position;
     Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown2Click(TObject *Sender, TUDBtnType Button)
{
        UpDown1Click(Sender, Button);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar4Change(TObject *Sender)
{
        UpDown1Click(Sender, 0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        TRect Recto2(125, 140, 300, 200);
        HDC hDC = Canvas->Handle;
        DrawEdge(hDC, &Recto2, BDR_RAISEDOUTER | BDR_SUNKENINNER, BF_RECT);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
        RECT Recto;
        Recto.left = 70;
        Recto.top = 80;
        Recto.right = 370;
        Recto.bottom = 330;
        //Aqui utilizamos directamente el Canvas
        Canvas->Rectangle(Recto);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
        TRect Recto(top,left, Edit1->Text.ToInt()+top,Edit2->Text.ToInt()+left);
        HDC hDC = Canvas->Handle;
        DrawEdge(hDC, &Recto, BDR_RAISEDOUTER | BDR_SUNKENINNER, BF_RECT);
        SetTextColor(hDC,RGB(red,green,blue));
        //char *cad="hola";
        char *cad=new char[Edit3->Text.Length()];
        strcpy(cad, Edit3->Text.c_str());
        DrawText(hDC,cad,strlen(cad),&Recto,DT_CENTER); //DT_RIGHT);//DT_LEFT;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
        Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
        int ps = ComboBox1->ItemIndex;
        HPEN hpen, hpenOld;
        HBRUSH hbrush, hbrushOld;
        HDC hdc = Canvas->Handle;
        hpen = CreatePen(ps, TrackBar4->Max, Form1->Color);
        hbrush = CreateSolidBrush(Form1->Color);
        hpenOld = SelectObject(hdc, hpen);
        hbrushOld = SelectObject(hdc, hbrush);
        Rectangle(hdc, top, left, largo + top, ancho + left);
        SelectObject(hdc, hpenOld);
        DeleteObject(hpen);
        SelectObject(hdc, hbrushOld);
        DeleteObject(hbrush);
        Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar5Change(TObject *Sender)
{
        pred = TrackBar5->Position;
        Button1Click(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar6Change(TObject *Sender)
{
        pgreen = TrackBar6->Position;
        Button1Click(Sender);        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar7Change(TObject *Sender)
{
        pblue = TrackBar7->Position;
        Button1Click(Sender);
}
//---------------------------------------------------------------------------

Podemos correr ahora nuestra aplicación para probar lo hecho hasta ahora:


Podemos añadirle una función más al programa para que se vea más genial y de paso aprendemos nuevas cosas. Lo último que haremos sera que la función de dibujar se realice con el clic del ratón, y que su tamaño cambie al ser arrastrado con el cursor. Aquí tenemos el código para realiza estas acciones:

void TForm1::Borrar()
{
        int ps = ComboBox1->ItemIndex;
        HPEN hpen, hpenOld;
        HBRUSH hbrush, hbrushOld;
        HDC hdc = Canvas->Handle;
        hpen = CreatePen(ps, TrackBar4->Max, Form1->Color);
        hbrush = CreateSolidBrush(Form1->Color);
        hpenOld = SelectObject(hdc, hpen);
        hbrushOld = SelectObject(hdc, hbrush);
        Rectangle(hdc, top, left, largo + top, ancho + left);
        SelectObject(hdc, hpenOld);
        DeleteObject(hpen);
        SelectObject(hdc, hbrushOld);
        DeleteObject(hbrush);
}
 //------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
        Borrar();
        top = X;
        left = Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
        if(Button==mbLeft)
        {
                Borrar();
                Edit1->Text = X - top;
                Edit2->Text = Y - left;
                Button1Click(Sender);
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
        if(Shift.Contains(ssLeft))
        {
                FormMouseUp(Sender, mbLeft, Shift, X, Y);
        }
}
//---------------------------------------------------------------------------


Ahora compilamos de nuevo y corremos la aplicación,  probamos la nueva función añadida.

Bueno amigos eso fue todo por esta ocasión, nos vemos en la siguiente para seguir realizando aplicaciones gráficas en C++ Builder y seguir aprendiendo. Hasta la próxima!

No hay comentarios:

Publicar un comentario