tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDrawStringについて
記事No5862
投稿日: 2007/07/18(Wed) 16:13
投稿者Edward
Graphics.FromImage.DrawStringを用いてPictureBox等に
文字列を描画する場合に。
任意の角度の斜体にさせたり、
任意の太さの太字にさせる事って
出来ませんでしょうか?

また、フォントって普通ポイント単位で大きさを指定しますが。
これって印刷した時に高さが何mmになるのかって、どう換算したら
良いのでしょうか?

どなたか御指導下さいますよう、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: DrawStringについて
記事No5867
投稿日: 2007/07/19(Thu) 15:29
投稿者よねKEN
実際には試してみないとうまくいくかどうかわかりませんので、
こんな案があるかもしれませんという程度のコメントですが・・・。

> Graphics.FromImage.DrawStringを用いてPictureBox等に
> 文字列を描画する場合に。
> 任意の角度の斜体にさせたり、
> 任意の太さの太字にさせる事って
> 出来ませんでしょうか?

http://bbs.wankuma.com/index.cgi?mode=al2&namber=2102&KLOG=10

のような方法はどうでしょうか。
(C++.NETでの話しになってますが、C#/VB.netでも考え方は同じです)

要点としてはMatrixクラスを使って、拡大、あるいは、回転させてはどうか?ということです。
任意の角度の斜体というのが回転ではなく、いわゆる斜体字のイメージだとまた違ってきますが。

> また、フォントって普通ポイント単位で大きさを指定しますが。
> これって印刷した時に高さが何mmになるのかって、どう換算したら
> 良いのでしょうか?

GraphicsクラスのMeasureStringメソッドを使ってサイズを測定してはどうでしょうか。
#プリンタに対して果たして期待通りの値が返ってくるかわかりませんが

ピクセル×DPI → インチ
インチ × 25.4 → mm
という感じで換算する。

○インチ
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%81

[ツリー表示へ]
タイトルRe^2: DrawStringについて
記事No5874
投稿日: 2007/07/20(Fri) 10:15
投稿者Edward
よねKEN様
情報有難う御座います。

> 要点としてはMatrixクラスを使って、拡大、あるいは、回転させてはどうか?ということです。
> 任意の角度の斜体というのが回転ではなく、いわゆる斜体字のイメージだとまた違ってきますが。
説明が不十分で申し訳御座いません。
・傾斜角度を指定出来るイタリック体
・太さを指定出来るボールド体
を作りたいと考えています。
何方か御指導下さいますよう、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: DrawStringについて
記事No5889
投稿日: 2007/07/20(Fri) 15:24
投稿者花ちゃん
> ・傾斜角度を指定出来るイタリック体
> ・太さを指定出来るボールド体

どのような必要があるのでしょうか?
太字より太くすれば、黒い部分が重なって殆どの文字が読めなくなるのでは。
斜体についても同じ事が言えるのではないでしょうか?

従って誰もそのような事を苦労してまでやろうとは思わないし多分簡単にはできないかと
せいぜい、影付き文字を作成する要領で、表示位置(印刷位置)をずらして2度書き
する位かと、これだって重なって読めなくなりますよね。
廣嶋なんて文字にそのようにすれば真っ黒になるのでは。
太くしたいならフォントサイズを大きくするかそのようなフォント(極太明朝体等)を
使うのが通常のやり方ではないでしょうか?

下記の程度の事なら比較的簡単にできますが
 http://hanatyan.sakura.ne.jp/dotnet/font03.htm


下記は参考までに
72ポイント=1インチ

1ポイント=1/72インチ

1 インチ = 72 ポイント = 1440 twip

1mm = 56.7twip

1ピクセル=15twip(画面の解像度による)

1ポイント=0.3528mm

1インチ=25.4mm

1twip=0.01763668mm

12ポイント=240twip =12/72インチ=4.23mm

  MS 明朝 及び MS ゴシック

   文字ポイント   半角幅    全角幅
      9      90    180    
     10     105    195
     11     120    225
     12     120    240
     14     150    285
     16     165    315
     18     180    360
     20     210    405

    幅の単位=twip

フォントサイズ=.75 ポイント飛び(10ポイント=9.75ポイントで 11ポイント=10.5ポイントです)

 http://hanatyan.sakura.ne.jp/dotnet/Prt10.htm

[ツリー表示へ]
タイトルRe^4: DrawStringについて
記事No5892
投稿日: 2007/07/22(Sun) 23:57
投稿者Edward
イラストレーター等の文字装飾機能の簡易版を
自前で作りたいと言う要望が有ります。

>下記の程度の事なら比較的簡単にできますが
> http://hanatyan.sakura.ne.jp/dotnet/font03.htm
はい、参考にさせていただいております。

花ちゃんのサンプルに斜体機能と基準点設定(左中右/上中下)機能と
太字機能とミリ単位での文字列の大きさ設定機能が追加出来れば、
事足りる要望なのですが。

MSDNのサンプルに以下のようなものを見つけました
任意の角度の斜体を作れるのですが、傾斜の基点が
左上になります、普通は左下ですよね

Dim textSize As SizeF
Dim g As Graphics
Dim myForeBrush As Brush = Brushes.Black
Dim myFont As New Font("Times New Roman", Me.nudFontSize.Value, FontStyle.Regular)
Dim myTransform As Matrix ' Used for shearing text
Dim xLocation, yLocation As Single ' Used for the location

g = picDemoArea.CreateGraphics()
g.Clear(Color.White)

textSize = g.MeasureString(Me.txtShortText.Text, myFont)

xLocation = (picDemoArea.Width - textSize.Width) / 2
yLocation = (picDemoArea.Height - textSize.Height) / 2

g.TranslateTransform(xLocation, yLocation)

myTransform = g.Transform
myTransform.Shear(nudSkew.Value, 0)
g.Transform = myTransform

g.DrawString(txtShortText.Text, myFont, myForeBrush, 0, 0)

どうすれば左下を基点にした斜体に出来るか悩んでおります
何方か御指導下さいますようよろしくお願いいたします。
(太字は出来なくても良いかなと思っています)

[ツリー表示へ]
タイトルRe^5: DrawStringについて
記事No5893
投稿日: 2007/07/23(Mon) 10:37
投稿者よねKEN
> どうすれば左下を基点にした斜体に出来るか悩んでおります

ということの意味は、

>myTransform.Shear(nudSkew.Value, 0)
myTransform.Shear(-nudSkew.Value, 0)

こういうことであってますか?

[ツリー表示へ]
タイトルRe^6: DrawStringについて
記事No5907
投稿日: 2007/07/24(Tue) 13:03
投稿者Edward
よねKEN 様 御意見有難う御座います。

http://www.microsoft.com/downloads/details.aspx?familyid=08e3d5f8-033d-420b-a3b1-3074505c03f3&displaylang=en
で取得した。サンプル集の中の
Advanced .NET Framework (GDI+) - Working with GDI+ Text
と言うプロジェクトに在ったコードなのですが。

> > どうすれば左下を基点にした斜体に出来るか悩んでおります
>
> ということの意味は、
>
> >myTransform.Shear(nudSkew.Value, 0)
> myTransform.Shear(-nudSkew.Value, 0)
>
> こういうことであってますか?

御指摘の所だと傾きの向きが逆になるだけですね。

 このサンプル、PictureBoxの真中に一つだけ斜体の文字列を出す
ならば良いのですが。汎用性を持たせようとすると(複数個の文字列を
それぞれ任意の場所に描画する)。
どうしていいのか判りません。
何方か御指導下さいますようよろしくお願いいたします。

[ツリー表示へ]
タイトルRe^7: DrawStringについて
記事No5912
投稿日: 2007/07/24(Tue) 22:49
投稿者よねKEN
> > > どうすれば左下を基点にした斜体に出来るか悩んでおります
> >
> > ということの意味は、
> >
> > >myTransform.Shear(nudSkew.Value, 0)
> > myTransform.Shear(-nudSkew.Value, 0)
> >
> > こういうことであってますか?
>
> 御指摘の所だと傾きの向きが逆になるだけですね。

「左下を基点にした斜体」という説明の意味がよくわからなかったので、
斜体の傾きが普通の斜体字のイメージと違って、逆向きなのが問題なのですか?
という意味で、私なりの解釈した案を書いてみました。

違うのであれば、具体例を挙げて説明して欲しいところです。
#正直、「傾斜の基点が左上になります、普通は左下ですよね」の意味がわかっていません。

>  このサンプル、PictureBoxの真中に一つだけ斜体の文字列を出す
> ならば良いのですが。汎用性を持たせようとすると(複数個の文字列を
> それぞれ任意の場所に描画する)。
> どうしていいのか判りません。

斜体の表示する座標を制御したい?という意味だったのでしょうか?

TranslateTransformメソッドは座標空間を平行移動していますが、
これはこのサンプルでpicDemoAreaの中心位置にテキストを表示するために
行っているものです。
特に必要なければ、
> xLocation = (picDemoArea.Width - textSize.Width) / 2
> yLocation = (picDemoArea.Height - textSize.Height) / 2
>
> g.TranslateTransform(xLocation, yLocation)
は丸ごと削っても差し支えありません。
その代わりに、
>g.DrawString(txtShortText.Text, myFont, myForeBrush, 0, 0)
の最後の2つの引数に座標を指定します。

g.DrawString(txtShortText.Text, myFont, myForeBrush, 5, 5)
なら、座標(5, 5)に表示するという具合ですね。(原点(0,0)は左上です)

ちょっと調べてみただけですが、以下のサイトがEdwardさんの知りたいことの
説明になっていそうな気がします。
http://www.nextftp.com/swlabo/m1_vbnet/tips2005/2_graphics/g0307.htm

Matrixクラスに関連する情報は「アフィン変換」で検索すると
原理的な話が調べられると思います。

[ツリー表示へ]
タイトルRe^8: DrawStringについて
記事No5924
投稿日: 2007/07/26(Thu) 15:24
投稿者Edward
よねKEN 様
有用な情報有難う御座います。

確かに教えていただいたサイトに掲載されているような事がやりたかったのですが
サンプルには変数宣言が省かれている場合が殆どで、.NET初心者の私ではコンパイル
すら難儀しておりますが。
コツコツ理解してみようと思っています。
有難う御座いました。

[ツリー表示へ]