
Wintabを学ぶ(Delphiに実装編)
あっちゃー.ネタは作っていたが更新するの忘れてたー!!
typedef struct tagPACKET{
HCTX pkContext;
UINT pkStatus;
LONG pkTime;
WTPKT pkChanged;
UINT pkSerialNumber;
UINT pkCursor;
DWORD pkButtons;
DWORD pkX;
DWORD pkY;
DWORD pkZ;
UINT pkNormalPressure;
UINT pkTangentPressure;
ORIENTATION pkOrientation;
ROTATION pkRotation;
}PACKET;
const PACKETDATA = PK_X or PK_Y or PK_NORMAL_PRESSURE ; type TPacket = record pkX, pkY : integer ; pkNormalPressure : UINT ; end;ここで,PACKETDATAという定数は後で使用しますが,TPacketで取得したいデータのフラグを組み合わせて宣言しておきます.
function WTInfo( wCategory, nIndex : DWORD ; var lpOutput ) : DWORD ;
stdcall ; external 'WINTAB32.DLL' name 'WTInfoA' ;
function WTOpen( handle : HWND ; var LOGCONTEXT ; AutoInitialize : BOOL ) : THCTX ;
stdcall ; external 'WINTAB32.DLL' name 'WTOpenA' ;
function WTClose( Context : THandle ) : LongBool ;
stdcall ; external 'WINTAB32.DLL' ;
function WTQueueSizeSet( FContext : THCTX ; nPkts : Integer ) : LongBool ;
stdcall ; external 'WINTAB32.DLL' ;
function WTOverlap( Context:THCTX ; fToTop:LongBool ) : LongBool ;
stdcall ; external 'WINTAB32.DLL' ;
function WTPacketsGet( Context:THCTX ; MacPackets:Integer ; PacketBuf:Pointer ) : Integer ;
stdcall ; external 'WINTAB32.DLL' ;
{ Private 宣言 }
FContext : THctx ;
FPacketBuf : array [0..PACKETNUM-1] of TPacket ;
{
フォーム作成時
このときタブレットの初期化する
}
procedure TForm1.FormCreate(Sender: TObject);
var
lc : TLogContext ;
begin
// デフォルトシステムコンテキストを得る
WTInfo( WTI_DEFSYSCTX, 0, lc ) ;
// 各パラメタを変更する
lc.lcPktData := PACKETDATA ;
lc.lcPktMode := 0 ;
lc.lcMoveMask := PACKETDATA ;
lc.lcBtnUpMask := lc.lcBtnDnMask ;
lc.lcOutOrgX := 0 ;
lc.lcOutExtX := GetSystemMetrics( SM_CXSCREEN ) ;
lc.lcOutOrgY := 0 ;
lc.lcOutExtY := -GetSystemMetrics( SM_CYSCREEN ) ;
// コンテキストオープン
FContext := WTOpen( handle, lc, true ) ;
// コンテキストのキューのサイズを指定する
WTQueueSizeSet( FContext, 32 ) ;
end;
{
フォーム破棄(アプリケーション終了)時
コンテキストを閉じておく
}
procedure TForm1.FormDestroy(Sender: TObject);
begin
WTClose( FContext );
end;
{
キューのチェック
キューに格納されているパケットを取り出して,
パラメタをフォームに表示する.
}
procedure TForm1.CheckQueue();
var
packet_num, i : Integer ;
begin
WTOverlap( FContext, true );
// 格納されているパケットを全て取り出す!
packet_num := WTPacketsGet( FContext, PACKETNUM, @FPacketBuf );
if ( packet_num > 0 ) then begin
for i:=0 to packet_num -1 do begin
// FPacketBuf[i].pkX; X座標を得る
// FPacketBuf[i].pkY; Y座標を得る
// FPacketBuf[i].pkNormalPressure; Z圧力を得る
end;
end;
end;