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

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 11 Mar, 2021 12:47 pm Asunto: cambiar fuente de TEdit en modo ReadOnly |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Dom 14 Mar, 2021 3:16 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Dom 14 Mar, 2021 10:52 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 16 Mar, 2021 7:33 am Asunto: |
|
|
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 |
|
 |
|
|
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.
|