none
Auf HTML Events mit MFC reagieren RRS feed

  • Allgemeine Diskussion

  • Ich habe eine MFC Applikation, in der ich auf ein Klick Event der Checkbox Prepare_0 in einer HTML Seite reagieren möchte. Weil ich auch nach sehr intensiver Suche im Internet nicht weiter komme wende ich mich nun an die Forengemeinschaft.

    Das ist der HTML Code:

    <

     

     

    html>
     <head>
     <link rel="stylesheet" type="Text/css" href="..\StyleSheets\formate.css"/>
     </head>
     <body>
      <label id="Input_">
       <input type="checkbox" name=PREPARE_0>
        Eindeutige Zuordnung der Rotore zu den jeweiligen Schlauchrollenpumpen
      </label>
     </body>
    </
    html>

    Folgenden MFC Quellcode abgeleitet aus einem msdn Beispiel verwende ich dazu:
    CHtmlCtrlist von CHtmlView abgeleitet. Das Navigieren und auch das Setzen der Checkbox vom Code aus funktionieren. Nun versuche ich bisher erfolglos auf HTML-Ereignisse zu reagieren.

    void CHtmlCtrl::ConnectEvents(IHTMLElement* pElem)
    {
      HRESULT hr;
      IConnectionPointContainer* pCPC = NULL;
      IConnectionPoint* pCP = NULL;
      IEnumConnectionPoints *pECP = NULL;
      DWORD dwCookie;
      IUnknown* pUnk = NULL;
      // Check that this is a connectable object.
      hr = pElem->QueryInterface( IID_IConnectionPointContainer, (void**)&pCPC);
      if ( SUCCEEDED(hr) )
      {
        // Find the connection point.
        hr = pCPC->FindConnectionPoint( DIID_HTMLElementEvents, &pCP);
        if ( SUCCEEDED(hr) )
        {
          // Advise the connection point.
          // pUnk is the IUnknown interface pointer for your event sink
          hr = pCP->Advise( pUnk, &dwCookie);
          if ( SUCCEEDED(hr) )
          {
            // Successfully advised
          }
        pCP->Release();
      }
      pCPC->Release();
    }

     

     

    Beim Aufruf hr = pCPC->FindConnectionPoint( DIID_HTMLElementEvents, &pCP);
    bekomme ich immer das HRESULT 0x80040200 zurück.

     

    Dienstag, 7. Juni 2011 08:24

Alle Antworten

  • Beim Aufruf hr =pCPC->FindConnectionPoint(DIID_HTMLElementEvents,&pCP);
    bekomme ich immer das HRESULT 0x80040200 zurück.

    Es wird kein Connectionpoint gefunden.
    Evtl. stimmt was mit Deinen Event-Mapsnicht.

    Da musst Du schon mehr Code zeigen.
    Was hast Du versucht? Einen HTML View in einen Dialog einzubetten?
    Was für ein Sample ist Deine Grundlage?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 8. Juni 2011 07:41
    Moderator
  • Hallo Martin,
        vielen Dank für Deine Antwort

    Ich habe mit Visual Studio 2005 ein neues SingleDocument Projekt erstellt und dann die von CHtmlView abgeleitete View-Klasse um den schon gezeigten Code erweitert. Vorher habe ich mit dem Wizard noch die Funktion OnDocumentComplete(LPCTSTR lpszURL) eingefügt.

    Kann ich hier im Forum auch Dateianhänge einbinden? Dann würde ich mein Beispiel einfach mal als komplettes Projekt gezippt anhängen.

    Dieses Sample ist meine Grundlage:
    http://lists.w3.org/Archives/Public/w3c-wai-ua/2000JanMar/att-0287/htmlevent.htm#Document

    Ehrlich gesagt ist mir dieser Abschnitt völlig unklar:

    1. Implement the event sink.

      The event sink implements the appropriate outgoing interface and methods. Internet Explorer event interfaces are dispinterfaces, so calls to event methods are made through IDispatch::Invoke. This means that you only need to implement the IDispatch interface to handle events.

    Donnerstag, 9. Juni 2011 14:47
  • Ehrlich gesagt ist mir dieser Abschnitt völlig unklar:

    1.

    Implement the event sink.

    The event sink implements the appropriate outgoing interface and methods. Internet Explorer event interfaces are/dispinterfaces/, so calls to event methods are made through IDispatch::Invoke. This means that you only need to implement the*IDispatch* interface to handle events.

    Über COM IDispatch wird das Event an Dich weitergeleitet.
    D.h. Du registrierst einen IDispatch Zeiger im Sink, der View ruft nun je nach Event eben eine Methode in diesem IDispatch auf.

    Dein Code zeigt ein pUnk mit NULL.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 10. Juni 2011 05:34
    Moderator
  • Bin mittlerweile etwas weitergekommen. Ich habe die EventSink Klasse implementiert und das Ganze funktioniert auch, wenn ich aub Click Events von Buttons reagiere.

    Nun möchte ich aber auf Click Events von Checkboxen oder von Bildern reagieren. Ich habe unterschiedliche IDs für FindConnectionPoint ausprobiert, aber keine passende gefunden.

    hr = pCPC->FindConnectionPoint( DIID_HTMLButtonElementEvents2, &pCP);

    void CHTMLEventsView::ConnectEvents(IHTMLElement* pElem)
    {
      HRESULT hr;
      IConnectionPointContainer* pCPC = NULL;
      IConnectionPoint* pCP = NULL;
      DWORD dwCookie;

      CEventSink* pSink = new CEventSink();
      IUnknown* pUnk = pSink->GetInterface(&IID_IUnknown);

      // Check that this is a connectable object.
      hr = pElem->QueryInterface( IID_IConnectionPointContainer, (void**)&pCPC);
      if ( SUCCEEDED(hr) )
      {
        // Find the connection point.
        hr = pCPC->FindConnectionPoint( DIID_HTMLButtonElementEvents2, &pCP);
        if ( SUCCEEDED(hr) )
        {
          // Advise the connection point.
          // pUnk is the IUnknown interface pointer for your event sink
          hr = pCP->Advise( pUnk, &dwCookie);
          if ( SUCCEEDED(hr) ) 
          {
            // Successfully advised
          }
          pCP->Release();
        }
        pCPC->Release();
      }
    }


    Freitag, 10. Juni 2011 14:08
  • Schau Dir mal diese Schritt für Schritt Anleitung in dieser Diskussion an:
    http://www.ms-news.net/f3291/events-from-chtmlview-2581027.html


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 13. Juni 2011 06:45
    Moderator
  • Ich hab jetzt alles lauffähig. Ich kann auf Events in HTML Seiten und auch in Unterframes reagieren.

    Die einzige Sache, die ich noch offen habe ist, wie kriege ich raus, von welchem Frame das Ereignis kommt.

    Für IHTMLEventObj scheint es nichts zu geben, über das ich die Frame-Quelle herausbekomme?

    BEGIN_DISPATCH_MAP(CEventSink, CCmdTarget)
    DISP_FUNCTION_ID(CEventSink,"HTMLELEMENTEVENTS2_ONCLICK", DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION_ID(CEventSink,"HTMLELEMENTEVENTS2_ONMOUSEOVER", DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER, OnClick, VT_EMPTY, VTS_DISPATCH) 
    DISP_FUNCTION_ID(CEventSink,"HTMLELEMENTEVENTS2_ONMOUSEOUT", DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT, OnClick, VT_EMPTY, VTS_DISPATCH) 
     END_DISPATCH_MAP()

    // CEventSink message handlers

    void CEventSink::OnClick( IHTMLEventObj *pEvtObj )
    {

       ...
    Mittwoch, 15. Juni 2011 12:03
  • Mit IHTMLEventObj::srcElement solltest Du an das IHTMLElement Objekt kommen von dort an alles andere...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 15. Juni 2011 12:59
    Moderator
  • Damit bekomme ich ein IHTMLElement zurück. Die Beschreibung dazu ist hier:

    http://msdn.microsoft.com/en-us/library/aa752279(v=vs.85).aspx

    Jedoch habe ich noch nicht herausgefunden wie ich auf den Frame komme, der das Event abgefeuert hat.

    Donnerstag, 16. Juni 2011 07:43
  • Und was ist mit parentElement?
    Du kannst doch die gesamte Struktur über IHTMLElement auslesen.

    -oder
    Du hast das IHTMLElement, darüber bekommst Du das IHTMLDocument2, dort findest Du das frames Property und die children nodes.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 16. Juni 2011 07:51
    Moderator