Ya tengo el código!!!!
Si el RichEdit no tiene barras de Scroll funciona perfectamente. Para el caso en el que las barras existan tuve que responder también al mensaje WM_CHAR, para que si al escribir movemos las barras de Scroll la linea se siga dibujando.
Sin embargo si movemos el Scroll manualmente la linea no se dibuja hasta que la soltamos, eso aún tengo que arreglarlo, pero conforme voy avanzando parece que el código C++ se va distanciando del expuesto en Delphi, así que aunque aún no esté completo del todo he preferido colocarlo ya.
Como no sé mucho de Delphi, supongo que la traducción no es exacta pero al menos si parecida, ah por cierto, en lugar de crear una función que respondiera al mensaje WM_PAINT he creado una función que responda a todos los mensajes (para así poder hacer pruebas con otros mensajes que me pudieran hacer falta), bueno ahí pego el código y de nuevo muchas gracias Netfalí:
Código:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// Creo un componente de la clase TDibuito (que hereda de TRichEdit)
cuaderno=new TCuaderno(this);
cuaderno->Parent=this;
// Configuro algunas propiedades
cuaderno->ScrollBars=ssBoth;
cuaderno->WordWrap=false;
}
//-------------------------------------------------------------------------
__fastcall TCuaderno:: TCuaderno (TComponent* Owner)
:TRichEdit(Owner)
{
// Confiuro algunas propiedades
Height=300;
Width=500;
// Creo el objeto MCanvas
MCanvas= new TControlCanvas();
MCanvas->Control=this;
// Mediante esta asignación puedo responder a todos los eventos
// Lo hago así por si me fuera necesario responder a más eventos
// los pensados inicialmente
Application->OnMessage= ApplicationEventsMessage;
}
//-------------------------------------------------------------------------
void __fastcall TCuaderno::ApplicationEventsMessage(tagMSG &Msg, bool &Handled)
{
// Compruebo que el mensaje es alguno de los que me interesan
if (((Msg.message==WM_PAINT)||(Msg.message==WM_CHAR))&&(Msg.hwnd==Handle))
{
// Envío manualmente el mensaje
SendMessage(Msg.hwnd,Msg.message,Msg.wParam,Msg.lParam);
// Pinto la linea que me interesa, siempre por debajo del texto escrito
for (int a=0;a<=300;a++)
if (MCanvas->Pixels[50][a]==clWhite)
MCanvas->Pixels[50][a]=clBlue;
// Actualizo esta variable para que no se procese el mensaje de nuevo
Handled=true;
}
}
//-------------------------------------------------------------------------