[win 32] DLL - Problème de coloration d'une sélection seule dans un RichEdit

Résolu
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 24 févr. 2009 à 01:15
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 7 mars 2009 à 11:51
Bonsoir à tous,


J'ai une petite question désespérée, avant d'aller dormir.

Je code une DLL qui est censée faire un hook sur un éditeur de script
(mIRC) et colorer le RichEdit. Tout se passe bien, or lorsque je colore
tout le texte (SCF_ALL) c'est okay, mais quand je ne colore qu'une
sélection (SCF_SELECTION), le SendMessage(); me retourne 0.

Je ne peux pas donner tout le code de la DLL, mais voici la fonction
qui parcourt toutes les lignes du RichEdit, et colore une ligne en
rouge si le mot "alias" est contenu, sinon en bleu :

void Color_All() {

    //Masquage des sélections

    SendMessage(edit,EM_HIDESELECTION,1,0);

    //Début

    CHARRANGE select,curSelect;

    CHARFORMAT cFormat;

    ZeroMemory(&cFormat,sizeof(CHARFORMAT));

    cFormat.cbSize=sizeof(CHARFORMAT);

    cFormat.dwMask=CFM_COLOR|CFM_BOLD;

    cFormat.dwEffects=0;//CFE_BOLD;

    //Récupération de la sélection

    SendMessage(edit,EM_EXGETSEL,0,(LPARAM)&curSelect);

    //Boucle ligne par ligne

    int lines=SendMessage(edit,EM_GETLINECOUNT,0,0);

    for(int line=0;line < lines;line++) {

        //Récupération du texte de la ligne

        int place=SendMessage(edit,EM_LINEINDEX,line,0);

        char buffa[9999]="9999";

        SendMessage(edit,EM_GETLINE,line,(LPARAM)buffa);

        select.cpMin=place;

        place+=strlen(buffa);

        select.cpMax=place;

        SendMessage(edit,EM_EXSETSEL,0,(LPARAM)&select);

        //Alias

        if (strstr(buffa,"alias") != NULL) cFormat.crTextColor=RGB(255,0,0);

        //Autre

        else cFormat.crTextColor=RGB(100,100,250);

        SendMessage(edit,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&cFormat);

    }

    //Remise en place de la sélection courante

    SendMessage(edit,EM_EXSETSEL,0,(LPARAM)&curSelect);

    //Réaffichage des sélections

    SendMessage(edit,EM_HIDESELECTION,0,0);

}


C'est le SendMessage(); en rouge qui pose problème, il fonctionne bien avec SCF_ALL mais pas avec SCF_SELECTION.

Je note que chaque ligne est bien sélectionnée, et ce morceau de code fonctionne très bien dans mes autres programmes.

Mon code étant donc (selon moi) correct, je me suis dit que peut-être
le RichEdit avait été paramétré avec une option incompatible avec ce
que j'essaye de faire.

Je voulais simplement avoir vos idées concernant ce problème, moi ayant mal au crane

Merci d'avance.

Cordialement, uaip.

1 réponse

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
7 mars 2009 à 11:51
Trouvé.

Cordialement, uaip.
3