最終更新日 2024-09-25

手書き入力

概要

手書き入力に関しても、.NETであれば、非常に簡単に扱えます。

ダウンロード

更新日 2017/12/15
HmHandPen v1.30

手書き入力

以下のファイルを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);