DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字の縦横のそれぞれのザイズの設定

環境/言語:[C#]
分類:[.NET]

フォントについての質問です。

現在はフォントを作成するときは、以下のように作成しています。
Font fnt = new Font(FontName ,FontSize , FontStyle);

これだとフォントのサイズは1つしか設定できないので、
通常の一般的なサイズで作成されますが、
今回は通常よりも横長のフォントなどにする方法を調べています。

できれば縦と横のサイズを指定したいのですが、
もしご存知の方がいらっしゃれば教えてください。

よろしくお願いします。
> 今回は通常よりも横長のフォントなどにする方法を調べています。

横長!!!
そんなの当然サポートされていないと思う。

やるとしたら画像にしてから伸ばしてあげてください。
> 今回は通常よりも横長のフォントなどにする方法を調べています。

試してみたこと無いけど、Font.FromLogFont() で出来ないですかね?

> 横長!!!
> そんなの当然サポートされていないと思う。
>
> やるとしたら画像にしてから伸ばしてあげてください。

WindowsAPIではサポートされていたのでドットネットでも何らかの方法で
縦横それぞれのサイズを指定できると思ったのですが・・・。

> 試してみたこと無いけど、Font.FromLogFont() で出来ないですかね?

なるほど、と思い早速試してみたのですがちょっと使い方がわかりません。

1.ToLogFontで既存のフォントからLogFont構造体を作成
2.LogFont構造体にそれぞれのサイズをセット
3.Font.FromLogFont() でフォントを作成

という処理の流れだとは思うのですがまず1でつまずきました。

public void ToLogFont(object logFont, Graphics graphics);
でGDI+ LOGFONT 構造体を作成します。とMSDNにはあるのですが、

object logfont = new object();
fnt.ToLogFont(logfont,myGraphics);
と指定すると、

「Object で型指定されたパラメータに渡された値の PInvoke 変換は存在しません。」
んというメッセージが出て落ちてしまいます。
おそらくオブジェクト型の指定の仕方が悪いと思うのですが、どうすればよいかわからないので教えてください。

よろしくお願いします。
> おそらくオブジェクト型の指定の仕方が悪いと思うのですが、どうすればよいかわからないので教えてください。

 LOGFONT 構造体の定義は自分でしなくてはいけないと思いますよ。
> public void ToLogFont(object logFont, Graphics graphics);
> でGDI+ LOGFONT 構造体を作成します。とMSDNにはあるのですが、

LOGOFONT 構造体の定義は

P/INVOKE.NET
http://www.pinvoke.net/

辺りで拾ってください。

その上で

> object logfont = new object();
> fnt.ToLogFont(logfont,myGraphics);

ではなく

LOGFONT logfont = new LOGFONT();
fnt.ToLogFont (logfont, MyGraphics);

としてください。


> と指定すると、
>
> 「Object で型指定されたパラメータに渡された値の PInvoke 変換は存在しません。」
> んというメッセージが出て落ちてしまいます。
> おそらくオブジェクト型の指定の仕方が悪いと思うのですが、どうすればよいかわからないので教えてください。
>
> よろしくお願いします。
>深山様、渋木宏明様
ありがとうございます。
なんとかLogFont構造体を使用することができました。
しかし、Width等の値を変更しても印字結果はLogFontを使用しない場合とほぼ同じでした。
どんな値を入れてもまったく同じか、微妙にサイズが変わるぐらいで、
なにか制限されているような感じになっています。

とりあえず本当に有効かどうかテストしようとして、LogFont構造体の
lfEscapementに角度なども設定してみたのですがこれはまったく変わりませんでした。

う〜ん、これでいけると思ったのですがDrawStringではだめなのかもしれないですね・・・。
> しかし、Width等の値を変更しても印字結果はLogFontを使用しない場合とほぼ同じでした。

フォントの種類によると思いますよ。
TrueType 系のフォントなら横長とかになるんじゃないかな???
Graphicsオブジェクトに描画するのであれば、
横幅は、Graphics.TranslateTransformで、角度は、Graphics.RotateTransformで設定する方法はどうでしょうか?
(角度の場合、Fontの角度だけで、ベースラインは水平にしたい場合には1文字ずつ書くしかないですが)


以下、サンプルです。(VBのコードですみません)

Dim g As Graphics

Dim Text As String

With PictureBox1
.Image = New Bitmap(.Width, .Height)
g = Graphics.FromImage(.Image)
End With

Text = "幅の広い文字 200%"
g.ScaleTransform(2.0F, 1.0F)
g.DrawString(Text, Me.Font, Brushes.Blue, 20 / 2.0F, 10)
g.ResetTransform()

Text = "幅の狭い文字 50%"
g.ScaleTransform(0.5F, 1.0F)
g.DrawString(Text, Me.Font, Brushes.Blue, 20 / 0.5F, 30)
g.ResetTransform()

g.RotateTransform(30.0F)
Text = "斜め方向 30度"
g.DrawString(Text, Me.Font, Brushes.Red, 50, 50)
g.ResetTransform()

g.Dispose()


DOBON.NET > プログラミング道 > .NET Tips > 画像、印刷 の「ワールド変換により画像を平行移動、拡大、縮小、回転して表示する」
http://dobon.net/vb/dotnet/graphics/transform.html を参考にしてください。
>ポンさん、渋木さん
いろいろありがとうございました。
ポンさんのやりかたですんなりできました。
どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板