2010-01-20 12 views
0

Le message de notification EN_PROTECTED est envoyé au parent d'un contrôle d'édition enrichi lorsqu'il y a une tentative de modification du texte "protégé". Cela fonctionne pour moi et je l'ai essayé avec richedit20 et richedit50. Toute modification apportée à ce texte protégé déclenche immédiatement le message EN_PROTECTED. (C'est un peu compliqué de le configurer, mais je l'ai fait correctement.)EN_PROTECTED et RichEdit

Cependant, la documentation indique si le parent renvoie une valeur non nulle en réponse au message EN_PROTECTED, cela empêchera le texte protégé d'être modifié . Cela ne fonctionne pas pour moi.

+0

Pouvez-vous envoyer le code source à votre gestionnaire EN_PROTECTED? – Ruddy

Répondre

0

(Pour Ruddy: exemple de code ci-dessous si elle révèle quoi que ce soit)

Je finalement juste fait un PostMessage (hwnd, EM_UNDO ...) dans le gestionnaire EN_PROTECTED et c'est ce que je devais faire pour obtenir ce travaillant pour moi. Renvoyer TRUE n'a jamais rien accompli, bien que je sache que le gestionnaire était touché et seulement pour un texte protégé. (La fonction ODS ci-dessous est OutputDebugString).

Mais j'ai vu plusieurs exemples sur le web (la plupart d'entre eux MFC cependant ou parfois DELPHI ou quelque chose), où juste retourner TRUE dans le gestionnaire EN_PROTECTED est dit pour empêcher le changement.

En fait, mon contrôle Rich Edit était dans une boîte de dialogue mais était en cours de création avec CreateWindowEx, donc j'ai essayé de l'initialiser à travers le fichier RC à la place, mais cela n'a fait aucune différence. (Certaines des choses que je fais sont en quelque sorte de la vieille école - désolé à ce sujet.) Mais en fait, j'ai essayé tout et n'importe quoi pour faire fonctionner EN_PROTECTED comme son documenté et rien travaillé - bizarre. Eh bien, EM_UNDO de l'intérieur du gestionnaire EN_PROTECTED fonctionne, alors je suppose que je m'en tiendrai là.

Code d'origine (avec l'appel EM_UNDO ajouté):

case WM_NOTIFY: { 

    NM_UPDOWN* nm = (NM_UPDOWN*)lParam; 
    if ((nm->hdr.code == UDN_DELTAPOS) && (nm->hdr.idFrom == ID_UPD_ERR)) { 
    int e = nm->iPos + nm->iDelta; 
    SetWindowText(xml2->hStatMsg[1],xml2->ErrMsg(1,e)); 
    SetWindowText(xml2->hStatMsg[2],xml2->ErrMsg(2,e)); 
    } 
    else if (wParam == ID_EDIT_A) { 
    if (((LPNMHDR)lParam)->code == EN_PROTECTED) { 
     ODS("EN_PROTECTED", (int)((ENPROTECTED*)lParam)->msg); 
     PostMessage(xml2->hImgXml2,EM_UNDO,0,0); 
     return TRUE; 
    } 
    if (((LPNMHDR)lParam)->code == EN_SELCHANGE) { 
     anchors_adjsel(xml2->hImgXml2); 

    }  
    } 

} 
break; 
1

J'ai créé une application de test de dialogue de test simple, en utilisant MFC - ajouter le contrôle RichEdit via la modification de dialogue, a ajouté un appel à AfxInitRichEdit dans l'application initialisation, ajouté du code à la boîte de dialogue pour mettre du texte dans le contrôle (SetWindowText), sélectionné le deuxième mot, appliqué les effets CFE_PROTECTED, puis ajouté un gestionnaire pour EN_PROTECTED, dans le gestionnaire, je viens de définir *pResult = TRUE. Lorsque j'ai lancé l'application, tout a bien fonctionné. en ce que j'étais pas capable de modifier le mot protégé mais je pourrais modifier le reste du texte. Malheureusement, cela ne nous conduit pas à une raison concluante de savoir pourquoi votre code ne fonctionne pas - d'après ce que je peux voir, il semble correct. Pourrait être la version de la DLL RichEdit20 je suppose - le mien est 5.31.23.1224