投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/4/2 13:36:09
ジェスチャーを受け入れる場合は、CollectionMode プロパティを変更する必要があります。
(このプロパティの初期値は ICM_InkOnly なので、そのままだとジェスチャーを受け取れません)


> inkpicture1.setgesturestatus( IAG_AllGestures,true)でエラーが出ます。

それは VBA の文法構文になっていないので、コンパイルエラーになるでしょう。


> これは右辺で、左辺が必要なのでしょうか?

いいえ。COM 版 InkPicture の SetGestureStatus メソッドは
Function プロシージャーではなく、Sub プロシージャーなメソッドです。

たとえば IAG_Circle を指定する場合、VBA から呼び出す場合の構文は
Private Sub CommandButton1_Click()
    InkPicture1.SetGestureStatus IAG_Circle, True
End Sub

もしくは
Private Sub CommandButton1_Click()
    Call InkPicture1.SetGestureStatus(IAG_Circle, True)
End Sub

と書きます。


VBA においてメソッドを呼び出す場合、それが Sub である場合は
  foo.Method0
  foo.Method1 arg1
  foo.Method2 arg1, arg2
  foo.Method3 arg1, arg2, arg3
もしくは、Call ステートメントを併用して
  Call foo.Method0
  Call foo.Method1(arg1)
  Call foo.Method2(arg1, arg2)
  Call foo.Method3(arg1, arg2, arg3)
とします。

Function メソッドの場合は上記に加えて
  Let x = foo.Method0
  Let x = foo.Method1(arg1)
  Let x = foo.Method2(arg1, arg2)
  Let x = foo.Method3(arg1, arg2, arg3)
もしくは
  Set x = foo.Method0
  Set x = foo.Method1(arg1)
  Set x = foo.Method2(arg1, arg2)
  Set x = foo.Method3(arg1, arg2, arg3)
の構文を利用できます。
戻り値がオブジェクト型の場合は Set を使い、それ以外の場合は Let を使います。

ただし Let を使うことは稀です。Let は省略可能であるため、
非オブジェクト型の場合は一般的に
  x = foo.Method2(arg1, arg2)
と書きます。



> getgesturestatusの使い方もわかりません。

特定のジェスチャーが対象になっているかどうかを返すだけなので、
たとえば『If InkPicture1.GetGestureStatus(IAG_Circle) Then』で良いですよ。
ジェスチャーを対象にするのは SetGestureStatus です。

なお、すべてのジェスチャーを意味する IAG_AllGestures フラグは
SetGestureStatus はできますが、
GetGestureStatus はできません。個々のジェスチャーに対して判定してください。


> gestureのイベントもわからないですし、
ジェスチャーが認識されると、Gesture イベントが発生します。

Private Sub InkPicture1_Gesture(ByVal Cursor As MSINKAUTLib.IInkCursor, ByVal Strokes As MSINKAUTLib.IInkStrokes, ByVal Gestures As Variant, Cancel As Boolean)
    Debug.Print Gestures(0).ID, MSINKAUTLib.InkApplicationGesture.IAG_NoGesture
    If Gestures(0).ID <> MSINKAUTLib.InkApplicationGesture.IAG_NoGesture Then
        Dim newGuid As String
        newGuid = 識別用に生成したGuid値
        Strokes(0).ExtendedProperties.Add newGuid, Gestures(0).ID
        Cancel = True
    End If
End Sub



ここで使用する Guid は自己管理してください。
なお従来は、Guid を生成するために
    With CreateObject("Scriptlet.TypeLib")
        newID = Left(.Guid, 38)
    End With
というコードを使えたのですが、この方法は、
2018/07/31 更新の CVE-2017-8570 によって、VBA からは使えなくなりました。
https://docs.microsoft.com/ja-jp/archive/blogs/office_client_development_support_blog/201707secupdate-cannot-create-object

そのため現状の VBA では、OLE32.DLL の CoCreateGuid API を Declare して生成する必要があります。

Private Declare PtrSafe Function CoCreateGuid Lib "ole32.dll" (ByRef pGuid As Currency) As LongPtr
Private Declare PtrSafe Function StringFromGUID2 Lib "ole32.dll" (ByRef pGuid As Currency, ByVal lpStrGuid As LongPtr, ByVal cbMax As LongAs LongPtr
Public Function CreateGuid() As String
    Dim id(1) As Currency
    CreateGuid = "{00000000-0000-0000-0000-000000000000}"
    If CoCreateGuid(id(0)) = 0 Then
        Dim s As String
        s = String(39, 0)
        If StringFromGUID2(id(0), StrPtr(s), 39) <> 0 Then
            CreateGuid = Split(s, vbNullChar, 2)(0)
        End If
    End If
End Function