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

FixedSys

  • 題名: FixedSys
  • 著者: DEG
  • 日時: 2004/09/13 21:18:56
  • ID: 6149
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Win2000 VB.NET 1.1]
分類:[.NET]

VB.NETで、FixedSysをつかいたいのですが、

Me.Font = New Font("FixedSys", 13.5)

などとすると、まったく異なるフォントで表示されてしまいます

FixedSysを使う方法があれば教えていただけないでしょうか
  • 題名: Re[1]: FixedSys
  • 著者: 深山
  • 日時: 2004/09/14 12:53:54
  • ID: 6167
  • この記事の返信元:
    • [6149] FixedSys DEG 2004/09/13 21:18:56
  • この記事への返信:
  • ツリーを表示
■No6149に返信(DEGさんの記事)

 DEGさん、こんにちは。深山と申します。

> FixedSysを使う方法があれば教えていただけないでしょうか

 ラスタ フォントである FixedSys は、 VB.NET では使用できないようです。

Visual Basic .NET におけるフォントの変更点
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/Vbcon/html/vbconfontchangesinvisualbasic60.asp
# 『フォントの互換性』参照
  • 題名: Re[2]: FixedSys
  • 著者: DEG
  • 日時: 2004/09/14 19:10:49
  • ID: 6173
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
深山さん、返信ありがとうございます

>  ラスタ フォントである FixedSys は、 VB.NET では使用できないようです。

残念、やはりダメなんですね

TextBoxなど、標準のコントロールでは、
MSゴシックなど、固定幅フォントを使っても
漢字混じりの行と、そうでない行とで、文字がすこしズレるのが
気に入らなかったので、FixedSysを使いたかったのですが...
解決済み!
> 残念、やはりダメなんですね

こんにちは、antと申します。

全く不可能ということはありません。
確かに.NET Frameworkでは標準でサポートされていないかもしれませんが、
Win32 APIを使用すれば、変更することができます。
簡単には…
LOGFONT構造体に値をセットして、CreateFontIndirect()を使用して
フォントのハンドルを取得します。あとは、SendMessage()でWM_SETFONT
というメッセージを目的のコントロールに送信しておけばいいでしょう。
antさん、情報ありがとうございます

> LOGFONT構造体に値をセットして、CreateFontIndirect()を使用して
> フォントのハンドルを取得します。あとは、SendMessage()でWM_SETFONT
> というメッセージを目的のコントロールに送信しておけばいいでしょう。

おぉ、そんな裏技があるんですか
SendMessage()は使ったことないけど
CreateFontIndirect()のほうは使ったことあるので
なんとかなりそうな気がしてきました。
解決済み!
  • 題名: Re[5]: FixedSys
  • 著者: DEG
  • 日時: 2004/09/17 20:26:55
  • ID: 6227
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
解決済みにしておいて、つづきを書いて恐縮ですが

> なんとかなりそうな気がしてきました。

さっそく試してみましたが、うまく行きませんでした

CreateFontIndirect()
...LOGFONT設定値がFixedSysにマッチしてるか自信ないけど一応成功
SendMessage()
...戻り値がないので不明
結果、
元のMSゴシックで表示されました
> さっそく試してみましたが、うまく行きませんでした
> CreateFontIndirect()
> ...LOGFONT設定値がFixedSysにマッチしてるか自信ないけど一応成功
> SendMessage()
> ...戻り値がないので不明
> 結果、
> 元のMSゴシックで表示されました

