2009-01-25 8 views
0

Lorsque nous avons un contrôle RichEdit et que nous lui envoyons un message EM_AUTOURLDETECT avec WPARAM défini sur TRUE, il affiche bien les URL détectées et envoie les notifications EN_LINK. Mais il le fait uniquement pour le texte entré dans le contrôle. Je n'ai pas trouvé le moyen de le faire pour le texte qui est chargé dans le contrôle avec SetWindowText ou EM_STREAMIN. S'il vous plaît aider! MerciComment autodétecter des URLs dans RichEdit 2.0?

Mise à jour: J'ai créé une application de test à partir de rien et ça marche bien. Je pense que le problème pourrait être que j'ai surclassé le contrôle, c'est-à-dire, créé une nouvelle classe de fenêtre et utilise simplement la procédure de fenêtre de la classe originale. Je vais essayer de sous-classer le contrôle à la place ..

Répondre

0

Sans connaître le format du texte que vous essayez d'ajouter au contrôle avec SetWindowText et EM_STREAMIN, je vais essayer de deviner que cela pourrait avoir quelque chose à faire avec le mode texte du contrôle. Après avoir défini le contenu du contrôle, essayez de lui envoyer un message EM_GETTEXTMODE et de voir si le bit TM_PLAINTEXT est défini. Si tel est le cas, essayez d'envoyer un message EM_SETTEXTMODE suivi de EM_AUTOURLDETECT. Votre code doit ressembler à ceci:

UINT textmode = (UINT)::SendMessage(handle_to_control, EM_GETTEXTMODE, 0, 0); 
if(textmode & TM_PLAINTEXT) { 
    textmode &= ~TM_PLAINTEXT; // Clear the TM_PLAINTEXT bit 
    textmode |= TM_RICHTEXT;  // Set the TM_RICHTEXT bit 
    if(::SendMessage(handle_to_control, EM_SETTEXTMODE, textmode, 0) != 0) { 
     // Failed to set the text mode 
    } 
} 
::SendMessage(handle_to_control, EM_AUTOURLDETECT, TRUE, 0); 
+0

Malheureusement, cela n'a pas fonctionné :(Aussi ce que MSDN dit à propos de EM_SETTEXTMODE: "Le message échoue si le contrôle contient du texte." –

+0

@Alex donc l'extrait de code obtient if (:: SendMessage (handle_to_control, EM_SETTEXTMODE, textmode, 0)! = 0) et ensuite échoue? –

+0

Tout d'abord, il n'a pas atteint EM_SETTEXTMODE car textmode était déjà TM_RICHTEXT, puis j'ai mis le contrôle dans le mode TM_PLAINTEXT manuellement, EM_SETTEXTMODE a quand même échoué. et les paramètres par la suite - n'a pas aidé non plus: SETTEXTMODE réussi, mais aucun lien détecté (( –

0

Il se peut que vous deviez réécrire le texte au contrôle pour qu'il soit ré-analysé.

+0

Que voulez-vous dire exactement par "réécrire"? Je suis en train de définir le texte du contrôle après l'envoi de EM_AUTOURLDETECT, et ça ne fonctionne pas –

+0

à travers un exemple dans VB ici: http://www.vbforums.com/archive/index.php/t-59959.html dans cet exemple, ils sont a écrit la propriété .Text du contrôle. Je ne sais pas comment cela se traduit en C++, mais si c'était faisable en VB, ça devrait être faisable en C++ – veefu

1

Je viens en cloque une application à base de dialogue WTL de base contenant un contrôle riched20 et les travaux suivants fin:

CRichEditCtrl richedit = GetDlgItem(IDC_RICHEDIT); 
richedit.SetAutoURLDetect(TRUE); 
richedit.SetWindowText(_T("http://www.stackoverflow.com")); 

J'ai quelques vieux code MFC qui fait quelque chose de similaire, mais avec ES_STREAM, et il fonctionne OK aussi.

FWIW l'emballage WTL CRichEditCtrl est assez mince. SetAutoURLDetect appelle simplement SendMessage en le passant EM_AUTOURLDETECT. Je compile avec _RICHEDIT_VER mis à 0x0200 FWIW.

+0

Je ne suis pas sûr qu'Alex surveille toujours la question, mais je pense que le problème n'était pas seulement de définir la détection d'URL , mais en l'appliquant au texte qui était dans le contrôle avant de le définir. – veefu

+0

Oui, c'est exactement le cas. Avec EM_AUTOURLDETECT, le contrôle détecte simplement les URL saisies à la main. –

+0

Mais dans mon exemple ci-dessus le texte n'est pas entré à la main (SetWindowText) et cela fonctionne comme prévu. Je suis un peu confus. Avez-vous un exemple de code? – Rob

Questions connexes