最終更新日 2024-09-25

フォントリストやフォントプレビュー

概要

フォント選択ダイアログといったものは、.NETであれば、非常に簡単に呼び出せるため、
特に例は不要でしょう。
ここでは既定のフォントダイアログではなく、「お手製のフォント選択画面」のようなものを作る例となります。

フォントのリストとフォントプレビュー

以下のファイルをfontlist.pyとして保存します。

# coding: cp932

import clr
clr.AddReference("System.Drawing")
clr.AddReference('System.Windows.Forms')
from System.Drawing import Font, FontStyle
from System.Drawing.Text import InstalledFontCollection
from System.Windows.Forms import (Form, Button, BorderStyle, DockStyle,
                                  ListBox, ComboBox, TextBox, StatusBar)

fontCollection = InstalledFontCollection()
fonts = [f for f in fontCollection.Families]

f = Form()
f.Text = 'フォントプレビューワー'
f.Width = 800
f.Height = 600

lb = ListBox()
lb.Width = 230
for font in fonts:
    lb.Items.Add(font.Name)
lb.SelectedIndex = 0

cbSizes = ComboBox()
for i in range(9, 49):
    cbSizes.Items.Add(str(i))
cbSizes.Text = '30'

cbStyles = ComboBox()
for s in ['Regular', 'Bold', 'Italic']:
    cbStyles.Items.Add(s)
cbStyles.Text = 'Regular'

tb = TextBox()
tb.Font = Font(fonts[0], 30)
tb.Multiline = True
tb.Text = u"Hello World!\r\nこんにちわ!"

sb = StatusBar()
sb.Text = 'Found %d installed fonts' % len(fonts)

# Layout:
lb.Dock = DockStyle.Left
tb.Dock = DockStyle.Fill
cbSizes.Dock = DockStyle.Top
cbStyles.Dock = DockStyle.Top
sb.Dock = DockStyle.Bottom
f.Controls.Add(tb)
f.Controls.Add(cbStyles)
f.Controls.Add(cbSizes)
f.Controls.Add(lb)
f.Controls.Add(sb)
f.ActiveControl = lb

# Event handling
def ChangeFont():
    try:
        tb.Font = Font(fonts[lb.SelectedIndex],
                       int(cbSizes.Text),
                       getattr(FontStyle, cbStyles.Text))
        sb.Text = ''
    except Exception, e:
        sb.Text = unicode(e)

lb.SelectedIndexChanged += lambda sender, args: ChangeFont()
cbSizes.TextChanged     += lambda sender, args: ChangeFont()
cbStyles.TextChanged    += lambda sender, args: ChangeFont()

try:
    f.ShowDialog()
finally:
    hm.Macro.Var["$SelectFontName"] = tb.Font.Name
    hm.Macro.Var["$SelectFontSize"] = tb.Font.Size.ToString()
    hm.Macro.Var["$SelectFontStyle"] = tb.Font.Style.ToString()
    f.Close()

.macからの呼び出し

フォントのプレビューフォームのウィンドウを閉じると、フォント名を取得するという単純なものとなります。
実際の制作では、プレビューフォームのウィンドウには「OK」ボタンなどを付けた方がよいでしょう。

#PY = loaddll( hidemarudir + "\\" + "hmPy.dll" );

#_ = dllfuncw(#PY, "DoFile", currentmacrodirectory + "\\fontlist.py" );

message($SelectFontName + " | " + $SelectFontSize + " | " + $SelectFontStyle);

freedll(#PY);