Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Como asignar evento MouseEnter y MouseLeave a componente (https://www.clubdelphi.com/foros/showthread.php?t=85130)

NEG1414 03-02-2014 11:47:37

Como asignar evento MouseEnter y MouseLeave a componente
 
Buenas... He creado un componente apartir de la Clase TCustomControl


Código:


  class PACKAGE TMiComponente : public TCustomControl

Necesito que TMiComponente contenga los eventos OnMouseMove, OnMouseUp, MouseEnter y MouseLeave...
Con los dos primeros no he tenido problemas, los hereda de TCustomControl y con declararlos de la forma:

Código:


 __published:
    __property OnMouseMove;
    __property OnMouseUp;

puedo acceder ha ellos

Situacion diferente afecta a MouseEnter y MouseLeave que supongo no son eventos de TCustomControl .

Creo que tengo que capturar los mensajes MouseEnter y MouseLeave

Código:


 
    //Mesaje entrar raton en componente
    void __fastcall CMMouseEnter (TMessage Message);
 
    //Mesaje salir raton del componente
    void __fastcall CMMouseLeave (TMessage Message);
 
    BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter);
    VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave);
    END_MESSAGE_MAP (TCustomControl);
 
  void __fastcall  TMiComponente::CMMouseEnter(TMessage Message)
    {
      .....................
    }
 
 
  void __fastcall  TMiComponente::CMMouseLeave(TMessage Message)
    {
      .....................
    }

Hasta aqui correcto dentro del propio componente detecto la entrada y salida del raton... el problema es que no se como hacer para que al igual que los componentes OnMouseMove, OnMouseUp formen parte de los eventos del componente y pueda acceder a ellos "externamente"
en fase de diseño cuando forman parte de otros componentes..

Alguna idea... Gracias

Nota: HE intentado borrar el mensaje anterior enviado por error pero no doy LO SIENTO

ecfisa 03-02-2014 16:21:50

Hola NEG1414.


A modo de guía, debería ser similar a esto:

MiComponente.h
Código:

#ifndef MiComponenteH
#define MiComponenteH

#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>

class PACKAGE TMiComponente : public TCustomControl
{
private:  // User declarations
  TNotifyEvent FOnMouseEnter;
  TNotifyEvent FOnMouseLeave;

protected:
  void __fastcall CMMouseEnter(Messages::TMessage &Message);
  void __fastcall CMMouseLeave(Messages::TMessage &Message);
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, CMMouseEnter)
    MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
  END_MESSAGE_MAP(TCustomControl)

public: // User declarations
  __fastcall TMiComponente(TComponent* Owner);

__published:  // IDE-managed Components
  __property TNotifyEvent OnMouseEnter= {read= FOnMouseEnter, write= FOnMouseEnter};
  __property TNotifyEvent OnMouseLeave= {read= FOnMouseLeave, write= FOnMouseLeave};
  //...
};

#endif

MiComponente.cpp
Código:

#include <vcl.h>

#pragma hdrstop
#include "MiComponente.h"
#pragma package(smart_init)

// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
static inline void ValidCtrCheck(TMiComponente *)
{
  new TMiComponente(NULL);
}

__fastcall TMiComponente::TMiComponente(TComponent* Owner) : TCustomControl(Owner)
{
  FOnMouseEnter = 0;
  FOnMouseLeave = 0;
}

void __fastcall TMiComponente::CMMouseEnter(Messages::TMessage &Message)
{
  if (FOnMouseEnter)
    FOnMouseEnter(this);
}

void __fastcall TMiComponente::CMMouseLeave(Messages::TMessage &Message)
{
  if (FOnMouseLeave)
    FOnMouseLeave(this);
}

namespace Micomponente
{
  void __fastcall PACKAGE Register() {
    TComponentClass classes[1] = {__classid(TMiComponente)};
    RegisterComponents("Samples", classes, 0);
  }
}

Saludos :)

NEG1414 04-02-2014 09:59:42

Sencillamente perfecto.... Gracias


La franja horaria es GMT +2. Ahora son las 21:29:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi