Narf! Geschrieben 1. April 2005 Geschrieben 1. April 2005 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 Zitieren
Narf! Geschrieben 1. April 2005 Autor Geschrieben 1. April 2005 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. Zitieren
Klotzkopp Geschrieben 1. April 2005 Geschrieben 1. April 2005 element->scrollIntoView(CComVariant(true)); [/CODE] oder[CODE]element->scrollIntoView(CComVariant(false)); je nachdem, wo das Element stehen soll. Zitieren
Narf! Geschrieben 4. April 2005 Autor Geschrieben 4. April 2005 Haut bei mir nicht hin. Deine Zeile habe ich angefügt und ein Element markiert, was direkt unter dem Fenster steht. Es wird nicht gescrollt. Zitieren
Narf! Geschrieben 22. April 2005 Autor Geschrieben 22. April 2005 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. Zitieren
Klotzkopp Geschrieben 22. April 2005 Geschrieben 22. April 2005 Was steht denn nach dem Aufruf in res? Zitieren
Narf! Geschrieben 30. Mai 2005 Autor Geschrieben 30. Mai 2005 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. Zitieren
Empfohlene Beiträge
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.