 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Mar 23 Mar, 2004 7:34 am Asunto: botones con formas personalizadas... |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 23 Mar, 2004 2:45 pm Asunto: |
|
|
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... _________________

Ultima edición por Cesar C. Salazar Gonzalez el Lun 20 Ago, 2007 5:38 pm, editado 1 vez |
|
| Volver arriba |
|
 |
pollo_c Cdt

Registrado: 21 Dic 2006Mensajes: 17
|
Publicado: Lun 20 Ago, 2007 3:08 pm Asunto: hola amigos, pasos para utilizar el boton redondo |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 20 Ago, 2007 5:40 pm Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
pollo_c Cdt

Registrado: 21 Dic 2006Mensajes: 17
|
Publicado: Lun 20 Ago, 2007 6:37 pm Asunto: duda en donde pegar los archivos .cpp y.h |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|