Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

botones con formas personalizadas...

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: botones con formas personalizadas... Responder citando

Sera posible darle una forma en particular a los botones que trae c++ builder ya sea foto u otra cosa, como botones redondos elipticos, etc...

de antemano gracias...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

En LMDTools hay esa capacidad, así que imagino que sabiendo bien como funciona Builder por dentro es posible, pero ¿te merece la pena realmente?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Esta es una forma de hacer un boton redondo....
saludos...
bye

ARCHIVO BOTON.CPP
Código:

//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "RoundButton.h"
//---------------------------------------------------------------------------
static inline TRoundButton *ValidCtrCheck()
{
   return new TRoundButton(NULL);
}
//---------------------------------------------------------------------------
__fastcall TRoundButton::TRoundButton(TComponent* Owner)
   : TButton(Owner)
{
  FCanvas = new TCanvas; // creamos el objeto Canvas
}

__fastcall TRoundButton::~TRoundButton()
{
     delete FCanvas; // Liberamos el Canvas
}

   // Antes de crear el control se fijan una serie de parámetros,
   // entre los cuales está el estilo del botón
void __fastcall TRoundButton::CreateParams(TCreateParams &Params)
{
  TButton::CreateParams(Params); // La clase ascendiente se ocupará de establecer los parámetros generales
  Params.Style = Params.Style | BS_OWNERDRAW; // Nosotros indicamos que el control va a ser no estándar
}

   // Cada vez que Windows necesita dibujar un botón con el estilo
   // BS_OWNERDRAW envía este mensaje, solicitando las dimensiones
void __fastcall TRoundButton::CNMeasureItem(TWMMeasureItem& Mensaje)
{
    // Facilitamos la anchura y altura del control
  Mensaje.MeasureItemStruct->itemWidth = Width;
  Mensaje.MeasureItemStruct->itemHeight = Height;
}

    // Cada vez que haya que dibujar el control se llamará a este método
