Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-03-2005
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
Unhappy 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
Responder Con Cita
  #2  
Antiguo 14-03-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
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...
Responder Con Cita
  #3  
Antiguo 14-03-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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

Última edición por roman fecha: 14-03-2005 a las 20:27:46.
Responder Con Cita
  #4  
Antiguo 14-03-2005
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
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 .
Responder Con Cita
  #5  
Antiguo 14-03-2005
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 15-03-2005
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
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

Última edición por keyboy fecha: 15-03-2005 a las 03:17:19.
Responder Con Cita
  #7  
Antiguo 15-03-2005
[David] David is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Málaga
Posts: 417
Poder: 21
David Va por buen camino
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 .
Responder Con Cita
  #8  
Antiguo 16-03-2005
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 23:47:57.


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
Copyright 1996-2007 Club Delphi