■3416 / inTopicNo.11) |
Re[5]: WebBrowserのページ内検索の実装 |
□投稿者/ さとみ (8回)-(2007/05/09(Wed) 23:15:07)
|
■No3399 (さとみ さん) に返信 なんとか無事に検索処理ができました。 魔界の仮面弁士さんありがとうございました。 意味のあるスレッドになるように情報を残しておきます。
・C#にMSHTMLの参照設定の方法 「MSDN Home > MSDN アカデミック アライアンス > 第 2 回 VC# で MSHTML」 で解説されています。 http://www.microsoft.com/japan/msdn/academic/Articles/fun/02/ ・組み込んだMSHTMLとIHTMLDocument2の使い方 http://pedroluismateo.blogspot.com/2007/01/c-net-seleccionar-texto-dentro-de-un.html ・文字列検索、文字列の選択、背景の色替え(ハイライト) 下記の関数(メソッド)を利用詳細はurlをご覧下さい。 createTextRange scrollIntoView select execCommand collapse findText http://tomizawa-web.hp.infoseek.co.jp/method.htm ・サンプル(ハイライト処理) mshtml.IHTMLDocument2 doc = webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2; mshtml.IHTMLBodyElement body = doc.body as mshtml.IHTMLBodyElement; mshtml.IHTMLTxtRange objRange; String BMK = ""; bool ret; objRange = body.createTextRange(); while (true) { //文字列検索 ret = objRange.findText(textBox1.Text, 1, 0); if ( ret == false) { //見つからなかった(ハイライト処理終了) break; } //見つかった文字列の部分の背景の色を黄色に変更 objRange.execCommand("BackColor", false, "YELLOW"); //次の検索開始位置を後方にづらす。 objRange.collapse(false); } ・サンプル(検索文字選択処理) //mshtml.IHTMLDocument2 doc = webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2; //mshtml.IHTMLBodyElement body = doc.body as mshtml.IHTMLBodyElement; //mshtml.IHTMLTxtRange objRange; String BMK = ""; bool ret; int cnt =0; //グローバルに保存しておく(ページ読込み完了時に行う) //objRange = body.createTextRange();
//キーワードを順番に検索して次、次と順にキーワードを //選択していくようにする処理のループ while (true) { //文字列検索 ret = objRange.findText(textBox1.Text, 1, 0); if (ret == false) { //見つからない時検索終了 flag_key = 0; //オブジェクト初期化 objRange = body.createTextRange(); break; } //指定した位置のキーワードの時選択して反転表示にする if (flag_key == cnt) { //検索で見つかった文字列を選択して反転表示する objRange.select(); //スクロールバーの位置を選択している文字列に移動 objRange.scrollIntoView(false); //次のキー選択用にキー選択用フラグを次の位置に設定 flag_key = cnt + 1; //オブジェクト初期化 objRange = body.createTextRange(); //ループを抜ける break; } //指定のキーワードのになるまでインクリメント cnt++; //検索位置を後方にづらす objRange.collapse(false); } ・最後に問題?(ハイライトしたの背景を元に戻す処理 調査中 URLを再度読み直せばできるけどスマートでないので・・・ objRange.queryCommandValue("BackColor"); で背景の色をとって最初に保存しておけばできると思うが objRange.queryCommandValue("BackColor"); の戻り値の使い方がまだ理解できていない。
以上
|
解決済み
|