ん〜自分がテストしたところ変化しているんですが…FixedSysと
MSゴシックを見分けられているのか少々不安です。(^^;
一度かかれたコードを見せてもらえませんか?
antさんこんにちは、
> ん〜自分がテストしたところ変化しているんですが…FixedSysと
> MSゴシックを見分けられているのか少々不安です。(^^;
見分けるって?

> 一度かかれたコードを見せてもらえませんか?
コードを見て頂けるとは、うれしいです。

Public Class useFixedSys
Public Const LF_FACESIZE As Int32 = 32
Public Const DEFAULT_CHARSET As Byte = 1
Public Const FW_NORMAL As Int32 = 400
Public Const FIXED_PITCH As Byte = 1
Public Const OUT_RASTER_PRECIS As Byte = 6
Public Const WM_SETFONT As Int32 = 30

Public Structure LOGFONT
Public lfHeight As Int32
Public lfWidth As Int32
Public lfEscapement As Int32
Public lfOrientation As Int32
Public lfWeight As Int32
Public lfItalic As Byte
Public lfUnderline As Byte
Public lfStrikeOut As Byte
Public lfCharSet As Byte
Public lfOutPrecision As Byte
Public lfClipPrecision As Byte
Public lfQuality As Byte
Public lfPitchAndFamily As Byte
<VBFixedString(LF_FACESIZE)> Public lfFaceName As String
Public Sub New(ByVal fontName As String)
lfWeight = FW_NORMAL
lfCharSet = DEFAULT_CHARSET
lfPitchAndFamily = FIXED_PITCH
lfOutPrecision = OUT_RASTER_PRECIS
lfFaceName = fontName
lfHeight = 18
End Sub
End Structure
Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (ByRef lpLogFont As LOGFONT) As Int32
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Integer


Private Shared mLF As New LOGFONT("FixedSys")
Private Shared hFixedSys As Int32

Public Shared Sub SetFont(ByVal hWnd As IntPtr)
hFixedSys = CreateFontIndirect(mLF)
SendMessage(hWnd, WM_SETFONT, hFixedSys, 0)
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
If hFixedSys <> 0 Then DeleteObject(hFixedSys)
End Sub
End Class

で、以下のように使用しました
Dim frm As New Form
Dim Tx As New TextBox
frm.Show()
useFixedSys.SetFont(frm.Tx.Handle)
frm.Tx.AppendText("xxx")

(実際のTestでは、frmはMDI子フォームで、親フォームのフォントはMSゴシックです)
で、表示はMSゴシックでした
いくつか、修正したほうが良い点があります。

> Public Const WM_SETFONT As Int32 = 30

これは、

Public Const WM_SETFONT As Int32 = &H30

としないと他のメッセージになってしまいます。(^^;


> Public Structure LOGFONT
> End Structure

基本的に構造体にはStructLayoutでSequentialにしておいた方が
安全です。メモリ上のレイアウトはアンマネージとマネージにおいては
必ずしも一致するとは限りません。


> Public Shared Sub SetFont(ByVal hWnd As IntPtr)
> hFixedSys = CreateFontIndirect(mLF)
> SendMessage(hWnd, WM_SETFONT, hFixedSys, 0)
> End Sub

SnedMessageの最後の引数に0を指定されていますが、これでは
再描画されないと思うので、1に設定したほうがいいと思います。
#他の場所で再描画しておられるのでしたら、いいのですが…。


> Protected Overrides Sub Finalize()
> MyBase.Finalize()
> If hFixedSys <> 0 Then DeleteObject(hFixedSys)
> End Sub
> End Class

最後に今回のようにアンマネージリソースを保有している
クラスの場合はIDisposableを実装してFinalizeと共に
使用したほうがいいと思います。
  • 題名: Re[9]: FixedSys
  • 著者: DEG
  • 日時: 2004/09/19 9:25:16
  • ID: 6234
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
antさん、添削ありがとうございます

> いくつか、修正したほうが良い点があります。
> Public Const WM_SETFONT As Int32 = &H30

あらびっくり、APIビュワーからコピーするべきでした
&H30にしたらちゃんと動きました

> 基本的に構造体にはStructLayoutでSequentialにしておいた方が
> 安全です。メモリ上のレイアウトはアンマネージとマネージにおいては
> 必ずしも一致するとは限りません。

そのように心がけます

> 最後に今回のようにアンマネージリソースを保有している
> クラスの場合はIDisposableを実装してFinalizeと共に
> 使用したほうがいいと思います。

Dispose()は、New xxClass()で
何度も、作ったり破棄したりする場合に必要なのかな〜
ぐらいにしか理解していませんが、
より汎用性のあるクラスに改良するときに考えてみます。

おかげでよい勉強になりましたことを、かさねてお礼申しあげます。
解決済み!

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