Ink Control - text recognition simple example

Started by ....IFICantBYTE, May 28, 2015, 12:05:25 AM

Previous topic - Next topic

....IFICantBYTE

Was playing around with the Microsoft Ink Control.... came up with this... maybe someone can find a use for it in one of their projects.
Have fun.

Code  winbatch Select
;Made the following to play around with the Microsoft ink control.
;It doesn't do anything very useful as is, but could be the basis for something in a touch screen environment?
;The text recognition is pretty impressive. Hope you find it helpful one day for something ....IFICantBYTE


;Refer to : https://msdn.microsoft.com/en-us/library/ms823910.aspx


#DefineSubRoutine DlgTest(Dlg_Handle, Dlg_Message, Dlg_ID, Dlg_EventInfo, Dlg_ChangeInfo)
; Dialog messages.
MSG_INIT = 0 ; The one-time initialization.
MSG_BUTTONPUSHED = 2 ; Button press.
MSG_COMEVENT = 14 ; COM control event fired.
; Options for DialogObject function.
DLGOBJECT_ADDEVENT = 1 ;DialogObject add event.
DLGOBJECT_GETOBJECT = 3 ;DialogObject get reference to object.

COM_CHANGE = 1 ; User specified identifier for "change" event.
COM_CLICK = 2 ; User specified identifier for "click" event.

Switch Dlg_Message
	Case MSG_INIT
		DialogProcOptions( Dlg_handle, MSG_BUTTONPUSHED, 1 )
		; Handle mouse click events.
		DialogObject(Dlg_Handle, "ComControl_1", DLGOBJECT_ADDEVENT, "Change", COM_CHANGE)
		DialogObject(Dlg_Handle, "ComControl_1", DLGOBJECT_ADDEVENT, "Click", COM_CLICK)
		; Get an object reference to the com control.
		objCom = DialogObject(Dlg_Handle, "ComControl_1", DLGOBJECT_GETOBJECT)
		objCom.Text = "Use the mouse or draw some text directly on a touch screen in this window, then wait a couple of seconds for text recognition."
		objcom.MousePointer=2 ; 0=default dot, 1=Arrow, 2=Cross, 3=Ibeam, 4=SizeNE-SW, 5=SizeN-S, 6=SizeNW-SE, 7=SizeW-E, 8=Up, 9=Hourglass/WaitCircle, 10=NoDrop, 11=Arrow+Hourglass/WaitCircle, 12=Arrow+?, 13=Size, 14=PointingHand, 99=CustomIcon specified by MouseIcon property
		objcom.UseMouseForInput=@True
		blue = 250
		green = 200
		red = 200
		objcom.BackColor=blue*256*256+green*256+red
		objcom.Enabled=@True
		objcom.RecognitionTimeout=2000
		objcom.InkMode=2 ;0=disabled, 1=ink collected, 2=ink and single stroke gestures
		objcom.InkInsertMode=0  ;0=text, 1=ink
		objcom.Locked=@False
		objcom.SelFontName="Times"
		objcom.SelFontSize=20
		blue = 10
		green = 10
		red = 170
		objcom.SelColor=blue*256*256+green*256+red
	Break

	Case MSG_COMEVENT
		; Correct COM control and event?
		If Dlg_ID == "ComControl_1"
			If Dlg_EventInfo.identifier == COM_CHANGE
				Message("CHANGE","changes detected to text in ink area")
			ElseIf Dlg_EventInfo.identifier == COM_CLICK
;				Message("CLICK","mouse click detected on ink area")
			EndIf
		EndIf
	Break

	Case MSG_BUTTONPUSHED
		If Dlg_ID == "PushButton_OK"
			text = objCom.Text
			Message("Plain text returned",text)
			rtftext = objCom.TextRTF
			Message("RTF text returned",rtftext)
		EndIf
		If Dlg_ID == "PushButton_Cancel"
			; Release Objects.
			Dlg_EventInfo = 0
			objCom = 0
			Return(-1)
		EndIf
	Break

EndSwitch
Return(-2)
#EndSubRoutine ; End of Dialog Callback.


MyDialogFormat=`WWWDLGED,6.2`

MyDialogCaption=`WIL Dialog 1`
MyDialogX=220
MyDialogY=072
MyDialogWidth=584
MyDialogHeight=359
MyDialogNumControls=003
MyDialogProcedure=`DlgTest`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0

MyDialog001=`171,339,036,012,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK",1,10,32,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`377,339,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`013,011,554,318,COMCONTROL,"ComControl_1",DEFAULT,"InkEd.InkEdit.1",DEFAULT,30,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
ButtonPushed=Dialog("MyDialog")
Regards,
....IFICantBYTE

Nothing sucks more than that moment during an argument when you realize you're wrong. :)

stanl


td

"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

JTaylor

Finally got a chance to take a look....Very Nice!!!   

Thanks.

Jim

stanl

Looked at the control through Tony's Type Viewer. The methods are quite limited, i.e. no save(). However, as it is a subclass of richedit maybe the WB CLR can handle it. I really have a need to use a control like that as a signature in an Excel form. Hope to find time to dig around in that area.

td

If you press the 'Get Library' button instead of the 'Get Members' button, you will see that there are a lot of interfaces available, including at least one with a 'Save' method.  It is simply a matter of connecting the interface dots.  MSFT documentation is useful for that purpose. 
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

stanl

Yeah, got that after I downloaded the 1.7 Tablet SDK just to have the toolbox controls. Using IFICB's code
I am looking at a Save Button with code to save the ink as an Image using binary buffers: But code fails at SelectAll()

Code  WINBATCH Select
binbuf = BinaryAlloc(20000)
offset=0
objCom.SelectAll()  ;error: unknown name
objCom.SelInksDisplayMode = 1
Foreach ink in objCom.SelInks
      BinaryPoke(binbuf,offset,ink)
      offset = BinaryEodGet( binbuf )
Next
BinaryWrite( binbuf,dirscript():"testink.gif"  ) ;default format



JTaylor

Was hoping to help but I can't find "SelectAll()" as an option.

Jim

....IFICantBYTE

Stan,
I don't know how to save the ink, but you might also be interested in the msinkaut.InkPicture.1 control for just ink and pictures?

Regards,
....IFICantBYTE

Nothing sucks more than that moment during an argument when you realize you're wrong. :)

stanl

Thanks IFICB - Actually I'm looking at more of a .NET C# solution. If you download the Tablet SDK 1.7 - there are some neat example programs and code.   

td

Tablet SDK 1.7 - a COM interop CLR cover for the same COM interfaces.
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade