Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Enfocar un botón al pasar el puntero del ratón (https://www.clubdelphi.com/foros/showthread.php?t=19425)

David 14-03-2005 18:32:26

Enfocar un botón al pasar el puntero del ratón
 
Hola

Si os fijais cuando escribis cualquier post , debajo hay dos botones "Enviar nuevo hilo" y "Vista previo del envío" ,cuando pasais el puntero del ratón por encima de cualquiera de estos botones , el borde de estos se amarillenta dando la sensación de que el foco esta en ellos.

Pues me gustaria saber como se consigue este efecto en Delphi , tengo Delphi 6 , y no sé si hace falta un botón especial o se puede hacer con cualquier botón , yo particularmente lo quiero usar en un bitbtn , puesto que además puedes poner en un gliph.

Luego , también queria decir otra cosa , aunque no se si tiene relación , puesto que me gustaria saber como se puede hacer botones , para hacer un panel tactil , no sé si se hacen con botones especiales , o con los botones que he expuesto antes.

Un saludo

maeyanes 14-03-2005 20:13:14

Cita:

Empezado por David
Hola

Si os fijais cuando escribis cualquier post , debajo hay dos botones "Enviar nuevo hilo" y "Vista previo del envío" ,cuando pasais el puntero del ratón por encima de cualquiera de estos botones , el borde de estos se amarillenta dando la sensación de que el foco esta en ellos.

Pues me gustaria saber como se consigue este efecto en Delphi , tengo Delphi 6 , y no sé si hace falta un botón especial o se puede hacer con cualquier botón , yo particularmente lo quiero usar en un bitbtn , puesto que además puedes poner en un gliph.

Los botones que mencionas los ves así por Windows XP y el tema Luna. Para que tu aplicación se vea así, necesitas un componente llamado XPManifest, el cual se encuentra en la pestaña Win32 (no recuerdo bien si en Delphi 6 viene este componente). Solo colocas el componente en la forma principal de tu aplicación y lo demás es automático.

Debes tener en cuenta que solo se va a ver así en Windows XP con los temas de escritorio activos.

Saludos...

roman 14-03-2005 20:22:32

La mayoría de controles en Delphi reciben los mensajes CM_MOUSEENTER y CM_MOUSELEAVE cuando el cursor del ratón entra o sale del control.

Desafortunadamente sólo el TLabel (que yo sepa) implementa los correspondientes eventos OnMouseEnter y OnMouseLeave.

Así que, para poder utilizar los mensajes mencionados en controles como el SpeedButton tienes que crear un control descendiente que implemente los eventos:

Código Delphi [-]
unit MySpeedButton;

interface

uses
  Messages, Classes, Controls, Buttons;

type
  TMySpeedButton = class(TButton)
  private
    FOnMouseEnter: TNotifyEvent;
    FOnMouseLeave: TNotifyEvent;

    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;

  published
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMySpeedButton]);
end;

procedure TMySpeedButton.CMMouseEnter(var Msg: TMessage);
begin
  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TMySpeedButton.CMMouseLeave(var Msg: TMessage);
begin
  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.

Como ves, CMMouseEnter y CMMouseLeave son manejadores de los mensajes CM_MOUSEENTER y CM_MOUSELEAVE que simplemente llaman a los eventos OnMouseEnter y OnMouseLeave(siempre y cuando se hayan asignado durante el diseño).

Cuando insertes un TMySpeedButton, usas estos eventos para hacer cualquier cosa que desees cuando el ratón entre o salga.

EDITO:

Viendo la respuesta de maeyanes me percato de que es más correcto lo que él dice. Como nunca uso los temas de XP no lo había notado. Mi solución podría servirte en caso de que no quieras depender de los temas de XP.

// Saludos

David 14-03-2005 21:14:41

Si uso Windows XP , no tengo el componente XPManifest en win32 , ni tampoco esta en otra paleta .

