IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] Automation MS Word / Correction orthographique


Sujet :

MFC

  1. #1
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut [MFC] Automation MS Word / Correction orthographique
    Bonjour,

    mon petit problème à moi est que j'aimerais utiliser la fenêtre de correction orthographique de Word dans une autre application.

    j'arrive effectivement à mes fins pour ce qui est de vérifier et corriger du texte tout con. par contre il faut maintenant que je puisse corriger du texte formaté (RTF) sans perdre le format. cela est possible puisque ça fonctionne dans Word. quant à le réaliser... j'ai comme qui dirait un mal de chien à trouver de la doc

    voilà ce que je fais pour utiliser la boîte Word avec du texte simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    BOOL AFX_API_EXPORT  MaFonctionCorrectrive(HWND hWnd, CString & theText)
    {
    	COleVariant vTrue((short)TRUE), vFalse((short)FALSE), vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR), vZero((long)0);
     
    	// création de l'application
    	_Application appObj;
    	if(!appObj.CreateDispatch("Word.Application"))
      {
         MessageBox(hWnd,"Impossible d'accéder à l'application Word","Application introuvable",MB_ICONERROR);
    		 return FALSE;
      }
     
    	appObj.SetVisible(FALSE);
     
    	// création du document
    	Documents docsObj(appObj.GetDocuments());
    	_Document docObj;
    	docObj = docsObj.Add(vOpt, vOpt,vOpt, vOpt);
     
    	// ajout du texte dans le document
    	Selection oSel;
    	oSel = appObj.GetSelection();
    	oSel.SetText(theText);
     
    	// ouverture de la boîte de correction orthographique
    	BOOL bRet = FALSE;
    	Dialogs pDialogs = appObj.GetDialogs();
    	Dialog pDlg = pDialogs.Item(828); // 828, c'est la boîte de correction ortho
     
    	if (pDlg.Show(vZero) != 0)
    	{
    		bRet = TRUE;
    		theText = oSel.GetText();
    	}
    	else
    		bRet = FALSE;
     
    	// fermetures
    	docObj.Close(vFalse, vTrue, vOpt);
    	appObj.Quit(vFalse, vFalse, vFalse);
    	appObj.DetachDispatch();
     
    	return bRet;
    }
    ça c'est OK. mais comment faire avec du RTF ? j'ai repris cette fonction et passé en argument mon RichEdit. je récupère le texte formaté. et après ?
    j'utilise le SetText() de l'objet Selection ?
    Selection dispose d'une méthode SetFormattedText(LPDISPATCH ld), à utiliser ? (j'ai pas de doc sur la fonction, je ne sais pas vraiment ce qu'elle fait) comment faire LPDISPATCH <<-->> mon texte ?

    enfin bref, je perds un temps fou sur ce problème à la *** qui je pense doit avoir une réponse simple (en terme de nombre de lignes de code).

    merci pour vos lumières.

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    ou alors plutôt que d'insérer le texte dans l'objet Selection il faut que je l'ajoute direct au Document ?

    là encore je ne sais pas comment .

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    une suggestion comme ça peut etre travailler avec une autre interface pour du rtf:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/textobjectmodel.asp

  4. #4
    Membre actif Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Points : 203
    Points
    203
    Par défaut
    sinon tu peux prendre ton texte formaté et l'ajouter à un document Word avec InsertAfter ou InsertBefore et ensuite, tu fais la correction orthographique. Ca devrait fonctionner là.
    "La vie ne vaut rien, mais rien ne vaut la vie"

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par farscape
    salut,
    une suggestion comme ça peut etre travailler avec une autre interface pour du rtf:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/textobjectmodel.asp
    je vais regarder, merci

    Citation Envoyé par lenouvo
    sinon tu peux prendre ton texte formaté et l'ajouter à un document Word avec InsertAfter ou InsertBefore et ensuite, tu fais la correction orthographique. Ca devrait fonctionner là.
    InsertAfter/InsertBefore, c'est comme SetText dans mon cas. le texte apparaît dans la boîte de dialogue, mais avec le formatage sous forme de texte également et uniquement jusqu'au premier retour-chariot (je ne connais pas trop le formatage RTF, mais il semble qu'il y ait plusieurs lignes)

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    j'essaie d'obtenir un ITextDocument (dérive de IDispatch) à partir de mon RichEdit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ITextDocument *textdoc= NULL;
    IRichEditOle *riched= richEdit.GetIRichEditOle();
    HRESULT hr= riched->QueryInterface(IID_ITextDocument,(void **)&textdoc);
    j'inclus "tom.h" (pour IDD_ITextDocument), mais il doit manquer une DLL, un LIB ou je ne sais quoi.
    pb 1 : il n'en existe pas s'appelant tom.kekchoz
    pb 2 : je suis sous VC6 et j'ai été pêcher tom.h dans le VS2003.

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    au temps pour moi, IID_ITextDocument il faut le définir soi-même
    d'ailleurs je ne sais pas trop quel ITextBidule il serait judicieux que j'emplois ( BBS à la masse).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define DEFINE_GUIDXXX(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
    EXTERN_C const GUID CDECL name \
    = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
     
    DEFINE_GUIDXXX(IID_ITextDocument,0x8CC497C0,0xA1DF,0x11CE,0x80,0x98,
    0x00,0xAA,0x00,0x47,0xBE,0x5D);
    j'ai essayé le IDD_ITextSelection également, out.

    On m'a soumis l'idée d'utiliser le presse-papier, marche pas non plus (où alors je m'en suis mal servi?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // du texte est sélectionné;
    monRichEdit.Copy();
    objSelection.Paste();
     
    ... // la fenêtre de correction ne se déclenche pas.
    // en testant je me rend compte que objSelection a un texte vide (ou presque à un caractère d'échappement près)
    hmm j'ai zappé le code depuis, donc je ne peux pas le mettre ici (à moins de le réécrire...)

    Enfin bref, j'en suis au même point.

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut


    résolu. dès que j'aurais quelquechose de propre je donnerais des nouvelles.

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    voilà le truc de malade...

    il n'y a pas de fonction disponible pour insérer du texte formatté dans un document Word. il est suûrement possible d'utiliser des fonctions dispo moyennement de multiples astuces et ruses de sioux agrémentées d'un coup de bol pour avoir trouvé la doc associée avec les exemples qui vont bien (ce qui n'a pas été mon cas).

    la solution que j'ai explorée (merci Farscape pour le coup du presse-papier, je n'y aurais pas pensé) : passer par le presse-papier et insérer le texte dans l'objet Range d'un signet que l'on aura créé dans le document. le format est pris en compte et le texte s'affiche comme attendu dans la fenêtre de correction orthographique.

    C'est gagné ! Avec Monsieur Pringle, vous êtes un winner !

    Pour ceux que ça intéresse voilà une (grosse) partie du code.
    Raffinement supplémentaire (que je n'ai pas montré ici, c'est déjà suffisamment indigeste ) : sauvegarder le contenu du presse-papier et le restaurer à la fin, histoire de ne pas perdre les données qu'on aurait pu y mettre précédemment. Il n'y a pas de raison qu'une correction orthographique modifie le presse-papier en principe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    	// param utiles
    	COleVariant vTrue((short)TRUE), 
                   vFalse((short)FALSE),  
                   vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                   vZero((long)0);
     
    	// création de l'application
    	_Application appObj;
    	if(!appObj.CreateDispatch("Word.Application"))
       {
         MessageBox(hWnd,"Impossible d'accéder à l'application Word","Application introuvable",MB_ICONERROR);
    		 return FALSE;
       }
     
    	appObj.SetVisible(FALSE);
     
     
    	// création du document
    	Documents docsObj(appObj.GetDocuments());
    	_Document docObj;
    	docObj = docsObj.Add(vOpt, vOpt,vOpt, vOpt);
     
    	// copie du texte formatté dans le presse-papier
    	pRichEdit->SetRedraw(FALSE);
    	pRichEdit->SetSel(0,pRichEdit->GetWindowTextLength());
    	pRichEdit->Copy();
     
    	// collage du texte dans le document Word
    	Bookmarks books(docObj.GetBookmarks());
    	books.Add("TexteRTF",vOpt);
    	Bookmark book = books.Item(COleVariant("TexteRTF"));
    	Range range = book.GetRange();
    	range.Paste();
     
    	// ouverture de la boîte de correction orthographique
    	BOOL bRet = FALSE;
    	Dialogs pDialogs = appObj.GetDialogs();
    	Dialog pDlg = pDialogs.Item(828);
     
    	if (pDlg.Show(vZero) != 0)
    	{
    		bRet = TRUE;
    		range.Copy();
    		pRichEdit->SetRedraw(TRUE);
    		pRichEdit->Paste();
    	}
    	else
    	{
    		bRet = FALSE;
    		pRichEdit->SetRedraw(TRUE);
    	}
     
    	pRichEdit->SetSel(0,0);
     
    	// fermetures
    	range.ReleaseDispatch();
    	book.ReleaseDispatch();
    	books.ReleaseDispatch();
    	docObj.Close(vFalse, vTrue, vOpt);
    	appObj.Quit(vFalse, vFalse, vFalse);
    NOTE : CRichEditCtrl::Copy() ne copie dans le clipboard que le texte sélectionné s'il y en a. Du coup pour prendre en compte tout le texte de l'edit, il faut le sélectionner (SetSel) à la place de l'utilisateur puis désélectionner à la fin. On ignore cela si on veut forcer l'utilisateur à sélectionner le texte qu'il veut corriger.

    NOTE 2 : c'est pas très beau, mais après la fermeture de la fenêtre de correction orthographique, un doc Word contenant le texte corrigé s'ouvre puis se referme (c'est plus ou moins rapide suivant la machine et les appli lancées). il est possible de la cacher, mais c'est vraiment casse-pied à coder (http://msdn2.microsoft.com/en-US/library/bhy5dcs0.aspx). si quelqu'un le fait, je suis preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/01/2015, 00h41
  2. Réponses: 1
    Dernier message: 23/08/2010, 20h51
  3. Réponses: 5
    Dernier message: 02/09/2006, 10h15
  4. Réponses: 9
    Dernier message: 25/07/2006, 16h49
  5. [MFC] - Automation Word bug
    Par Alice9 dans le forum MFC
    Réponses: 3
    Dernier message: 25/05/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo