Zum Inhalt springen

Einen markierten Bereich im Explorerfenster in den Sichtbereich scrollen


Empfohlene Beiträge

Geschrieben

Hallo an alle,

ich habe einen Dialog mit einem IE-Fenster in das ich ein HTML-Dokument geladen habe.

Mit dem folgenden Beispiel suche ich mir eine ID aus den HTML-Tags, ergänze dieses Tag mit einem Style-Aufruf, der die Hintergrundfarbe dieser Zeile ändert. Das klappt auch ganz gut, aber wenn die Zeile außerhalb des sichtbaren Bereichs des IE-Fensters liegt, kann man als Nutzer damit nicht viel anfangen.

Wie kann ich diese Zeile nach der Änderung in den sichtbaren Bereich scrollen?


  (VS .NET 2003 C++ MFC)


  LPDISPATCH disp=0;

  IHTMLDocument2 *doc2=0;

  IHTMLElement *element=0;

  CString suchID="[ID-Text]";

  CString Text;

  CComBSTR ID=0;

  CString InsertText=" style=\"BACKGROUND-COLOR: ORANGE\" ";

  int pos=0;


  disp=m_cExpl.get_Document();


  disp->QueryInterface(IID_IHTMLDocument2, (void**) &doc2);


  disp->Release();


  doc2->get_body(&element);


  doc2->Release();


  element->get_innerHTML(&ID);


  Text=ID;


  pos=Text.Find(suchID, 0)+strlen(suchID);


  Text.Insert(pos, InsertText);


  ID.Empty();


  ID.Append(Text);


  res=element->put_innerHTML(ID);


  //Hier soll die geänderte Zeile im Fenster erscheinen

Geschrieben

Das habe ich auch schon probiert.

Allerdings muss man dort eine VARIANT-Variable mitgeben, in der eine ganze Menge weiterer Variablen stehen. Zu denen ist mir nicht so klar, welche Parameter ich eintragen muss bzw. wo ich die herbekommen soll.

  • 3 Wochen später...
Geschrieben

Ich habe es mal so probiert:


...

IHTMLTxtRange *range=0;

IHTMLBodyElement *body=0;

CComBSTR ID=0;


ID.Empty();


ID.Append([ID-Text]);


element->QueryInterface(IID_IHTMLBodyElement, (void**) &body);


body->CreateTextRange(&range);


range->findText(ID, sizeof(range), 2, &suc);


res=range->scrollIntoView(true);

Aber das klappt auch nicht.

  • 1 Monat später...
Geschrieben

Hab es hinbekommen. Vielleicht etwas umständlich, aber es geht:


void CExplorerTestDlg::MarkiereText(CString Fragment)

 {

  //Den gesamten Body-Inhalt des HTML-Dokumentes einlesen,

  //Fragment-String finden,

  //danach InsertText einfügen

  //Neues Dokument mit Markierung laden und in Sicht scrollen



  LPDISPATCH disp=0;

  IHTMLDocument2 *doc2=0;

  IHTMLElement *element=0;

  IHTMLBodyElement *body=0;

  IHTMLTxtRange *range=0;

  CString Text;


  //macht den Hintergrund orange

  CString InsertText=" style=\"BACKGROUND-COLOR: ORANGE\" ";


  static CString Fragment_alt="";

  CComBSTR ID=0;

  int pos=0;

  int x=0;

  int y=0;

  HRESULT res=0;

  VARIANT_BOOL suc=0;

  long ac_count=0;


  //wurde das Fragment zuletzt verwendet?

  if(Fragment_alt!=Fragment)

   {

    disp=m_cExpl.get_Document();    


    disp->QueryInterface(IID_IHTMLDocument2, (void**) &doc2);


    disp->Release();


    doc2->get_body(&element); 


    doc2->Release();


    element->get_innerHTML(&ID); // HTML-Text (mit Tags) laden


    Text=ID;


    if(!Fragment_alt.IsEmpty()) //ist letztes Fragment vorhanden?

     {

      //altes Fragment suchen

      pos=Text.Find(Fragment_alt, 0)+Fragment_alt.GetLength();


      //[InsertText] löschen

      Text.Delete(pos, 33);

     }//end if(Fragment!=Fragment_alt)


    //neues Fragment suchen

    pos=Text.Find(Fragment, 0)+Fragment.GetLength();


    //[InsertText] bei gefundener Position einfügen

    Text.Insert(pos, InsertText);


    for(x=pos+33; x<=Text.GetLength(); x++)

     {

      //ab Position, wo Fragment gefunden wurde nach '>' suchen

      if(Text[x]=='>' && Text[x+1]!='<')

       Text.Insert(x+1, "[]"); //dort "[]" einfügen


      //ab Position, wo Fragment gefunden wurde nach "</" suchen

      if(Text[x]=='<' && Text[x+1]=='/')

       x=Text.GetLength(); //for-Schleife beenden


      y++; //Zeichen für Textrange zählen, s.u.

     }//end for(x=pos+33; x<=Text.GetLength(); x++)


    ID.Empty(); //[ID] leeren


    ID.Append(Text); //in [ID] Body-Text laden


    res=element->put_innerHTML(ID); //geänderden Text im Explorer anzeigen


    element->QueryInterface(IID_IHTMLBodyElement, (void**) &body);


    body->createTextRange(&range); //Textbereich anlegen


    ID.Empty(); //[ID] leeren


    ID.Append("[]"); //"[]" anfügen


    range->findText(ID, sizeof(ID), 2, &suc); //nach "[]" suchen


    //den Textbereich auf y Zeichen erweitern

    range->moveEnd((BSTR)CComBSTR("character"), (long) y, &ac_count);


    range->select(); //selektieren (blau markieren)


    res=range->scrollIntoView(false); //den Bereich in Sicht scrollen


    //ab hier wieder suchen nach "[]" und löschen, würde sonst mit im Explorer stehen


    element->get_innerHTML(&ID);


    Text=ID;


    pos=Text.Find("[]", 0);


    Text.Delete(pos, 2);


    ID.Empty();


    ID.Append(Text);


    element->put_innerHTML(ID);


    element->Release();


    Fragment_alt=Fragment;

  }//end if(Fragment_alt!=Fragment)

 }//end void CExplorerTestDlg::MarkierePhrase(CString Fragment)

Ich hoffe, ich kann damit weiterhelfen. Wenn jemand einen einfacheren Weg kennt, bitte schreiben.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...