文字に縁(ふち)をつける(縁取り文字)には?

解決


ひろみ  2006-11-17 21:47:49  No: 134170

はじめまして。
質問させていただきます。

VB6で、文字を縁取りすることはできますでしょうか?

textout(API)で、上下左右に数ピクセルずらして表示させる方法があることはわかりましたが、
その他、もっときれい(なめらか)に表示させる方法はありますでしょうか?
なにとぞ、よろしくお願いいたします。


K.J.K.  2006-11-17 22:13:10  No: 134171

API関数をいくつか使えば可能でしょう。

まずPathを作ってそこで文字列を描画して、そのあとStrokeAndFillPath
で囲んでしまえばいいのでは。


ひろみ  2006-11-18 00:28:03  No: 134172

お返事ありがとうございます。

宣言が
Declare Function StrokeAndFillPath Lib "gdi32" (ByVal hDC As Long) As Long
というのはわかったんですが、
知識不足のため他が分かりません。
もう少し詳しく教えていただけますでしょうか。
すみませんがよろしくお願いします。


Blue  2006-11-18 01:57:29  No: 134173

>API関数をいくつか
ですので、当然 StrokeAndFillPath だけでは出来ません。

・背景モードをTRANSPARENTにする → SetBkMode
・適切なフォントを作成する → CreateFont
・適切な文字色にするためのブラシを作る → CreateSolidBrush
・適切なふちの色にするためのペンを作る → CreatePen
・フォント、ブラシ、ペンを選択させる → SelectObject
・パスを開始する → BeginPath
・文字を描画する(パスを作成する) → TextOut
・パスを終了する → EndPath
・輪郭と塗りつぶしを同時に行う → StrokeAndFillPath
・背景モード、フォント、ブラシ、ペンを変更前に戻す(SelectObject)
・作成したフォント、ブラシ、ペンを削除する → DeleteObject

# 面倒すぎて、正直VB6でやる気はしない。

StrokeAndFillPathではおそらく、ASCII文字しかカバーできないと思う。
(ひらがなとか漢字は多分むりっぽいかも。
そういうフォント(アウトラインフォント)であれば出来るかもしれないけど)


Blue  2006-11-18 01:58:52  No: 134174

訂正
>・背景モード、フォント、ブラシ、ペンを変更前に戻す(SelectObject)
背景モードだけは SetBkMode でした。


ひろみ  2006-11-18 04:10:47  No: 134175

K.J.K.様、Blue様お返事ありがとうございます。
すごくめんどくさいんですね・・・。
映像の上に表示するテロップを作りたいと思っています。
アンチエイリアス処理をするとかいろいろ考えてみます。


K.J.K.  2006-11-18 20:03:30  No: 134176

# 条件分岐も同期処理も不要でただ繋げて書けばいいもの、を面倒であると
# 言ってしまったら...

Formに以下のコントロールが貼り付けてあると仮定します。
mwEdit As TextBox
mwButton As CommandButton
mwImage As PictureBox

Private Declare Function BeginPath Lib "gdi32.dll" _
(ByVal hDC As Long) As Long

Private Declare Function EndPath Lib "gdi32.dll" _
(ByVal hDC As Long) As Long

Private Declare Function StrokeAndFillPath Lib "gdi32.dll" _
(ByVal hDC As Long) As Long

Private Sub mwButton_Click()
    mwImage.AutoRedraw = True
    Call mwImage.Cls
    mwImage.DrawMode = DrawModeConstants.vbNop
    mwImage.CurrentX = 8&
    mwImage.CurrentY = 8&
    Call BeginPath(mwImage.hDC)
    mwImage.Print mwEdit.Text
    Call EndPath(mwImage.hDC)
    mwImage.DrawMode = DrawModeConstants.vbCopyPen
    Call StrokeAndFillPath(mwImage.hDC)
    mwImage.AutoRedraw = False
End Sub

これだけで、ひらがななどの縁取りもできますよね。


Blue  2006-11-18 23:38:11  No: 134177

># 条件分岐も同期処理も不要でただ繋げて書けばいいもの、を面倒であると
># 言ってしまったら...
いや、、、複雑になるのであれば、面倒という表現ではなく、「難しい」というつもりでした。
今回は単にAPI宣言が面倒だなぁ、と思ったためつい「面倒です」といってしまいました。

> StrokeAndFillPathではおそらく、ASCII文字しかカバーできないと思う。
> (ひらがなとか漢字は多分むりっぽいかも。
> そういうフォント(アウトラインフォント)であれば出来るかもしれないけど)

>   mwImage.Print mwEdit.Text
> これだけで、ひらがななどの縁取りもできますよね。
ということだったので、
TextOutではなく、DrawTextにしてみたら、ちゃんとできることが確認できました。
すみません、確認不足でした。


ひろみ  2006-11-18 23:45:43  No: 134178

ありがとうございます!!!
文字を囲むことができましたし、ひらがなもOKでした。
このサンプルをお手本に、いろいろできそうです。
K.J.K.様ほんとうにありがとうございました。


ひろみ  2006-11-18 23:47:21  No: 134179

Blue様もありがとうございます。
いろんなAPIを知れて勉強になりました。


Blue  2006-11-18 23:51:23  No: 134180

>TextOutではなく、DrawTextにしてみたら、ちゃんとできることが確認できました。
あれ?そうでもなかった。
(昨日試したとき、なんか勘違いしていたのかも。もしくは環境依存か、)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加