- PR -

VB.NETで縦書きフォントの一覧を取得する方法

投稿者投稿内容
soramimi
会議室デビュー日: 2003/10/29
投稿数: 19
投稿日時: 2004-02-16 17:37
# これも縦書きフォントの一覧取得ではありませんが

new Font("@MS ゴシック" ...) で作成したフォントを
テキストボックスの Font プロパティに設定すると表示
が縦書きフォントに変わったのですが、ラベルの Font
プロパティに設定した場合や、DrawString メソッドを
使用した場合には確かに縦書きフォントになりませんでした。

個人的には縦書きフォントが有効な場合もある、というのが
すっきりしません
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-16 19:00
 縦書き、横書きが、「描画方法」"にも"依存するからでは?
マリテス
会議室デビュー日: 2004/02/14
投稿数: 9
投稿日時: 2004-02-16 23:34
問題点がぼけてきているようなので一言
本来、描画方向と縦書き書体は別物です。
LOGFONT構造体の設定では、
・文字のデザイン
・文字の回転
・文字の描画方向
を別々に設定しています。
多分縦書きフォントのニーズは日本で始めて発生しており、
書体名(先頭に@をつける)ことでのみ縦書きフォントと通常のフォントとを
区別しています。ですから縦書きフォントを実装している書体とそうでない書体が
あるのです。特に縦書きフォントが必要な文字に、「」、。などがあり、これらは
通常のフォントを90度回転しただけでは解決しないために特別にデザインされています。書体によっては全ての文字を縦書き用にデザインしなおしているものもありますが大半は、異なる部分のみを用意し残りは、横書きフォントを共有しています。
ですから縦書きフォントがある書体とそうでない書体では自ずと、縦書き時には異なる結果となるのです。ですから縦書き文書を書く場合は、どうしても縦書き書体が必要なのです。それが、私が縦書き書体の一覧が必要な理由なのです。
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-17 09:21
「縦書き書体」についてですがWin98等では確かに先頭に「@」のついたフォントが一覧に表示されていましたが、現在私のWindows2000とWindowsXPについては表示されません。またコントロールパネルのフォントのフォルダを見てもありません。

.NETのコモンダイアログの「FontDialog.AllowVerticalFonts」プロパティの説明に
「縦書きと横書きのフォントを両方とも使用できる場合は true 。それ以外の場合は false 。既定値は true です。」とあり、既定値(両方とも使用できる場合)で表示を掛けると、英文フォントを含めた一覧が表示されます。

