|
分類:[C#]
開発環境
Windows 7 Professional SP1 64bit OS
Visual Studio 2010 SP1
.Net Frame 4 Client Profile
C# Windows フォーム アプリケーション
ソリューション プラットフォーム x86
IE 11
実行環境
Windows 7 Professional SP1 32/64bit OS
IE 7〜11
お世話になります。
WebBrowserコントロールでhtmlファイルを表示しています。
このとき、表示内容がWebBrowserコントロールの幅で自動的に折り返されてしまいます。
(厳密には、WebBrowserコントロールの幅を超えない単語区切り)
具体例として、下記のようなシンプルなHTMLファイルを表示したとします。
test.html --------------
<HTML>
<BODY>
<P>123 456 789 012 @AB CDE 〜中略〜 uvw xyz</P>
</BODY>
</HTML>
-----------------------
すると、下記のように折り返されて表示されてしまいます。
123 456 789 012 @AB CDE FGH IJK
LMN OPQ RST...
この動作を変更することは可能でしょうか?
具体的には、WebBrowserコントロールの幅で折り返さずに、水平スクロールバーを表示
するように変更したいのです。
1.最初の目標は、WebBrowserコントロールの幅より大きい固定の表示幅を設定して、水平
スクロールバーを表示することです。
2.最終的には、htmlの内容が折り返さずに表示できる最適幅を求めて設定し、必要に応じ
て水平スクロールバーを表示することです。
3.また、WebBrowserコントロールの幅で折り返すかどうかをオプション設定で切り替えら
れるようにもしたいです。
動作確認は、WindowsフォームにWebBrowserコントロールを貼り付けて、DockプロパティをNone、
Sizeプロパティを(300, 200)、ScrollBarsEnabledプロパティをtrue, Urlプロパティに上記html
ファイルのPathを指定して行いました。
上記のHTMLを表示した時の、ログは以下のとおりです。
Zoom: 100%
webBrowser1.Size: {Width=300, Height=200}
webBrowser1.Document.Window.Size: {Width=300, Height=200}
HTML Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width=300,Height=200}
HEAD Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width= 0,Height= 0}
TITLE Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width= 0,Height= 0}
BODY Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width=283,Height= 90}
P Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width=263,Height= 60}
また、単語区切りで折り返されているようなので、Pタグ内の空白を除いてみたところ、
折り返されずに表示され、水平スクロールバーが表示されました。
ログは以下のとおりです。
Zoom: 100%
webBrowser1.Size: {Width=300, Height=200}
webBrowser1.Document.Window.Size: {Width=300, Height=200}
HTML Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width=300,Height=200}
HEAD Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width= 0,Height= 0}
TITLE Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width= 0,Height= 0}
BODY Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width=581,Height= 50}
P Document.Window.Size{Width=300, Height=200} ScrollRectangle{X=0,Y=0,Width=561,Height= 20}
ScrollRectangleを見ると、コンテンツの表示幅で子ウィンドウが作成されているようですが、
Document.Window.Sizeは固定なので、子ウィンドウは別にあるように思えます。
また、その表示幅計算にワードラップ設定が絡んでいるように思えます。
そこで、子ウィンドウのサイズを設定するか、ワードラップ設定を操作できれば目的が実現できると考えました。
しかし、現状では有効な手法を見つけられていません。
・各要素のDocument.Window.Sizeの設定を試みましたが、値に変化なしで効果なし。
・各要素のDocument.Window.DomWindowを得てresizeTo()での設定を試みましたが、値に変化なしで効果なし。
・ワードラップ関連のプロパティやメソッドを探しましたが現状ではまだ見つけられていません。
苦肉の策として、BODYの中身全体をTABLEで囲って、widthを指定してやればテーブル幅分は
折り返されないことがわかったので、下記のコードで折り返しを制御してみました。
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
System.Windows.Forms.WebBrowser wb = sender as System.Windows.Forms.WebBrowser;
if (wb != null)
{
string html = "<TABLE border=0 align=left width=800><TR><TD>"
+ wb.Document.Body.InnerHtml
+ "</TD></TR></TABLE>";
wb.Document.Body.InnerHtml = html;
}
}
その結果、取り敢えずは折り返しの制御ができ、水平スクロールバーも表示されました。
あとは、折り返さずに表示するのに必要な幅が求められれば、この方法でも解決できそうです。
しかし、この方法が万能かどうか(内容によって問題が出ないか)確証がもてませんし、可能であれば
C#のプロパティやメソッド、またはIWebBrowser2等のインターフェースで解決したいと考えています。
また、WebBrowserコントロールはIEのコンポーネントを利用すると聞きました。
今回の確認はIE11で行いましたが、実際にはIE7〜11を動作対象にしたいと思っています。
何か初歩的な勘違いや見落としをしている気がします。
部分的なヒントや、検索キーワードなどでも結構ですので、ご教示頂けると嬉しいです。
以上、よろしくお願いします。
|