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

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

SommaireCHtmlView,Activex,Email (8)
précédent sommaire suivant
 

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

Mis à jour le 22 janvier 2007 nico-pyright(c)

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; 
}

Mis à jour le 22 janvier 2007 nico-pyright(c)

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

Mis à jour le 22 janvier 2007 nico-pyright(c)

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

Mis à jour le 22 janvier 2007 nico-pyright(c)

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.

Mis à jour le 22 janvier 2007 nico-pyright(c)

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/>

Mis à jour le 22 janvier 2007 nico-pyright(c)

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);
Note : la ligne précédente est sans espace, j'ai dû faire des passages à la ligne à cause de sa longueur...
cerise sur le gâteau avec Outlook la commande attachment permet de lier un fichier en pièce jointe.

Mis à jour le 22 janvier 2007 farscape

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.

Mis à jour le 22 janvier 2007 Gabrielly

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2022 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.