void __fastcall TRoundButton::CNDrawItem(TWMDrawItem& Mensaje)
{
   RECT Area;
   char Texto[256];

   strncpy(Texto, Caption.c_str(), 255); // Copiamos el título del botón
   Area = ClientRect; // y obtenemos el área que tenemos de trabajo

   // En el parámetro Mensaje existe una estructura DrawItemStruct, en
   // cuyo interior encontraremos el campo ItemState, que nos permitirá
   // conocer el estado del botón
  if (Mensaje.DrawItemStruct->itemState & ODS_SELECTED) // El botón está pulsado
     FCanvas->Pen->Color = clBtnHighlight; // Tomar el color destacado primero
  else FCanvas->Pen->Color = clWindowFrame; // en caso contrario tomar el color normal de borde

     // El Handle de FCanvas será el Hdc enviado en Mensaje.DrawItemStruct,
     // lo que nos permitirá dibujar en la superficie del botón
  FCanvas->Handle = Mensaje.DrawItemStruct->hDC;

  FCanvas->Pen->Width = 1;  // Anchura del lapiz
  FCanvas->Pen->Style = psSolid; // estilo continuo
  FCanvas->Brush->Style = bsSolid; // Relleno sólido
  FCanvas->Brush->Color = clBtnFace; // con el color de los botones

        // Dibujamos un contorno
  FCanvas->RoundRect(Area.left, Area.top, Area.right, Area.bottom,
        (Area.right-Area.left) * 2, (Area.bottom-Area.top) * 2);

        // Intercambiar el color del lápiz
  FCanvas->Pen->Color = FCanvas->Pen->Color == clWindowFrame ?
        clBtnHighlight : clWindowFrame;

        // Y dibujar la sombra interior
  FCanvas->RoundRect(Area.left, Area.top, Area.right-1, Area.bottom-1,
        (Area.right-Area.left) * 2 -2, (Area.bottom-Area.top) * 2 -2);

  if (Mensaje.DrawItemStruct->itemState & ODS_FOCUS) { // Si el botón es el control actual
   InflateRect(&Area, -4, -4); // En el interior del área

    FCanvas->Pen->Color = // Y según que esté pulsado o no
        Mensaje.DrawItemStruct->itemState & ODS_SELECTED ?
                clBtnShadow : clWindowFrame;

     FCanvas->Pen->Style = psDot;           // Dibujaremos una línea punteada
     FCanvas->Brush->Style = bsClear;       // sin rellenar

               // también con forma de elipse
     FCanvas->RoundRect(Area.left, Area.top, Area.right, Area.bottom,
        (Area.right-Area.left)*2, (Area.bottom-Area.top)*2);

     InflateRect(&Area, 4, 4); // Devolvemos a área su valor original
  }
         // Si el botón está pulsado
  if (Mensaje.DrawItemStruct->itemState & ODS_SELECTED)
     OffsetRect(&Area, 1, 1); // Desplazar un punto el área

  InflateRect(&Area, -5, -5); // Reducirla
  FCanvas->Font = Font; // tomar el tipo de letra seleccionado en el botón
      // Si el botón está desactivado y no éstá en modo de diseño
  if (! Enabled && ! ComponentState.Contains(csDesigning))
     FCanvas->Font->Color = clBtnShadow; // utilizar el color difuminado

          // y escribir el título
  DrawText(FCanvas->Handle, Texto, strlen(Texto),
           &Area, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

  FCanvas->Handle = 0; // Cuando hayamos terminado Handle debe ser cero
}

    // Al cambiar el estado del botón
void __fastcall TRoundButton::SetButtonStyle(bool ADefault)
{
   Refresh(); // simplemente redibujar
}


//---------------------------------------------------------------------------
namespace Roundbutton
{
   void __fastcall Register()
   {
      TComponentClass classes[1] = {__classid(TRoundButton)};
      RegisterComponents("Componentes", classes, 0);
   }
}
//---------------------------------------------------------------------------


ARCHIVO BOTON.H
Código:

//---------------------------------------------------------------------------
#ifndef RoundButtonH
#define RoundButtonH
//---------------------------------------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
#include <vcl\StdCtrls.hpp>
//---------------------------------------------------------------------------
class TRoundButton : public TButton
{
private:
    TCanvas * FCanvas; // Para dibujar
      // Mensaje de Windows solicitando el tamaño del control
    void __fastcall CNMeasureItem(TWMMeasureItem& Mensaje);
      // Mensaje de Windows solicitando que el control sea dibujado
    void __fastcall CNDrawItem(TWMDrawItem& Mensaje);
   BEGIN_MESSAGE_MAP
     MESSAGE_HANDLER(CN_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
     MESSAGE_HANDLER(CN_DRAWITEM, TWMDrawItem, CNDrawItem);
   END_MESSAGE_MAP(TButton);
protected:
      // Parámetros para la creación del control
    void __fastcall CreateParams(TCreateParams &Params);
      // Cambio del estado del botón
    void __fastcall SetButtonStyle(bool ADefault);
public:
   __fastcall TRoundButton(TComponent* Owner);
      // Redefinimos también el el destructor
    __fastcall ~TRoundButton();
__published:
};
//---------------------------------------------------------------------------
#endif


Espero te sirva.. pero igual, tu decides para que te sirve...
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Lun 20 Ago, 2007 5:38 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: hola amigos, pasos para utilizar el boton redondo Responder citando

Hola César C. Salazar González, oye Cesar con el archivo .h y el archivo .cpp que es lo que tengo que hacer para utilizar el boton redondo en un formulario de builder?

Si me puedes indicar los pasos por favor .
_________________
quiero aprender
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

1.- copiar el codigo y compilarlo con [Ctrl]+[F9]
2.- en la ventana de componentes debe aparecer una nueva solapa
de componentes llamada "componentes"
3.- usas el Boton y listo, ya puedes usar el boton redondo,

esto sirve para crear Componentes personalizados.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: duda en donde pegar los archivos .cpp y.h Responder citando

Copio el código del archivo .cpp y del .h y los pego pero donde (en el evento de un formulario en el evento de un boton o donde) disculpen mi ignorancia?

El codigo del los archivos .h y .cpp se pegan juntos o cual es proceso para el codigo del archivo .h y cual es el proceso para el archivo .cpp?


disculpame César hasta pena me da volverte a preguntar
_________________
quiero aprender
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.