Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Einen markierten Bereich im Explorerfenster in den Sichtbereich scrollen

Empfohlene Antworten

Veröffentlicht

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

  • Autor

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...
  • Autor

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...
  • Autor

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.