| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mar 30 Jul, 2013 5:25 pm Asunto: Determinar linea en TRichEdit |
|
|
¿Es posible, en un RichEdit , determinar si el ratón está en una línea particular? Como un ejemplo, el reconocimiento de un enlace en los navegadores...
detalle : en el evento OnMouseMove |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Lun 12 Ago, 2013 3:48 pm Asunto: |
|
|
Consegui un código que devuelve la palabra sobre la que está el ratón. Pero, lamentablemente, no capta toda la línea:
| Código: |
void __fastcall TForm1::RichEdit1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
POINTL pt; pt.x = X; pt.y = Y;
// Idem - devolve o índice do caracter
int pos = RichEdit1->Perform(EM_CHARFROMPOS, 0, reinterpret_cast<int>(&pt));
// calcula o início e o fim da palavra sobre a qual o mouse está.
int start = RichEdit1->Perform(EM_FINDWORDBREAK, WB_LEFT, pos);
int end = RichEdit1->Perform(EM_FINDWORDBREAK, WB_RIGHTBREAK, pos);
//=============
::TEXTRANGE tr;
tr.chrg.cpMin = start;
tr.chrg.cpMax = end;
tr.lpstrText = new char[end-start+2];
//=============
RichEdit1->Perform(EM_GETTEXTRANGE, 0, (LPARAM)&tr);
Caption=tr.lpstrText; // pos;
//=============
delete[] tr.lpstrText;
}
|
|
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 12 Ago, 2013 4:35 pm Asunto: |
|
|
| Felip escribió: | | Consegui un código que devuelve la palabra sobre la que está el ratón. Pero, lamentablemente, no capta toda la línea: |
Creí que al poner el enlace de arriba querías decir que ya habías solucionado tu problema.
Si lo que necesitas es saber el número de línea sobre el que está el ratón y a la vez con ese dato tener el contenido de esa línea:
| Código: | void __fastcall TForm1::RichEdit1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
DWORD charIndex = RichEdit1->Perform(EM_CHARFROMPOS, 0 (LPARAM)&TPoint(X, Y));
if (charIndex >= 0)
{
int lineIndex = RichEdit1->Perform(EM_EXLINEFROMCHAR, 0, charIndex);
Caption = RichEdit1->Lines->Strings[lineIndex];
}
else
Caption = "-";
} |
|
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mar 13 Ago, 2013 1:33 am Asunto: |
|
|
| _Leo escribió: |
Creí que al poner el enlace de arriba querías decir que ya habías solucionado tu problema.
|
También pensé que había logrado, pero el resultado no fue satisfactorio.
Gracias, _Leo. Ahora es perfecto! |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Vie 16 Sep, 2022 5:53 pm Asunto: |
|
|
El código dejó de funcionar en mi C++Builder (CE) 10.4.
Hice un ajuste y funciona de nuevo:
| Código: |
...
TPoint pt;
pt.x = X; pt.y = Y;
DWORD charIndex = RichEdit1->Perform(EM_CHARFROMPOS, 0, (LPARAM)(&pt.x, &pt.y));
...
|
|
|
| Volver arriba |
|
 |
|