FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013 Ajouter une question
Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture. Farscape
- Comment accéder au contrôle IWebBrowser2 depuis une vue dérivée de CHtmlView ?
- Comment récupérer le code html de la page ?
- Comment détecter le chargement complet de la page ?
- Comment afficher une page web ?
- Pourquoi l'événement OnDocumentComplete peut être appelé plusieurs fois ?
- Comment naviguer sur une page web en GET et en POST ?
- Comment déclencher le client de messagerie par défaut ?
- Comment indiquer qu'un contrôle ActiveX est sécurisé pour les scripts
Cela se fait par la variable membre m_pBrowserApp.
Attention, IntelliSense ne permettra pas forcément la complétion automatique à ce niveau, et cette variable pourra vous sembler inexistante. Elle fait pourtant bien partie de la classe CHtmlView
Autre remarque sur la question Comment détecter le chargement complet de la page ?, le site de Microsoft propose d'utiliser la variable m_webBrowser, il faut en fait utiliser m_wndBrowser
Voici une fonction qui fait le travail :
Code c++ : | Sélectionner tout |
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 62 63 64 65 66 67 68 69 70 71 72 73 | CString CMyWebView::GetHtml() { IDispatch *pDispDoc = NULL; IHTMLDocument2 *pDoc = NULL; HRESULT hr = S_OK; CString retour; try { pDispDoc = GetHtmlDocument(); pDispDoc->AddRef(); hr = pDispDoc->QueryInterface( IID_IHTMLDocument2, (void**)&pDoc ); if(!FAILED(hr)) { IHTMLElementCollection *pAll = NULL; hr = pDoc->get_all( &pAll ); if(!FAILED(hr)) { _variant_t name(_T("HTML")); IDispatch *pTags = NULL; hr = pAll->tags( name, &pTags ); if(!FAILED(hr)) { IHTMLElementCollection *pEles = NULL; hr = pTags->QueryInterface(IID_IHTMLElementCollection, (void**)&pEles ); if(!FAILED(hr)) { _variant_t elename; elename.vt = VT_EMPTY; _variant_t ind; ind.lVal = 0; ind.vt = VT_I4; IDispatch* pEleDisp = NULL; hr = pEles->item(elename, ind, &pEleDisp ); if(!FAILED(hr)) { IHTMLElement *pEle = NULL; hr = pEleDisp->QueryInterface( IID_IHTMLElement, (void**) &pEle ); if(!FAILED(hr)) { BSTR html; hr = pEle->get_innerHTML(&html); CString h(html); retour = h; pEle->Release(); pEle = NULL; } pEleDisp->Release(); pEleDisp = NULL; } pEles->Release(); pEles = NULL; } pTags->Release(); pTags = NULL; } pAll->Release(); pAll = NULL; } pDoc->Release(); pDoc = NULL; } pDispDoc->Release(); pDispDoc = NULL; } catch(_com_error e) { CString erreur((const char*)e.Description()); retour = erreur; } ASSERT(!hr); return retour; } |
Comme décrit dans la question Pourquoi l'événement OnDocumentComplete peut être appelé plusieurs fois ?, l'événement OnDocumentComplete prévient du chargement des frames.
Pour détecter le chargement complet de la page (même lorsqu'il y a plusieurs frames), il faut utiliser l'évènement non documenté de la classe : DocumentComplete(attention, cette méthode est différente de OnDocumentComplete)
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void CMyWebView::DocumentComplete(LPDISPATCH lpDisp, VARIANT* URL) { IUnknown* pUnk; LPDISPATCH lpWBDisp; HRESULT hr; pUnk = m_wndBrowser.GetControlUnknown(); ASSERT(pUnk); hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp); ASSERT(SUCCEEDED(hr)); if (lpDisp == lpWBDisp ) TRACE("Web document is finished downloading\n"); lpWBDisp->Release(); } |
voir : How To Determine When a Page Is Done Loading in WebBrowser Control
Il existe deux solutions très simples à mettre en œuvre :
- Avec une vue dérivant de CHtmlView
- Avec un activeX (le composant « Navigateur Web Microsoft »)
Elles reposent sur la même base : IWebBrowser2
La navigation vers une page web, se fait grâce à la méthode Navigate2
On pourrait croire, au vu du nom et au niveau du comportement, que cet événement est appelé lorsque la page est complètement chargée.
Cependant, cet événement peut être appelé plusieurs fois. En fait, il est déclenché lorsqu'une frame est chargée en entier.
Mais il y a encore un hic, l'événement n'est pas appelé pour toutes les frames, seules certaines déclenchent cet événement.
Pour naviguer en GET, il suffit de passer les paramètres à l'url
Code c++ : | Sélectionner tout |
1 2 | Navigate2(_T("http://www.google.fr/search?hl=fr&q=developpez+forum+visual+c%2B%2B&btnG=Rechercher&meta="), NULL, NULL); |
Pour envoyer des données en POST, on peut faire ainsi
Code c++ : | Sélectionner tout |
1 2 3 | char * params = "login=monLogin&password=monPwd";<br/> Navigate2(_T("http://www.mapage.com"), 0, NULL, "Content-Type: application/x-www-form-urlencoded\r\n", params, strlen(params));<br/> |
Un appel du client de messagerie par défaut est possible avec la fonction shellExecute.
L'appel est normalisé et permet le remplissage des zones :
Adresse mail, le sujet, le texte principal, la zone CC (ou carbon copy) et bcc (blind carbon copy)
La syntaxe et l'écriture des chaînes est normalisé RFC 2368
Exemple de commande :
Code c++ : | Sélectionner tout |
1 2 | mailto:farscape@dvpnospam.com?subject=Faq&body=la nouvelle faq arrive |
L'appel avec shellexecute donnera :
Code c++ : | Sélectionner tout |
1 2 3 4 5 | ShellExecute(AfxGetMainWnd()->m_hWnd, "open", "mailto:farscape@dvpnospam.com?cc=cc@dvpnospam.fr&bcc=bcc@dvpnospam.com& subject=la faq&body=la nouvelle faq arrive&attachment=\"\"c:\\Cxtabctrl.JPG\"\"", NULL, NULL, SW_SHOWNORMAL); |
cerise sur le gâteau avec Outlook la commande attachment permet de lier un fichier en pièce jointe.
Lorsque vous chercher à visualiser un contrôle ActiveX dans le navigateur Web. Ce dernier vous affiche un message de sécurité
concernant l'utilisation de votre contrôle ActiveX.
En fonction des paramètres de sécurité actuellement définis dans Internet Explorer,
vous pourriez recevoir une boîte de dialogue Alerte de sécurité indiquant que le contrôle pourrait ne pas être fiable
et pourrait potentiellement causer des dommages s'il était inclus dans un script.
Par exemple, votre contrôle ne serait pas fiable s'il comporte une méthode Delete() supprimant un fichier et que par mégarde un utilisateur la déclenchait.
Il serait fiable s'il était simplement affiché sur une page dépourvue de cette action de suppression.
Il ne le serait toutefois pas s'il était inclus dans un script puisque quelqu'un pourrait appeler la méthode Delete().
Vous avez deux alternatives pour y rémédier.
Vous pouvez changer vos paramètres de sécurité dans Internet Explorer pour exécuter les contrôles ActiveX qui ne sont pas marqués comme étant fiables.
Dans Panneau de configuration, cliquez sur Propriétés Internet et sur Sécurité pour changer les paramètres appropriés.
A la fin rétablissez l'état initial de vos paramètres de sécurité.
Vous pouvez indiquer par programme à Internet Explorer qu'il n'est pas nécessaire d'afficher la boîte de dialogue Alerte de sécurité
pour ce contrôle particulier.
Utilisez pour cela l'interface IObjectSafety dont ATL fournit une implémentation dans la classe IObjectSafetyImpl.
Pour ajouter l'interface à votre contrôle, ajoutez IObjectSafetyImpl à votre liste de classes héritées et ajoutez-lui une entrée dans votre table COM.
Pour ajouter IObjectSafetyImpl au contrôle ActiveX dans un code ATL :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | class ATL_NO_VTABLE CMyActivex : // ... ,public IObjectSafetyImpl<CMyActivex, INTERFACESAFE_FOR_UNTRUSTED_CALLER> // Une entrée dans la liste des classes de base { //... BEGIN_COM_MAP(CMyActivex) // ... COM_INTERFACE_ENTRY(IObjectSafety) // Une entrée dans la table COM END_COM_MAP() //... }; |
Pour un code MFC ça devrait être semblable en suivant le même ordre d'idée.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.