Edit control et mouse over

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 27 févr. 2007 à 15:41
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 27 févr. 2007 à 19:46
je cherche a recuperer une chaine de caractères (ou un mot) dans une edit control ou rich edit peut importe lorsque je passe la souris dessus...

j'ai déjà sous classé mon edit control par prev_proc = SetWindowLongPtr(hDlist, GWLP_WNDPROC, (LONG)EditWindProc);
ou

hDlist pointe sur le HWND de l'edit control, ceci tant créer pour pouvoir capturer le mousemove.
bref j'arrive a ca:
Commentaire:

IDC_EDIT2 me permet de controler les lignes selectionner











LRESULT CALLBACK EditWindProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch (message)
    {

        case WM_MOUSEMOVE:
        {
            POINTS ptsCursor;
            int nCurrentLine =0;
            int nCharWidth = 0;
            int nLastLine=0;
            ptsCursor = MAKEPOINTS(lParam);
           
            nLastLine = SendMessage(hWnd,EM_GETLINECOUNT,0,0);
            /*hdc = GetDC(hWnd);
            GetCharWidth32(hdc, (UINT) wParam, (UINT) wParam, &nCharWidth);
            ReleaseDC(hWnd, hdc);*/
            nCurrentLine = min((int)(ptsCursor.y / dwLineHeight), nLastLine); //ou

dwLineHeight calculer dans WM_INITDIALOG  et est égal a tm.tmHeightou tm est un TEXTMETRIC...


           
           
            int pos = SendMessage(hWnd, EM_LINEINDEX, nCurrentLine, 0);
            pos = SendMessage(hWnd, EM_LINELENGTH, pos, 0);
            char * pmem;
            pmem = (char*) HeapAlloc(GetProcessHeap(), 0, pos + 1);
            *((WORD*) pmem) = pos;
            pos = SendMessage(hWnd, EM_GETLINE, nCurrentLine, (long) pmem);
            pmem[pos] = 0;
            SetDlgItemTextA (mainhwnd,IDC_EDIT2, pmem);

        return (0);
        }
        break;
    }

return CallWindowProc((WNDPROC)prev_proc, hWnd, message, wParam, lParam);

}



bref ca marche mais j'ai trois problemes:

le premier c que ca recupère que la ligne et je cherche a recup le mot, bon ca evidemment j'y suis pas encore mais déjà si je recupere la ligne je peut faire mes tests avec des boucles...

le deuxième c que mon min((int)(ptsCursor.y / dwLineHeight), nLastLine); ne fonctionne pas bienles première lignes fonctionnes mais a partir de la 5ème elle se décale, je pense parceque la taille de ma ligne ne correspond pas.

troisèmement lorque la scroll bar rentre en jeux, la evidement le x et le y du POINTS ne correspondent absolument plus aux index de lignes....

voila je galère pour le moment, je suis encore entrain de chercher, mais un coup de pousse m'aiderais bien

merci d'avance

youpi :)

3 réponses

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
27 févr. 2007 à 16:57
est-ce que un EM_CHARFROMPOSne serait pas ma solution???

avec ca j'arrive pas a grand chose pour le moment:
DWORD returnIndex=SendMessage( hWnd,EM_CHARFROMPOS,0,MAKELPARAM(ptsCursor.x,ptsCursor.y));

merci
youpi :)
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
27 févr. 2007 à 19:39
SetFocus
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
27 févr. 2007 à 19:46
en quoi setfocus pourrai m'aider????

en revanche je reste persuader que EM_CHARFROMPOS est la solution

j'ai essayé ca:
WORD vLine=HIWORD(SendMessage( hWnd,EM_CHARFROMPOS,0,MAKELPARAM(ptsCursor.x,ptsCursor.y)));
WORD hLine=LOWORD(SendMessage( hWnd,EM_CHARFROMPOS,0,MAKELPARAM(ptsCursor.x,ptsCursor.y)));

DWORD nWordStart = SendMessage(hWnd, EM_FINDWORDBREAK, WB_LEFT, hLine);
DWORD nWordEnd = SendMessage(hWnd, EM_FINDWORDBREAK, WB_RIGHTBREAK, hLine);

mais nWordStart et nWordEnd reste toujours a zero

youpi :)
0
Rejoignez-nous