Veröffentlicht 1. April 200520 j 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
1. April 200520 j 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.
1. April 200520 j element->scrollIntoView(CComVariant(true)); [/CODE] oder[CODE]element->scrollIntoView(CComVariant(false)); je nachdem, wo das Element stehen soll.
4. April 200520 j Autor 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.
22. April 200520 j 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.
30. Mai 200520 j 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.