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 

cambiar fuente de TEdit en modo ReadOnly

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: cambiar fuente de TEdit en modo ReadOnly Responder citando

Hola
Hacía tiempo que no posteaba en este foro, pero llevo unos días buscando la solución, que aunque no es necesaria, si me parece "estética"

Será porque ya veo mucho menos que antes, pero cuando un Edit está en modo ReadOnly me cuesta leer ese "gris claro apgadado". Mi pregunta es: Hay algún modo de cambiar el color de la fuente, o la fuente o algo solo cuando esté en ReadOnly?

Gracias por adelantado y Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Para ello te pongo un ejemplo realizando un SubClassing. He escrito una clase que se encarga de ello de forma automática y te pone el texto en rojo si el Edit está Disable. El color lo pones como tu quieras.

Código:

//---------------------------------------------------------------------------
// MyEdit.h
//---------------------------------------------------------------------------

#include <Windows.h>

#ifndef STRICT
  typedef int  (__stdcall *PLRESULT)();
#else
  typedef WNDPROC PLRESULT;
#endif


class TMyEdit
{
  private:
  HWND hEdit;
  HWND Window;
  PLRESULT OldEditProc;
  COLORREF Color;

  static LRESULT __stdcall DefEditProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam);
  LRESULT __stdcall EditProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam);

  TMyEdit& ::operator=(const TMyEdit&){return *this;}
  TMyEdit(const TMyEdit&){};

  public:
  void SetColor(COLORREF Color);
  void SetHandle(HWND HEdit);
  TMyEdit();
  ~TMyEdit();
};
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// MyEdit.cpp
//---------------------------------------------------------------------------

// Tratamiento de Mensajes
LRESULT __stdcall TMyEdit::DefEditProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
{
  TMyEdit* pTMyEdit = (TMyEdit*)GetWindowLongPtr(hWnd, GWL_USERDATA);
  if(pTMyEdit)
    return pTMyEdit->EditProc(hWnd, Msg, WParam, LParam);
  else return DefWindowProc(hWnd, Msg, WParam, LParam);
}
//---------------------------------------------------------------------------

LRESULT __stdcall TMyEdit::EditProc(HWND hWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
{
  if(Msg == WM_PAINT && !IsWindowEnabled(hWnd)){
    PAINTSTRUCT ps;
    HDC hDC = BeginPaint(hWnd, &ps);
    SetTextColor(hDC, Color);
    int n = GetWindowTextLengthA(hWnd) + 1;
    char *C = new char[n];
    GetWindowTextA(hWnd, C, n);
    SelectObject(hDC, (HGDIOBJ)SendMessage(hWnd, WM_GETFONT, 0, 0));
    TextOutA(hDC, 1,1, C, n);
    delete [] C;
    EndPaint(hWnd, &ps);
  }

  return CallWindowProc(OldEditProc, hWnd, Msg, WParam, LParam);
}
//---------------------------------------------------------------------------

void TMyEdit::SetHandle(HWND HEdit)
{
  // Deshacemos Subclassing
  if(hEdit && (HEdit == INVALID_HANDLE_VALUE || !HEdit))
    SetWindowLong(hEdit, GWL_USERDATA, 0);
    SetWindowLong(hEdit, GWL_WNDPROC, (LONG)OldEditProc);
    InvalidateRect(hEdit, 0, 0);
    hEdit = 0;
  }
  // Iniciamos Subclassing
  if(HEdit != INVALID_HANDLE_VALUE && HEdit){
    hEdit = HEdit;
    SetWindowLongPtr(hEdit, GWL_USERDATA, (LONG)this);
    OldEditProc = (PLRESULT)SetWindowLongPtr(hEdit, GWL_WNDPROC, (LONG)TMyEdit::DefEditProc);
    InvalidateRect(hEdit, 0, 0);
  }
}
//---------------------------------------------------------------------------

void TMyEdit::SetColor(COLORREF color)
{
  Color = color;
  InvalidateRect(hEdit, 0, 0);
}
//---------------------------------------------------------------------------

TMyEdit::TMyEdit()
{
  Color = RGB(109, 109, 109);
}
//---------------------------------------------------------------------------

TMyEdit::~TMyEdit()
{
  SetHandle(0);
}
//---------------------------------------------------------------------------



Te muestro como usarlo en un formulario con un edit:
Código:

TMyEdit MyEdit;  // esto mejor lo pones como miembro del formulario. Un elemento por cada Edit que quieras modificar.
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  MyEdit.SetHandle(Edit1->Handle);
  MyEdit.SetColor(clRed);
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  Edit1->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
  Edit1->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   MyEdit.SetHandle(0);
}
//---------------------------------------------------------------------------


Este es el resultado:



Saludos.


Ultima edición por escafandra el Lun 15 Mar, 2021 8:03 am, editado 4 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Madre del amor hermoso!!!!! Siempre pensé que era algo mas simple

Muchísimas gracias escanfadra. Ahora me toca estudiar.

Saludos y, de nuevo, MUCHAS GRACIAS (si, gritando)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

La solución dada permite convertir uno o varios TEdit.
Otra solución puede ser crear un nuevo componente derivado de TEdit en el que se cambie como se "pinta" cuando está "disabled"

Saludos.
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.