none
vb.netで手書きサインを書きたい。手書きのまま無変換で RRS feed

  • 質問

  • お世話になります。

    黒と申します。

    win10,vb.net 2015でアプリ開発を行っています。

    やりたい事

    タブレットPC上で動かします。アプリ上に手書き入力スペースを作り、手書きでサインをする。

    そのサインのデータをアプリの別のページに配置してPDFで保存するということがしたいです。

    tabtip.exeの手書き入力部分が素晴らしく、使えないかなと思ったのですが、綺麗な字に変換されてしまう。

    変換しない手書きのままのデータを保存できないですか。そんな方法は無いでしょうか?

    そうすれば、それをpictureboxに読み込ませればできるのではないかと思いました。

    アドバイスいただけると助かります。よろしくお願いいたします。

    2021年2月26日 7:58

回答

  • clearを押してもInkPictureの内容が削除されない

    Clear ボタンを下記のように書き換えておいてください。

    InkPicture1.Ink.DeleteStrokes()
    InkPicture1.Invalidate()
    saveはどこに保存されているのか?

    Save メソッドで永続化されたインクデータは、 Private inkData As Byte() な変数にバイナリデータとして保持されています。Load メソッドでそれを読み取ります。

    アプリケーションを再度開いた時にもインクデータを保持しておきたいのであれば、データベースや外部ファイルなどに保存してみてください。

    http://blog.wdnet.jp/tech/archives/139

    2021年3月1日 12:05

すべての返信

  • InkPicture コントロールでは如何でしょうか? .NET マネージ版、Win32 版、ActiveX 版があります。

    2021年2月26日 8:16
  • PictureBox ということは Windows Forms アプリケーションだとは思いますが、一応それ以外の場合についても。

    2021年2月26日 9:46
  • Windows Forms でのサンプル。

    ツールボックスに、Microsoft.Ink.dll の InkPicture コントロールを追加し、それを Form1 に貼っておいてください。

    該当 DLL は、
    "C:\Program Files (x86)\Common Files\Microsoft Shared\Ink\Microsoft.Ink.dll"
    "C:\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7\Microsoft.Ink.dll"
    などにあるかと思いますが、見つからない場合は Windows SDK をインストールしておく必要があるかもしれません。

    Imports Microsoft.Ink
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Button1.Text = "Save"
            Button2.Text = "Clear"
            Button3.Text = "Load"
            Button4.Text = "CopyBitmap"
            Button5.Text = "CopyMetafile"
            '筆圧検知を有効化し、インク色を濃紺にする
            InkPicture1.DefaultDrawingAttributes.Color = Color.Navy
            InkPicture1.DefaultDrawingAttributes.IgnorePressure = False
        End Sub
        Private inkData(-1) As Byte
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            inkData = InkPicture1.Ink.Save(PersistenceFormat.InkSerializedFormat)
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            InkPicture1.Ink.DeleteStrokes()
    InkPicture1.Invalidate() '←これがないと、削除結果が画面に反映されない End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click InkPicture1.InkEnabled = False 'InkEnabled = False にしておかないと Load できない Using InkPicture1.Ink '保存しておいたインクデータに差し替え InkPicture1.Ink = New Ink() InkPicture1.Ink.Load(inkData) End Using InkPicture1.Invalidate() InkPicture1.InkEnabled = True End Sub Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click Clipboard.Clear() InkPicture1.Ink.ClipboardCopy(InkClipboardFormats.Bitmap, InkClipboardModes.DelayedCopy) End Sub Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click Clipboard.Clear() InkPicture1.Ink.ClipboardCopy(InkClipboardFormats.Metafile, InkClipboardModes.DelayedCopy) End Sub Private Sub InkPicture1_MouseHover(sender As Object, e As EventArgs) Handles InkPicture1.MouseHover 'マウス操作は、インクの選択として扱う If Not InkPicture1.CollectingInk Then InkPicture1.EditingMode = InkOverlayEditingMode.Select End If End Sub Private Sub InkPicture1_CursorInRange(sender As Object, e As InkCollectorCursorInRangeEventArgs) Handles InkPicture1.CursorInRange 'タッチ操作やスタイラスでの描画はインク描画として扱うが、 'スタイラスの逆側を用いた場合には、消しゴムとして扱う Dim isEraser As Boolean = e.Cursor.Inverted ' AndAlso e.Cursor.Name = "Eraser" Dim editingMode = If(isEraser, InkOverlayEditingMode.Delete, InkOverlayEditingMode.Ink) If InkPicture1.EditingMode <> editingMode AndAlso Not InkPicture1.CollectingInk Then InkPicture1.EditingMode = editingMode End If 'タッチ操作の時は赤インク、スタイラスなら濃紺 InkPicture1.DefaultDrawingAttributes.Color = If(e.Cursor.Tablet.IsMultiTouch, Color.Crimson, Color.Navy) End Sub End Class

    • 回答としてマーク 9638masa 2021年2月27日 11:22
    • 回答としてマークされていない 9638masa 2021年2月27日 11:22
    • 編集済み 魔界の仮面弁士MVP 2021年3月2日 12:02 Mouse, Stylus, Touch を区別するようにした。Clear 時に Invalidate を追加。
    2021年2月26日 17:26
  • 魔界の仮面弁士さん

    アドバイスありがとうございます。

    そうです。Windows Formで作業してます。

    あとでやってみます。

    2021年2月27日 11:25
  • 魔界の仮面弁士さん

    お世話になります。黒です。

    アドバイスいただいたinkPictureのコードを試しました。

    無事InkPictureにサインを描くことができました。ありがとうございます。

    しかし、copybitmapとcopymetafileは動作確認できたのですが、

    save,clear,loadのボタンが動作確認できませんでした。一回save,clear,loadのボタンを押すとその後何も出来ないのです。

    saveはどこに保存されているのか?clearを押してもInkPictureの内容が削除されない

    何か足りない設定があるのでしょうか?

    .dllは"C:\Program Files (x86)\Common Files\Microsoft Shared\Ink\Microsoft.Ink.dll"を使用しました。

    2021年3月1日 10:09
  • clearを押してもInkPictureの内容が削除されない

    Clear ボタンを下記のように書き換えておいてください。

    InkPicture1.Ink.DeleteStrokes()
    InkPicture1.Invalidate()
    saveはどこに保存されているのか?

    Save メソッドで永続化されたインクデータは、 Private inkData As Byte() な変数にバイナリデータとして保持されています。Load メソッドでそれを読み取ります。

    アプリケーションを再度開いた時にもインクデータを保持しておきたいのであれば、データベースや外部ファイルなどに保存してみてください。

    http://blog.wdnet.jp/tech/archives/139

    2021年3月1日 12:05
  • 魔界の仮面弁士さん

    出来ました。ありがとうございます!

    これでフォームに追加できます!

    2021年3月2日 9:26
  • お役に立てたようで何よりです。

    先に投稿したサンプルコードも修正して、Clear 時に Invalidate が呼ばれるようにしておきます。

    2021年3月2日 12:43