Grafiktablet/Stift Input über Wintab API
Verfasst: 12.06.2008 22:17
Inspiriert von diesem Thread von LCD, habe ich nun einmal probiert
mein eigenes Grafiktablet über das Wintab Interface auszulesen.
Sollte im Prinzip mit allen Geräten funktionieren die Wintab benutzen.
Ich konnte es allerdings nur mit meinem 'Trust Wireless Scroll Tablet 1200-V2' testen.
Im SDK bei Wacom findet man alle Infos (Beispiele, Doku). Das hier ist nur schnell
zusammengehackt zum testen und auslesen der Koordinaten X/Y/Z und der Druck-
werte der Stiftspitze.
Das Gerät/Tablet muß angeschlossen und funktionsfähig sein, sonst gibt
WTInfo() 0 zurück, da kein benutzbares Gerät gefunden.
Ich würde mich freuen zu erfahren ob es mit Euren Tablets/Pens auch geht.
mein eigenes Grafiktablet über das Wintab Interface auszulesen.
Sollte im Prinzip mit allen Geräten funktionieren die Wintab benutzen.
Ich konnte es allerdings nur mit meinem 'Trust Wireless Scroll Tablet 1200-V2' testen.
Im SDK bei Wacom findet man alle Infos (Beispiele, Doku). Das hier ist nur schnell
zusammengehackt zum testen und auslesen der Koordinaten X/Y/Z und der Druck-
werte der Stiftspitze.
Code: Alles auswählen
;
; pen/tablet input test for wacom tablets and compatible devices
; using WINTAB32.dll
;
; by Danilo, 2008/06/12
;
; Wacom SDK: http://www.wacomeng.com/devsupport/ibmpc/downloads.html
;
Structure LOGCONTEXTA
lcName.b[40];
lcOptions.l;
lcStatus.l;
lcLocks.l;
lcMsgBase.l;
lcDevice.l;
lcPktRate.l;
lcPktData.l;
lcPktMode.l;
lcMoveMask.l;
lcBtnDnMask.l;
lcBtnUpMask.l;
lcInOrgX.l;
lcInOrgY.l;
lcInOrgZ.l;
lcInExtX.l;
lcInExtY.l;
lcInExtZ.l;
lcOutOrgX.l;
lcOutOrgY.l;
lcOutOrgZ.l;
lcOutExtX.l;
lcOutExtY.l;
lcOutExtZ.l;
lcSensX.l;
lcSensY.l;
lcSensZ.l;
lcSysMode.l;
lcSysOrgX.l;
lcSysOrgY.l;
lcSysExtX.l;
lcSysExtY.l;
lcSysSensX.l;
lcSysSensY.l;
EndStructure
Structure PACKET
pkButtons.l
pkX.l
pkY.l
pkZ.l
pkNormalPressure.l
pkTangentPressure.l
EndStructure
#WTI_DEFCTX = 3
#WTI_DEFSYSCTX = 4
#CTX_NAME = 1
#CTX_OPTIONS = 2
#CTX_STATUS = 3
#CTX_LOCKS = 4
#CTX_MSGBASE = 5
#CTX_DEVICE = 6
#CTX_PKTRATE = 7
#CTX_PKTDATA = 8
#CTX_PKTMODE = 9
#CTX_MOVEMASK = 10
#CTX_BTNDNMASK = 11
#CTX_BTNUPMASK = 12
#CTX_INORGX = 13
#CTX_INORGY = 14
#CTX_INORGZ = 15
#CTX_INEXTX = 16
#CTX_INEXTY = 17
#CTX_INEXTZ = 18
#CTX_OUTORGX = 19
#CTX_OUTORGY = 20
#CTX_OUTORGZ = 21
#CTX_OUTEXTX = 22
#CTX_OUTEXTY = 23
#CTX_OUTEXTZ = 24
#CTX_SENSX = 25
#CTX_SENSY = 26
#CTX_SENSZ = 27
#CTX_SYSMODE = 28
#CTX_SYSORGX = 29
#CTX_SYSORGY = 30
#CTX_SYSEXTX = 31
#CTX_SYSEXTY = 32
#CTX_SYSSENSX = 33
#CTX_SYSSENSY = 34
#CTX_MAX = 34
#CXO_MESSAGES = 4
#WT_DEFBASE = $7FF0
#WT_PACKET = #WT_DEFBASE + 0
#WT_INFOCHANGE = #WT_DEFBASE + 6
#PK_BUTTONS = $0040 ;/* button information */
#PK_X = $0080 ;/* x axis */
#PK_Y = $0100 ;/* y axis */
#PK_Z = $0200 ;/* z axis */
#PK_NORMAL_PRESSURE = $0400 ;/* normal Or tip pressure */
#PK_TANGENT_PRESSURE = $0800 ;/* tangential Or barrel pressure */
; ---------------------------------------
; ---------------------------------------
; ---------------------------------------
Prototype.l WTInfo_(wCategory, nIndex, *lpOutput)
Prototype.l WTOpen_(hWnd, *lpLogCtx, fEnable)
Prototype.l WTPacket_(hCtx, wSerial, *lpPkt)
Prototype.l WTClose_(hCtx)
If OpenLibrary(0, "Wintab32.dll")
WTInfo.WTInfo_ = GetFunction(0, "WTInfoA")
WTOpen.WTOpen_ = GetFunction(0, "WTOpenA")
WTPacket.WTPacket_ = GetFunction(0,"WTPacket")
WTClose.WTClose_ = GetFunction(0,"WTClose")
If WTInfo(0, 0, 0)
OpenWindow(0,0,0,800,600,"tablet",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
info.LOGCONTEXTA
WTInfo(#WTI_DEFCTX,0,@info)
#PACKETDATA = #PK_X | #PK_Y | #PK_Z | #PK_BUTTONS | #PK_NORMAL_PRESSURE | #PK_TANGENT_PRESSURE
;#PACKETMODE = #PK_BUTTONS | #PK_NORMAL_PRESSURE | #PK_TANGENT_PRESSURE
#PACKETMODE = 0
info\lcOptions = #CXO_MESSAGES
info\lcMsgBase = #WT_DEFBASE
info\lcPktData = #PACKETDATA
info\lcPktMode = #PACKETMODE
info\lcMoveMask = #PACKETDATA
info\lcBtnUpMask = info\lcBtnDnMask
info\lcOutOrgX = 0
info\lcOutOrgY = 0
info\lcOutExtX = 10000
info\lcOutExtY = 10000
hCtx = WTOpen(WindowID(0),@info,1)
TextGadget(0,0,0,WindowWidth(0),25,Name$)
SetGadgetText(0,PeekS(@info\lcName))
For i = 1 To 6
TextGadget(i,5,20+i*30,145,25,"------------------")
Next i
w = WindowWidth(0)-150
h = WindowHeight(0)-25
ImageGadget(10,150,25,w,h,CreateImage(0,w,h))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #WM_MOUSEMOVE
Case #WT_PACKET
WTPacket(EventlParam(),EventwParam(), @pkt.PACKET)
;If pkt\pkButtons
SetGadgetText(1,"pkButtons: " + RSet(Hex(pkt\pkButtons),8,"0") )
;EndIf
SetGadgetText(2,"pkX: " + Str(pkt\pkX ))
SetGadgetText(3,"pkY: " + Str(pkt\pkY ))
SetGadgetText(4,"pkZ: " + Str(pkt\pkZ ))
SetGadgetText(5,"pkNormalPressure: " + Str(pkt\pkNormalPressure ))
SetGadgetText(6,"pkTangentPressure: " + Str(pkt\pkTangentPressure ))
If StartDrawing(ImageOutput(0))
If pkt\pkNormalPressure
size = pkt\pkNormalPressure / 30
size + 2
Else
size = 2
EndIf
Circle( MulDiv_(pkt\pkX,ImageWidth(0),10000), ImageHeight(0)-MulDiv_(pkt\pkY,ImageHeight(0),10000), size,RGB($FF,$FF,$00))
StopDrawing()
SetGadgetState(10,ImageID(0))
EndIf
;Case #WT_INFOCHANGE
EndSelect
ForEver
WTClose(hCtx)
Else
MessageRequester("ERROR","WTInfo = 0! Tablet ready?")
EndIf
CloseLibrary(0)
Else
MessageRequester("ERROR","Cant open WINTAB32.dll! Tablet ready?")
EndIf
WTInfo() 0 zurück, da kein benutzbares Gerät gefunden.
Ich würde mich freuen zu erfahren ob es mit Euren Tablets/Pens auch geht.