Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cursor parpadeante en TEdit

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cursor parpadeante en TEdit Responder citando

Hola, ¿ es posible cambiar el cursor de escritura (ojo no el cursor del ratón) cuando se posicionan por ejemplo en un TEdit? Me gustaría poner un rectangulo de color y además controlar la velocidad de intermitencia (sin necesidad de recurrir al Panel del Control del Windows), al estilo de los viejos terminales ...

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Añade el siguiente código bajo el apartado privado de la clase del Form:

- Esto lo que hace es crear el cursor en forma de rectángulo del ancho y alto de una letra (es importante que usemos solo fuentes de ancho fijo, por ejemplo: Courier New). También cambia la velocidad del parpadeo.
Código:
// Añadimos: #include <memory>

MESSAGE void __fastcall WmCommand(TWMCommand& msg)
{
    const TColor colorCursor = clRed;
    const int velocidadParpadeo = 200; // en milisegundos
    static int parpadeoAnterior;

    inherited::Dispatch(&msg);
    TEdit* edt = dynamic_cast<TEdit*>(FindControl(msg.Ctl));
    if (edt && msg.NotifyCode == EN_SETFOCUS)
    {
        // Creamos el bitmap que usaremos como cursor
        std::auto_ptr<Graphics::TBitmap> bmp(new Graphics::TBitmap);
        bmp->Canvas->Font = edt->Font;
        bmp->Width  = bmp->Canvas->TextWidth("X");
        bmp->Height = bmp->Canvas->TextHeight("X");
        // Pintamos la forma del cursor
        bmp->Canvas->Brush->Color = edt->Color;
        TRect r = bmp->Canvas->ClipRect;
        bmp->Canvas->FillRect(r);
        // Hacemos un XOR
        bmp->Canvas->Brush->Color = colorCursor;
        bmp->Canvas->CopyMode = cmPatInvert;
        bmp->Canvas->CopyRect(r, bmp->Canvas, r);

        CreateCaret(msg.Ctl, bmp->ReleaseHandle(), 0, 0);
        parpadeoAnterior = GetCaretBlinkTime();
        SetCaretBlinkTime(velocidadParpadeo);
        ShowCaret(msg.Ctl);
    }
    else if (edt && msg.NotifyCode == EN_KILLFOCUS)
    {
        DestroyCaret();
        SetCaretBlinkTime(parpadeoAnterior);
    }
}
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_COMMAND, TWMCommand, WmCommand)
END_MESSAGE_MAP(inherited)

La velocidad del parpadeo es global, por lo que no es recomendable cambiarlo, y si lo hacemos recordar restaurarlo a su estado anterior, aunque aun así si falla algo...

En el ejemplo el código tendrá efecto sobre todos los TEdit del Form.

Más información en la referencia del API de Windows.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

FUNCIONA LEO !!! ERES UN CRACK !!! Creo que se debería añadir en la sección de Trucos del foro. A veces es necesario refrescar la pantalla porque quedan rastros del cursor en los otros campos, si se ha utilizado el puntero del ratón para posicionarlo en un campo concreto, aún asi funciona correctamente si se utiliza la secuencia de tabuladores sin dejar ningún rastro. Muchas gracias Leo, una buena aportación.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.