es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Control TEdit personalizado de C++ VCL con transformación de texto.

Estoy considerando la creación de un control personalizado TEdit que transforme el texto (establecido a través de la propiedad Text) según el conjunto de caracteres de fuente actual.
Supongo que necesito sobrescribir el evento OnPaint y trabajar con la API de WinAPI (CreateText) para mostrar un texto diferente al texto real.

En detalle: El texto mostrado no es el texto real del control TEdit. Si la aplicación lee la propiedad Text del control, debería devolver el valor original, no el texto mostrado transformado según el conjunto de caracteres actual.

Agradecería un ejemplo/punto de entrada simple de cómo debería verse este tipo de método/evento.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un control personalizado TEdit que transforme el texto dependiendo del conjunto de caracteres de fuente actual, necesitaría:

    1. Heredar del control TEdit y anular el evento OnPaint.
    2. En el evento OnPaint, utilizar la función CreateText de WinAPI para crear un texto que sea diferente al texto actual del control.
    3. Establecer el texto de visualización utilizando la función SetText de WinAPI.
    4. Asegurarse de que se devuelve el valor original de la propiedad Text del control cuando se accede a ella.

    Aquí hay un ejemplo simple de cómo podría verse el evento OnPaint:

    void __fastcall TMyEdit::OnPaint() {
      TEdit::OnPaint();
      HDC dc = ::GetDC(this->Handle);
      HFONT hFont = ::SendMessage(this->Handle, WM_GETFONT, 0, 0);
      HFONT hOldFont = static_cast<hfont>(::SelectObject(dc, hFont));
      std::wstring wText = Text.c_str();
      // depending on the charset, transform the text here
      // ...
      ::SetText(dc, wText.c_str(), wText.size());
      ::SelectObject(dc, hOldFont);
      ::ReleaseDC(this->Handle, dc);
    }
    

    Nota: Esto es sólo un punto de partida y deberá personalizar la lógica de transformación para adaptarla a sus necesidades.

Comments are closed.