wintab32.dllはペンタブレットのモジュール関連のdllです。
wintab32.dllそのものはどの社の製品のペンタブレットでも、
ドライバをインストールしていれば同時にインストールされていると思います。
もしくは最初からWindowsに入っている場合もあるかもしれません。
MIAさんのHSP2時代の32bit版のスクリプトを参考に、
HSP3に合わせた32bit版と、64bit版を作成してみたのですが、
32bit版は動作するのですが、64bit版では動作しませんでした。
64bit版用に自分なりに色々調整してみたのですが、うまくいきません。
64bit版の方は値の取得がうまくできていないのか、
それともGetProcAddressの設定がうまくいっていないのか、正常に動作しません。
64bit版の方はcallfunc等をhspint64のcallfunc64iで代用しているのですが、
おそらくその関係が自分の知識がないせいで、うまくいっていないのではないかと思います。
wintab32.dllの仕様は不明で、LogContext等の仕様に関わる部分は
MIAさんのスクリプトをそのまま参考にしています。
bcc55やmingのincludeにc++のwintab32.dllの.hが入っているかもと思って調べたのですが、
自分の持っているものには入っていませんでした。
ネットのどこかでwintab32.dllの仕様が公開されているのかもしれませんが、よく分かりませんでした。
なお、32bit版のこのサンプルは動作がとても重いのですが、今回はただ単に
ペンタブレットの筆圧対応を確認するだけのサンプルなのでこれで良しとしています。
簡単 Wintab モジュール (MIAさん)
http://taillove.jp/mia/plugins.html
hspint64 - github(inoviaさん)
https://github.com/inovia/HSPInt64
32bit版
;MIAさんの簡単 Wintab モジュールを引用・参考にしています ;簡単 Wintab モジュールは元々はHSP2時代のものだったので、HSP3用に調整してあります ;この掲示板のログからも引用・参考にしています ;wintab.dll そのものの仕様は不明 ;------------------------------------- ; 簡単 Wintab モジュール (C) MIA 2003 ;------------------------------------- ; TabletStat で取得できる配列の内容 ; .0 : 入力ペン番号(消しゴムだと 2 になったりする) ; .1 : ボタン情報(ペン入力を含む) ; .2 : 位置情報 X ; .3 : 位置情報 Y ; .4 : 位置情報 Z ; .5 : 筆圧 ; .6 : 筆圧2(スプレーの噴出量等) ; .7 : 回転角度(10分の1度表記、時計回りで上方向が 0) ; .8 : 倒れ角度(10分の1度表記、垂直が 900) #ifndef EzTablet #module EzTablet #uselib "kernel32.dll" #func global LoadLibrary "LoadLibraryA" str #func global GetProcAddress "GetProcAddress" int, sptr #func global FreeLibrary "FreeLibrary" int #deffunc TabletClose if hTab : dllret = callfunc(hTab,WTClose,1) : hTab = 0 return #deffunc TabletTerm onexit TabletClose : if hDLL : FreeLibrary hDLL : hDLL = 0 return #deffunc TabErr_ str m dialog m + "が見つかりません", 1 TabletTerm return #deffunc TabletInit ret = 1 if hDLL : return ret LoadLibrary "wintab32.dll" : hDLL = stat if stat = 0 : TabErr_ "wintab32" : ret = 0 fn = "WTInfoA" : GetProcAddress hDLL,fn : WTInfo = stat if stat = 0 : TabErr_ fn : ret = 0 fn = "WTOpenA" : GetProcAddress hDLL,fn : WTOpen = stat if stat = 0 : TabErr_ fn : ret = 0 fn = "WTPacketsGet" : GetProcAddress hDLL,fn : WTPacketsGet = stat if stat = 0 : TabErr_ fn : ret = 0 fn = "WTClose" : GetProcAddress hDLL,fn : WTClose = stat if stat = 0 : TabErr_ fn : ret = 0 return ret #deffunc TabletOpen int sx,int sy if hTab : TabletClose dim LogContext, 64 pLogContext = varptr(LogContext) param = 3,0,pLogContext dllret = callfunc(param,WTInfo,3) LogContext(16) = 0x3fe0,0,0,-1,-1 LogContext(27) = 0,0,0,sx,-sy,0 Name = "EzTablet/HSP" : l = strlen(Name) memcpy LogContext,Name,l+1 param = hWnd,pLogContext,1 dllret = callfunc(param,WTOpen,3) hTab = dllret return hTab #deffunc TabletStat array dest if hTab = 0 : return 0 pDest = varptr(dest) param = hTab,1,pDest dllret = callfunc(param,WTPacketsGet,3) return dllret #global #endif gosub *setup goto *main *setup w = 320;スクリーンの横幅 h = 240;スクリーンの縦幅 fpswt = 1000 / 59;フレームレート screen 0, w, h, 0 ; 初期化 TabletInit if stat=0 : dialog "TabletInit に失敗しました" : end ; 解像度設定とタブレットの使用開始 TabletOpen w, h if stat=0 : dialog "TabletOpen に失敗しました" : end dim tab, 9 return *draw_maru ; 座標の取得とマウス追尾 px = int(tab.2) : py = int(tab.3) ; ●を描画 redraw 0 prs = int(tab.5 / 32) color 0,0,0 circle px,py,px+prs,py+prs,1 redraw 1 return ;mainの繰り返し処理部分 *main ; タブレット情報の取得 TabletStat tab ; 筆圧入力がなければ描画しない if tab.5 = 0 : wait 1 : goto *main ; 描写 gosub *draw_maru wait 1 goto *main
64bit版
#include "hsp3_64.as" #include "hspint64.as" ;inoviaさん(c) /* ---------------------------------- 引用・参考 簡単 Wintab モジュール (C) MIA 2003 ---------------------------------- TabletStat で取得できる配列の内容 .0 : 入力ペン番号(消しゴムだと 2 になったりする) .1 : ボタン情報(ペン入力を含む) .2 : 位置情報 X .3 : 位置情報 Y .4 : 位置情報 Z .5 : 筆圧 .6 : 筆圧2(スプレーの噴出量等) .7 : 回転角度(10分の1度表記、時計回りで上方向が 0) .8 : 倒れ角度(10分の1度表記、垂直が 900) ------- 修正部分 ------- ・MIAさんの元々のスクリプトはHSP2時代のものなので、それをHSP3用に修正しました。 ・hspint64でcallfuncを実装しています(callfunc64i) ・wintab.dll そのものの仕様は不明 */ #ifndef EzTablet64 #module EzTablet64 #uselib "kernel32.dll" #func LoadLibrary "LoadLibraryA" str #func GetProcAddress "GetProcAddress" int, sptr #func FreeLibrary "FreeLibrary" int #deffunc TabletClose if hTab ! 0 : dllret = callfunc64i(hTab,WTClose,1) : hTab = int64(0) return #deffunc TabletTerm onexit TabletClose if hTab ! 0 { dllret = callfunc64i(hTab, varptr64(FreeLibrary),1) hTab = int64(0) } return #deffunc TabErr_ str m dialog m + "が見つかりません", 1 TabletTerm return #deffunc TabletInit ret = 1 if hDLL ! 0 : return ret dim64 hDLL dim64 WTInfo dim64 WTOpen dim64 WTPacketsGet dim64 WTClose dim64 etc, 2 dim64 etc2 dim64 hTab dim64 pDest dim64 LogContext, 64 dim64 pLogContext dim64 param dim64 dllret dim l fn = "wintab32.dll" etc2 = varptr64(fn) hDLL = callfunc64i(etc2, varptr64(LoadLibrary), 1) if hDLL = 0 : TabErr_ "wintab32" : ret = 0 fn = "WTInfoA" etc.0 = int64(hDLL) etc.1 = varptr64(fn) WTInfo = callfunc64i(etc, varptr64(GetProcAddress), 2) if WTInfo = 0 : TabErr_ fn : ret = 0 fn = "WTOpenA" etc.0 = int64(hDLL) etc.1 = varptr64(fn) WTOpen = callfunc64i(etc, varptr64(GetProcAddress), 2) if WTOpen = 0 : TabErr_ fn : ret = 0 fn = "WTPacketsGet" etc.0 = int64(hDLL) etc.1 = varptr64(fn) WTPacketsGet = callfunc64i(etc, varptr64(GetProcAddress), 2) if WTPacketsGet = 0 : TabErr_ fn : ret = 0 fn = "WTClose" etc.0 = int64(hDLL) etc.1 = varptr64(fn) WTClose = callfunc64i(etc, varptr64(GetProcAddress), 2) if WTClose = 0 : TabErr_ fn : ret = 0 if ret = 0 : dialog "TabletInit に失敗しました" : end return 1 #deffunc TabletOpen int sx,int sy if hTab ! 0 : TabletClose pLogContext = varptr64(LogContext) param = int64(3),int64(0),pLogContext dllret = callfunc64i(param,WTInfo,3) ;LogContextの仕様は不明 ;0x3fe0の部分が64bit版では違ったりするのだろうか? LogContext(16) = int64(0x3fe0),int64(0),int64(0),int64(-1),int64(-1) LogContext(27) = int64(0),int64(0),int64(0),int64(sx),int64(-sy),int64(0);直感的ではないのでsyを逆転させました Name = "EzTablet/HSP" l = strlen(Name) memcpy LogContext,Name,l+1 param = int64(hWnd),pLogContext,int64(1) dllret = callfunc64i(param,WTOpen,3) hTab = dllret if hTab = 0 : dialog "TabletOpen に失敗しました" : end return 1 #deffunc TabletStat var dest if hTab = int64(0) : return 0 pDest = varptr64(dest) param = hTab,int64(1),pDest dllret = callfunc64i(param,WTPacketsGet,3) return 1 #global #endif gosub *setup goto *main *setup w = 640;スクリーンの横幅 h = 480;スクリーンの縦幅 fpswt = 1000 / 59;フレームレート screen 0, w, h ; 初期化 TabletInit ; 解像度設定とタブレットの使用開始 TabletOpen w, h dim64 tab, 9 return *draw_maru ; 座標の取得とマウス追尾 px = int(tab.2) : py = int(tab.3) ; ●を描画 redraw 0 prs = int(tab.5 / 32) color 0,0,0 circle px,py,px+prs,py+prs,1 redraw 1 return ;mainの繰り返し処理部分 *main ; タブレット情報の取得 TabletStat tab ; 筆圧入力がなければ描画しない if tab.5 = int64(0) : wait 1 : goto *main ; 描写 gosub *draw_maru await fpswt goto *main
なお64bit版で、wintab.dllから値を取得できれば、これら以外の実装方法でも構いません。
アドバイスお願い致します。