Pues aqui esta lo que pude hacer con el codigo que me paso leo ya funciona el editor de propiedades aunque creo que es muy poco optimo , pero como puedo llamar a la funcion para que me modifique la forma del boton en tiempo de diseño una vez escojido el nuevo boton, codigo
//CPP
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "BitmapRgn.cpp"
#include "USwingBtn.h"
//---------------------------------------------------------------------------static inline TSwingBtn *ValidCtrCheck()
{
return new TSwingBtn(NULL);
}
//---------------------------------------------------------------------------
__fastcall TSwingBtn::TSwingBtn(TComponent* Owner)
: TButton(Owner)
{
_propsilueta = new TSiloute;
Parent=dynamic_cast<TWinControl*>(Owner);
_propsilueta->BMP="c:\\alianza.bmp";
SetRgn();
}
__fastcall TSwingBtn::~TSwingBtn()
{
delete _propsilueta;
}
//---------------------------------------------------------------------------
namespace Uswingbtn
{
void __fastcall Register()
{
TComponentClass classes[1] = {__classid(TSwingBtn)};
RegisterComponents("Swing Controls", classes, 0);
RegisterPropertyEditor(
__typeinfo(TSiloute),
__classid(TSwingBtn),
"Silueta",
__classid(TLoadBMP) );
}
}
//---------------------------------------------------------------------------
void __fastcall TSwingBtn::SetRgn(void){
hImagen = (HBITMAP) LoadImage(NULL, _propsilueta->BMP.c_str() , IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HRGN hRegion = BitmapRgn(hImagen, 0x0000FF00, 0x00FFFFFF);
SetWindowRgn(Handle,hRegion,true);
Application->MessageBox(_propsilueta->BMP.c_str() ,"",0);
}
//.H
//---------------------------------------------------------------------------
#ifndef USwingBtnH
#define USwingBtnH
//---------------------------------------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
#include <vcl\StdCtrls.hpp>
#include <DsgnIntf.hpp>
//---------------------------------------------------------------------------
class TSiloute : public TPersistent
{
private:
AnsiString _bmp;
public:
__fastcall TSiloute::TSiloute() {};
void __fastcall Assign(TPersistent *NwVal)
{
TSiloute *Prop = dynamic_cast<TSiloute*>( NwVal );
BMP= Prop->BMP;
}
__published:
__property AnsiString BMP = {read=_bmp,write=_bmp};
};
class TLoadBMP : public TClassProperty
{
public:
// En versiones anteriores a la 6 cambiamos
// _di_IFormDesigner por _di_IDesigner
__fastcall TLoadBMP() : TClassProperty() { }
virtual TPropertyAttributes __fastcall GetAttributes(void)
{
// Aqui es donde le decimos que muestre ese botoncito ...
return TPropertyAttributes() << paDialog;
}
virtual void __fastcall Edit(void)
{
// Aqui mostramos el form o la tarea que se tiene que ejecutar
// al pulsar ese botoncito
TSiloute *myProp = reinterpret_cast<TSiloute*>(GetOrdValue());
TOpenDialog *Od;
Od=new TOpenDialog(NULL);
Od->Execute();
myProp->BMP= Od->FileName;
}
};
class TSwingBtn : public TButton
{
private:
HBITMAP hImagen;
TSiloute *_propsilueta;
protected:
public:
void _fastcall SetBitmap(AnsiString Str);
__fastcall TSwingBtn(TComponent* Owner);
__fastcall ~TSwingBtn();
__published:
__property TSiloute *Silueta = {read=_propsilueta,
write=_propsilueta};
};
//---------------------------------------------------------------------------
#endif