Así que he decidido pues crear el control que propone Román.Pero no tengo idea como acerlo , he intentado copiar el codigo tal y como esta en una unidad ,pero luego no se que hacer , ni si hay que establecerlo en una aplicación.

La duda ahora es como se crea dicho componente . :confused:

David 14-03-2005 21:55:48

Al fin he conseguido crear el nuevo control , es cierto que tiene un evento OnMouseEnter y OnMouseLeave ,pero no sé como con estos eventos crear el efecto del que he hablado antes.

keyboy 15-03-2005 03:14:20

Supongo que la idea de roman es que uses estos eventos para dibujar tú mismo el borde cuando pasas el ratón y borrarlo cuando sales. Lo que pasa es que no es tan fácil porque el SpeedButton no publica la propiedad Canvas que es la que te permite dibujar.

Pero puedes modificar la componente en sí para dibujar el borde desde la misma componente:

Código:

procedure TMySpeedButton.CMMouseEnter(var Msg: TMessage);
var
  R: TRect;
 
begin
  if not (csDesigning in ComponentState) then
  begin
        R := ClientRect;
        InflateRect(R, -1, -1);
        Canvas.Pen.Color := clYellow;
        Canvas.Pen.Width := 2;
        Canvas.Rectangle(R);
  end;
end;
 
procedure TMySpeedButton.CMMouseLeave(var Msg: TMessage);
begin
  Refresh;
 
  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

Bye

David 15-03-2005 19:50:28

Bueno KeyBoy , he probado el código que me has puesto y falla este código :

if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);

El compilador dice que Undeclarades indentifier "FOnMouseLeave" .

Luego he puesto comentario al código que falla y he probado el código y cuando paso el puntero por el nuevo botón ,se ilumina de amarillo el borde del formulario , no así el del botón .

keyboy 16-03-2005 00:25:36

Me da la impresión de que colocaste el código en los eventos y no en los manejadores de los mensajes.

Recuerda, los eventos son los que te asigna el IDE cuando das doble click sobre ellos en el inspector de objetos:

Código:

procedure MySpeedButton1MouseEnter(Sender: TObject);
begin
end;

procedure MySpeedButton1MouseLeave(Sender: TObject);
begin
end;

mientras que los manejadores de los mensajes son los que declaras en la componente:

Código:

type
  TMySpeedButton = class(TSpeedButton)
  private
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  end;

Los primeros- los eventos - viven en el formulario donde insertas la componente y por ello el compilador no reconoce términos como FOnMouseLeave pues éste pertenece a la componente y no al formulario.

Cuando comentas la línea el compilador no falla pero, dado que estás en el formulario, ClientRect se refiere a éste y no al SpeedButton y de ahí que te pinte el borde en el formulario.

Para que no te confundas ólvidate por ahora de los eventos y concéntrate en los mensajes. El código completo de la componente quedaría así:

Código:

unit MySpeedButton;

interface

uses
  Windows, Messages, Classes, Controls, Buttons, Graphics;

type
  TMySpeedButton = class(TSpeedButton)
  private
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMySpeedButton]);
end;

procedure TMySpeedButton.CMMouseEnter(var Msg: TMessage);
var
  R: TRect;

begin
  if not (csDesigning in ComponentState) then
  begin
    R := ClientRect;
    InflateRect(R, -1, -1);
    Canvas.Pen.Color := clYellow;
    Canvas.Pen.Width := 2;
    Canvas.Rectangle(R);
  end;
end;

procedure TMySpeedButton.CMMouseLeave(var Msg: TMessage);
begin
  Refresh;
end;

end.

Elimina la anterior e instala ésta. Prueba en un nuevo proyecto; si lo haces en donde ya hayas insertado la versión anterior te va a marcar un error por no encontrar OnMouseEnter y OnMouseLeave.

bye


La franja horaria es GMT +2. Ahora son las 16:39:01.

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