最終更新日 2025-07-22
手書き入力
概要
手書き入力に関しても、.NETであれば、非常に簡単に扱えます。

ダウンロード
更新日 2017/12/15
手書き入力
以下のファイルをHmHandPen.macとして保存します。
処理内容のコツとしては、ペンを動かす「Stroke」の後に時間差を付けて「ToString」することです。
こうすることで、「書き加え」と「一部消去」を一貫して取り扱うことが出来ます。
最後に分析した情報を取得すれば良いでしょう。
#PY = loaddll( hidemarudir + "\\" + "hmPY.dll" );
if ( !#PY ) {
message("hmPy.dllが導入されていません");
endmacro;
}
#_ = dllfuncw(#PY, "DoString", R"IPY(
import sys
import clr
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')
clr.AddReference('Microsoft.Ink')
from System.Drawing import Font, Color
from System.Windows.Forms import (Form, Timer, DockStyle, Panel, TextBox, Button,
SplitContainer, Orientation)
from Microsoft.Ink import *
f = Form()
f.Text = '手書き入力'
btnClr = Button()
btnClr.Text = 'クリア'
btnCng = Button()
btnCng.Text = '消しゴムに変更する'
pnl = Panel()
pnl.BackColor = Color.Khaki
overlay = InkOverlay(pnl)
overlay.Enabled = True
tb = TextBox()
tb.Font = Font('MS 明朝', 20)
tb.Multiline = True
sc = SplitContainer()
sc.SplitterWidth = 10
sc.Orientation = Orientation.Horizontal
# Layout
f.Width = 600
f.Height = 400
sc.Dock = DockStyle.Fill
btnClr.Dock = DockStyle.Top
btnCng.Dock = DockStyle.Top
tb.Dock = DockStyle.Fill
pnl.Dock = DockStyle.Fill
f.Controls.Add(sc)
sc.Panel1.Controls.Add(btnClr)
sc.Panel1.Controls.Add(btnCng)
sc.Panel1.Controls.Add(pnl)
sc.Panel2.Controls.Add(tb)
def OnStrokesDeleted(sender, args):
tb.Text = overlay.Ink.Strokes.ToString()
overlay.StrokesDeleted += OnStrokesDeleted
def OnBtnClr_Click(sender, args):
overlay.Ink.DeleteStrokes()
pnl.Refresh()
tb.Text = ''
btnClr.Click += OnBtnClr_Click
def OnBtnCng_Click(sender, args):
if overlay.EditingMode == InkOverlayEditingMode.Ink:
overlay.Enabled = False;
overlay.EditingMode = InkOverlayEditingMode.Delete;
# 削除を指定します。
overlay.EraserMode = InkOverlayEraserMode.StrokeErase;
# オーバーレイを再び有効にします。
overlay.Enabled = True;
btnCng.Text = 'ペンに変更する'
else:
overlay.Enabled = False;
overlay.EditingMode = InkOverlayEditingMode.Ink;
# オーバーレイを再び有効にします。
overlay.Enabled = True;
btnCng.Text = '消しゴムに変更する'
btnCng.Click += OnBtnCng_Click
def TimerDraw(t, args):
tb.Text = overlay.Ink.Strokes.ToString()
if t:
t.Stop()
t = None # 破棄
# Event handling
def OnStroke(sender, args):
t = Timer();
t.Tick += TimerDraw;
t.Interval = 100; # ミリ秒単位で指定
t.Start();
overlay.Stroke += OnStroke
def FormClosed(sender, args):
hm.debuginfo("close")
f.FormClosed += FormClosed
f.ShowDialog()
hm.Macro.Var["$lasttext"] = tb.Text
)IPY"
);
message($lasttext);
freedll(#PY);