 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ciberale Cdt

Registrado: 17 Oct 2003Mensajes: 18
|
Publicado: Mar 20 Sep, 2005 4:31 pm Asunto: Cursor parpadeante en TEdit |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 20 Sep, 2005 9:44 pm Asunto: |
|
|
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 |
|
 |
ciberale Cdt

Registrado: 17 Oct 2003Mensajes: 18
|
Publicado: Mar 20 Sep, 2005 11:34 pm Asunto: |
|
|
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|