文字列の巾を求めたい


サム  URL  2004-03-15 10:49:29  No: 82587  IP: [192.*.*.*]

Documentコンポーネントを使って印刷、印刷プレビューを実施
しています。
印刷文字列が罫線内をオーバーしている場合にオーバーした文字を
削除しようと思っています。
文字の巾は、FontSize,Font種類、文字種(A,A,a,a,あ、亜)
に依存する(英字ではIlなどアルファベットで巾相違のためWordRapping
も存在・)
そこでこれらを全て加味して、印刷(プレビュー表示)上での実際の
巾を求めたいのですが?
例条件  
                              求める値  単位
明朝+12Point
AAAAAAAAAA                    X      (1/100)Inch
あああああ                     Y     (1/100)Inch   
あああAAAAA                  Z     (1/100)Inch   


できればこのような形の関数
X=StringSize("AAAAAAAAAA","明朝",12)

編集 削除
魔界の仮面弁士  2004-03-15 13:05:13  No: 82588  IP: [192.*.*.*]

System.Drawing.GraphicsクラスのMeasureStringを利用できます。

編集 削除
サム  2004-03-15 13:40:41  No: 82589  IP: [192.*.*.*]

魔界の仮面弁士朋友、謝謝

System.Drawing.Graphics
の下には
      DrawImageAbort
      EnumurateMetafileProc
      FromImage
      GetHarftonePalette
      のメンバー関数はありましたが
        MeasureString    は見当たりません
なにか私が勘違いしているのかな?

編集 削除
魔界の仮面弁士  2004-03-15 16:03:17  No: 82590  IP: [192.*.*.*]

IntelliSense (自動メンバ表示機能) だけで確認されていませんか?
ヘルプ(.NET Framework SDK)で、MeasureStringについて調べてみてください。

MeasureStringメソッドは、Shared なメソッドではありませんので、
Graphicsのインスタンスから呼び出す必要があります。

編集 削除
サム  2004-03-16 10:54:04  No: 82591  IP: [192.*.*.*]

確かにありました。
7関数のオーバーロードで、その引数に
LayoutArea As SystemDrawing.SizeF
とか
charactersfitted AS integer
lines filled as integer
などなど引数がどこから持ってくるのかむつかしいですね。
申し訳ありませんが実例はありませんか?

編集 削除
魔界の仮面弁士  2004-03-16 13:24:09  No: 82592  IP: [192.*.*.*]

まず、Graphicsインスタンスの取得はできましたでしょうか。

例えば、System.Drawing.Printing.PrintDocumentを使っている場合には、PrintPageイベントの引数から得る事ができますので、それを利用してみてください。同様に、FormのPaintイベントも利用できます。
また、各種コントロールのCreateGraphicsメソッドによって、インスタンスを生成する事もできます。

なお、MeasureStringに似た物として、MeasureCharacterRangesというメソッドを利用する事もできます。用途に応じて使い分けてみてください。

> 申し訳ありませんが実例はありませんか?
————あれ? .NET Framework SDKを読まれたのですよね?
であればそこに、サンプルも一緒に記載されていたと思いますが……あまり参考にならなかった、という事でしょうか。
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemdrawinggraphicsclassmeasurestringtopic.asp

「SDKの表記で分からない点があったので、他のサンプルが欲しい」という意図で質問されているのであれば、どの部分がわからなかったのかを提示していただかないと、適切な回答は付け難いです。m(_ _)m


で。MeasureStringを利用した他のサンプルに関しては、一応、過去ログにもあります。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200309/03090008.txt

また、google等で検索する事で、幾つかのサンプルを幾つか見つける事もできたかと。
http://dobon.net/vb/dotnet/graphics/measurestring.html
http://ja.gotdotnet.com/quickstart/winforms/doc/WinFormsGDIPlus.aspx
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsControlClassCreateGraphicsTopic.asp


それらの資料を参照しても、思うような結果を得られないという事であれば、現在作成している具体的なソースコードを提示してみてください。m(_ _)m


> LayoutArea As SystemDrawing.SizeF
今回は、「印刷文字列が罫線内をオーバーしている場合」に対応させたいのですよね。
その場合、LayoutAreaには『罫線領域の大きさを示すSizeF構造体』を指定する事になると思います。

> charactersfitted AS integer
これは「OutAttribute属性クラスが付加されたByRefパラメータ」、すなわち出力パラメータです。
メソッドを呼び出すと、ここに指定した変数に「測定結果」の値が返されます。

編集 削除
サム  2004-03-17 14:30:06  No: 82593  IP: [192.*.*.*]

魔界の仮面弁士殿
掲載いただいたサンプルで巾がGetできました。

印刷ルーチン
private sub PrindDocument1_PrintPage1(…Eval _
  e  As Ssytem.Drawing.printing.printpageEventArgs) _
      Handles printdocument1.Printpage

の中の印字処理の中で  上記の引数  e を使って出来ました。
しかし、この処理の前に、ドキュメントの配置を編集するアルゴリズム
があり、その中で文字の数、Font巾などなどで,実際の横幅や罫線
を決定して、それら(罫線位置)をデータ化して、上記の印刷ルーチン
に任せています。
そこで、この文字幅は、ドキュメント配置の編集アルゴリズム(これは通常の
ボタンで起動される)の中で、e As SystemEventArgs で実行すると
(想像どおり)実行時エラーとなりました。

たて罫線の巾は実際に印字する複数行の文字の最大値にあわせて引きたいので、
文字を印字する段で横幅MAX値を指定するのではなく、事前配置編集で欲し
いためどうしても上記の  PrintDocument1_PrintPage1(・・・の前に実行する
必要があります。
要するに  (e As SystemEvent などを元にして)e As PrintPageEvent
を得れればいいのですが!!!
なにかよい方法はないでしょうかね!

編集 削除
ぴろあき  2004-03-23 17:16:00  No: 82594  IP: [192.*.*.*]

TextWidthプロパティはどうでしょうか?

編集 削除