手書き入力に関しても、.NETであれば、非常に簡単に扱えます。
以下のファイルを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);