FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
Cita:
Debes tener en cuenta que solo se va a ver así en Windows XP con los temas de escritorio activos. Saludos... |
#3
|
||||
|
||||
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:
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 21:27:46. |
#4
|
|||
|
|||
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 . |
#5
|
|||
|
|||
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.
|
#6
|
|||
|
|||
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; Última edición por keyboy fecha: 15-03-2005 a las 04:17:19. |
#7
|
|||
|
|||
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 . |
#8
|
|||
|
|||
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; Código:
type TMySpeedButton = class(TSpeedButton) private procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE; end; 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. bye |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|