私が自分のプログラムの中で使用した例(C#)では、StringFormat.FormatFlags に StringFormatFlags.DirectionVerticalをセットした StringFormat を指定したDrawStringの縦書きで「 及び 」。ー(カナの横棒)などは正しく処理されます。英文書体を指定しても日本語についてはフォントファミリの適切な日本語フォントが自動的に選ばれるようで取りあえずは正しく?描画されます。単純な縦書き描画であればAPIのLOGFONT構造体を使う必要はありませんでした。

Windows95,98用に昔作ったプログラムの中で特定のフォントだけを表示したいときにはJubeiさんの言われていたWin32 APIのコールバック関数(CompareFontFamiliesCallBack())を使ってやっていましたが、どうしてもと言うことであればその方法しか無いようにおもいます。(使い方はJubeiさんコメントのリンクから)
マリテス
会議室デビュー日: 2004/02/14
投稿数: 9
投稿日時: 2004-02-17 10:55
確かにXPでは、@フォントの隠蔽化がされているみたいで表面上は出てこないようですね。FontDialogのAllowVerticalFontsも確認しましたが、これがダイアログの中でどうゆう風になっているのかは全く不明ですが、少なくとも、通常フォントとは別に縦書きフォントがあるということは、AllowVerticalFontsの存在からも自明ですね。
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-02-17 11:57
引用:

通常のフォントを90度回転しただけでは解決しないために特別にデザインされています。書体によっては全ての文字を縦書き用にデザインしなおしているものもありますが大半は、異なる部分のみを用意し残りは、横書きフォントを共有しています。
ですから縦書きフォントがある書体とそうでない書体では自ずと、縦書き時には異なる結果となるのです。ですから縦書き文書を書く場合は、どうしても縦書き書体が必要なのです。それが、私が縦書き書体の一覧が必要な理由なのです。



書でいう書体は俗に5体(楷書、行書、草書、篆書、隷書)あり、確かに厳密には行書や草書は次の文字への流れが横書きと縦書きでは変わってくる為(通常、書では横への流れはありえない)、高級な書体では横書き用と縦書き用が別セットであるのかもしれませんね。しかし、その場合は文字幅のフィックスとプロポーショナルが別書体になっているように書体名を変えて別書体とするのではないでしょうか?(この辺は想像です)
 フォントメーカーに聞かないと判りませんが、その場合は「@」ではないと思いますし、書体名の付け方はメーカーごとに決められ統一性が無いかもしれませんね....(この辺も想像です)
 わたしのPCに入っている書体のように殆どの書体は、特定の幾つかの文字だけ縦書き用に用意して他の殆どの文字は縦横共用だと思います。

引用:


少なくとも、通常フォントとは別に縦書きフォントがあるということは、AllowVerticalFontsの存在からも自明ですね。




 というより、縦書きフォント用特定文字に対応できるかの判断で、StringFormatFlags.DirectionVerticalは特別な文字の時には縦書き用を使えという、単純にスイッチのような気がしますが....
(寧ろ、以前の@付に?の思いがありましたが)
マリテス
会議室デビュー日: 2004/02/14
投稿数: 9
投稿日時: 2004-02-17 13:32
後半は、Hirashigeさんの書かれたとおりかも知れません。私が現在やっている仕事は、生成された文字列を指定されたピクセルサイズの中に隙間無くかつ極力美しく埋め込む仕事なのです。
実際のところ縦書きだけであれば

uFont = New Font("MS ゴシック", 16, FontStyle.Regular, GraphicsUnit.Pixel)

Dim eg As Graphics = e.Graphics
Dim fmt As New System.Drawing.StringFormat
fmt.FormatFlags = StringFormatFlags.DirectionVertical
eg.RotateTransform(-90)
eg.TranslateTransform(-17, 0)
eg.DrawString("「テスト。」あーかABCDE", uFont,      System.Drawing.Brushes.Orange, 0, 0, fmt)

でうまく表示できましたが、文字幅の取得及び制御等を1ピクセル単位で行わないと指定の場所に表示できないのです。上記例でも高さ16で生成しているのみ、90度回転して16ピクセルだけの移動では、文字が欠けてしまいます。17にするととりあえず全部でましたが、感に頼るようなことでは、フォントが変わったり、サイズが変わったときに不具合を起こしかねないので完璧な制御がしたいのです。
マリテス
会議室デビュー日: 2004/02/14
投稿数: 9
投稿日時: 2004-02-17 13:31
後半は、Hirashigeさんの書かれたとおりかも知れません。私が現在やっている仕事は、生成された文字列を指定されたピクセルサイズの中に隙間無くかつ極力美しく埋め込む仕事なのです。
実際のところ縦書きだけであれば

uFont = New Font("MS ゴシック", 16, FontStyle.Regular, GraphicsUnit.Pixel)

Dim eg As Graphics = e.Graphics
Dim fmt As New System.Drawing.StringFormat
fmt.FormatFlags = StringFormatFlags.DirectionVertical
eg.RotateTransform(-90)
eg.TranslateTransform(-17, 0)
eg.DrawString("「テスト。」あーかABCDE", uFont,      System.Drawing.Brushes.Orange, 0, 0, fmt)

でうまく表示できましたが、文字幅の取得及び制御等を1ピクセル単位で行わないと指定の場所に表示できないのです。上記例でも高さ16で生成しているのみ、90度回転して16ピクセルだけの移動では、文字が欠けてしまいます。17にするととりあえず全部でましたが、感に頼るようなことでは、フォントが変わったり、サイズが変わったときに不具合を起こしかねないので完璧な制御がしたいのです。

スキルアップ/キャリアアップ(JOB@IT)