手書き入力

  • 概要

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

  • ダウンロード

    DOWNLOAD ⇒ HmHandPen v1.30ファイル。
    └更新日 2017/04/08

    手書き入力

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