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

  • 概要

    フォント選択ダイアログといったものは、.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);