IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > CHtmlView,Activex,Email
        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



Comment accéder au contrôle IWebBrowser2 depuis une vue dérivée de CHtmlView ?
Créé le 22/01/2007[haut]
auteur : nico-pyright(c)
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 faq 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

lien : faq Comment détecter le chargement complet de la page ?

Comment récupérer le code html de la page ?
Créé le 22/01/2007[haut]
auteur : nico-pyright(c)
Voici une fonction qui fait le travail :

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



Comment détecter le chargement complet de la page ?
Créé le 22/01/2007[haut]
auteur : nico-pyright(c)
Comme décrit dans la question faq 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)

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

lien : faq Comment accéder au contrôle IWebBrowser2 depuis une vue dérivée de CHtmlView ?
lien : faq Pourquoi l'événement OnDocumentComplete peut être appelé plusieurs fois ?

Comment afficher une page web ?
Créé le 22/01/2007[haut]
auteur : nico-pyright(c)
Il existe deux solutions très simples à mettre en oeuvre :
- 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


Pourquoi l'événement OnDocumentComplete peut être appelé plusieurs fois ?
Créé le 22/01/2007[haut]
auteur : 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.

Voir aussi :faq Comment détecter le chargement complet de la page ?

lien : faq Comment détecter le chargement complet de la page ?


Comment déclencher le client de messagerie par défaut ?
Créé le 22/01/2007[haut]
auteur : Farscape
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 :

mailto:farscape@dvpnospam.com?subject=Faq&body=la nouvelle faq arrive


L'appel avec shellexecute donnera :

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.


Comment indiquer qu'un contrôle ActiveX est sécurisé pour les scripts
Créé le 22/01/2007[haut]
auteur : Gabrielly
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 :

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.




Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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 © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.