Wacom Windows 開発者 FAQ
更新情報
バージョン | 更新日付 |
1.4 | 2013/3/18 |
INDEX
- 1 一般
- 1.1 このFAQの目的
- 1.2 このFAQの責任者
- 1.3 WACOMが製造しているタブレットモデルは何でしょうか?また、コードでサポートする場合に備え、各モデルにはどのような違いがあるでしょうか?
- 1.4 タブレットをプログラミングする際にWACOMタブレットがWintabタブレットAPIを使用する必要があるのはなぜですか?
- 1.5 Wintabを使用してWACOMタブレットをサポートするためのコードを記述するために、どのようなリソースを使用できますか?
- 1.6 旧型WACOMタブレットでは、プログラムはWintabを使用してタブレットデータを取得せず、タブレットから直接データを読み取っていました。新しいINUOSタブレットから直接データを使用できますか?または、Wintabを使用する必要がありますか?
- 1.7 WACOMのWintabがコンテキストの重複順序を管理する方法は他のWintabとどのように違うのですか?
- 1.8 WACOM WintabでサポートされていないWintab機能はありますか?
- 2 手法
- 2.1 ユーザーが現在のポインティングデバイスとしてタブレットを使用しているか、マウスを使用しているかは、どのように判別できますか?
- 2.2 特定のカーソル(エアブラシなど)からタブレットデータを取得したとき、どのようにすればそれが分かるでしょうか?
- 2.3 Wintab SDKの例は、Wintabがシステムにインストールされていない状態では実行されません。システムにタブレット(Wintab)がない場合、プログラムをどのように動作させればよいでしょうか?
- 2.4 エアブラシフィンガーホイールのデータを取得するにはどうすればよいですか?
- 2.5 2ハンド入力が可能なINTUOSタブレットのDUALTRACK機能はどのようにサポートすればよいでしょうか?
- 2.6 タブレット対応コードのパフォーマンスを改善するにはどうすればよいでしょうか?
- 2.7 トランスデューサボタンの押下はどのように検出できますか?
- 3 一般的な問題
- 3.1 4DマウスのサムホイールからゼロのZ座標を取得するだけなのはなぜですか?
- 3.2 Wintabプログラムの実行中、タブレットを使用しているときに、画面カーソルが動かないのはなぜですか?
- 3.3 タブレットからWT_PACKETメッセージの受信が急に停止する、または一部のタブレットパケットのみを受信しているように思われるのですが、なぜですか?
- 3.4 別のタブレット対応(Wintab)アプリケーションが動作している場合、アプリケーションがタブレットデータを受信しない場合があるのですが、なぜでしょう?
- 3.5 アタッチされたタブレットがWACOMタブレットかどうかを判別するにはどうすればよいでしょうか?
- 3.6 どのWACOMタブレットモデルが使用されているかを判別するにはどうすればよいでしょうか?
- 3.7 ユーザーがWACOMコントロールパネルアプレットを使用してアプリケーションまたはツールをカスタマイズする(たとえばアクティブなタブレットの一部のみ設定する)場合、カスタマイズされた設定が現在のアプリケーションに必ず影響します。これはバグか、設計上の仕様でしょうか?また、これを止めることはできますか?
- 3.8 レンズカーソルと4Dマウスは、ペン(絶対)モードではなく、相対(マウス)モードで画面ポインタを移動させています。これを変更するにはどうすればよいでしょうか?
- 3.9 論理コンテキストのLCPKTRATEフィールドにタブレットの正しいレポートレートが表示されないのはなぜですか?
- 3.10 NET INKCOLLECTORオブジェクトを使用して、タブレットからペンデータを取得するにはどうすればよいでしょうか?
- 3.11 ペンデータをLABVIEWアプリケーションにキャプチャするにはどうすればよいでしょうか?
- 3.12 WIN32関数のGETRAWINPUTDATA()がWACOMタブレットで機能しないのですが、なぜですか?
- 3.13 WEBアプリケーションタブレットデータを使用するにはどうすればよいでしょうか?
- 3.14 BAMBOOタッチデータ用のAPIはありますか?
- 3.15 Wintab .NET APIはありますか?
- 3.16 WPFアプリケーションでBAMBOOペンおよびタッチデータにアクセスするにはどうすればよいでしょうか?
- 3.17 INTUOSの高さ、方位角、および湾曲データを取得するにはどうすればよいでしょうか?
- 3.18 タブレットエリアをアプリケーションピクセルエリアにマップするにはどうすればよいでしょうか?
- 3.19 WPFのINKCANVASは(一部のTABLETPCで)マルチタッチイベントをWINDOWS 7でレポートしません。
- 3.20 WEBPLUGINがインストールされ、ブラウザで動作しているかどうかを判別するにはどうすればよいでしょうか?
- 3.21 LINUXタブレットプログラミングに関する情報はどこにありますか?
- 3.22 プラグインされているタブレットがある場合、その数を判別するにはどうすればよいでしょうか?
- 3.23 STU-300、STU-500、またはSTU-520 SIGNATURE(SIGNPAD)タブレットをプログラムするにはどうすればよいでしょうか?
- 3.25 WintabはWTX_TILTをサポートしていますか?
- 3.26 値から完全なタブレット拡張範囲を取得できないのですが、なぜですか?
- 3.27 Wintabを使用して、接続されているモデルタブレットを特定できますか?
- 3.28 タブレットがメッセージを送信しているかどうかを判別するために、どのツールを使用できますか?
- 3.29 古いWINTAB32X.LIBライブラリが見つからないのですが、なぜでしょうか?
- 3.30 アプリケーションがすべてのタブレットペンイベントに対する排他アクセスを持つようにするにはどうすればよいでしょうか?
- 3.31 WACOMタブレットの低レベルインタフェースドキュメントを入手するにはどうすればよいでしょうか?
- 3.32 Wintabデモを実行しようとすると、「COULD NOT LOAD WINTAB32.DLL」(WINTAB32.DLLを読み込めませんでした)というエラーメッセージが表示されるのですが、なぜでしょうか?
- 3.33 キーコンビネーションが、キーボードではなく、ペンまたはタブレットボタンから来たものかどうかを判別するにはどうすればよいですか?
- 3.34 PACKETEXTデータを取得するために、どのWintab関数を使用すればよいでしょうか?
- 3.35 アプリケーションはWintabを介してタブレットと画面間のユーザー設定マッピングを取得できますか?
詳細
1 一般
1.1 このFAQの目的
1.2 このFAQの責任者
1.3 Wacomが製造しているタブレットモデルは何でしょうか?また、コードでサポートする場合に備え、各モデルにはどのような違いがあるでしょうか?
1.4 タブレットをプログラミングする際にWacomタブレットがWintabタブレットAPIを使用する必要があるのはなぜですか?
残念なことに、クロスプラットフォームグラフィックタブレットAPIはありません。
Wintab仕様のコピーとWintab SDKを http://wdnet.jp/library/windows/index.html から入手できます。
1.5 Wintabを使用してWacomタブレットをサポートするためのコードを記述するために、どのようなリソースを使用できますか?
Wintab SDKの筆圧テストサンプルは、タブレットサポートをアプリケーションで有効にするためのテンプレートとして使用できます。
傾きテストサンプルプログラムは、Wacomタブレットから傾きデータを取得する方法を示します。
DuoHandサンプルプログラムは、Wacom Intuos1およびIntuos2タブレット用の2つのカーソルからデータを取得する方法を示します。ソースコードには、Wintabの使用方法に関するさまざまなコメントが記載されています。
1.6 旧型Wacomタブレットでは、プログラムはWintabを使用してタブレットデータを取得せず、タブレットから直接データを読み取っていました。新しいInuosタブレットから直接データを使用できますか?または、Wintabを使用する必要がありますか?
1.7 WacomのWintabがコンテキストの重複順序を管理する方法は他のWintabとどのように違うのですか?
他のWintabでは、重複するコンテキストがイベントを処理しない場合、イベントは基底コンテキストまで通り抜けます。Wacom Wintabでは、基底コンテキストがその上のコンテキストと同じアプリケーションで所有されている場合、イベントは次の基底コンテキストまで通り抜けます。たとえば、他のWintabでは、カーソルがコンテキストのタブレット入力領域外にある場合、コンテキストはイベントを処理しない可能性があります(re: lcInOrgおよびlcInExt。wintab.hを参照)。
他のWintabでは、アプリケーションは重複順序を自身で管理する必要があります。問題は、多くのアプリケーションが重複順序を適切に管理しないことです。そのため、2つのWintabアプリケーション(同じアプリケーションの2つのインスタンスの場合もあります)がしばしばこれらのWintabで適切に動作しません。Wacom Wintabは、前面のアプリケーションが変更されると、コンテキストの重複順序を自動的に再配置します。
1.8 Wacom WintabでサポートされていないWintab機能はありますか?
現在、Wacom WintabでサポートされていないWintab機能は次のとおりです。
- WTMgrDeviceConfig()関数
- WTMgrConfigReplace()関数
- WTMgrConfigReplaceEx()関数
- パケットフック
- WTINFO_CHANGEメッセージ
- DVC_PNPID WTInfoインデックス
- WintabX.LIBとのリンクはサポートされません。
- lcPktRateによるパケットレートの取得はサポートされていません。
ただし、アプリケーションは、正確なパケットタイムスタンプを利用し、パケットレートを判定できます。これを実行する場合、コンパイル時にPACKETDATAを定義する際、PK_TIMEビットを設定します。(PACKETDATAが定義される仕組みについては、サンプルの任意のデモを参照)。アプリケーションは、WT_PACKETメッセージハンドラにあるタイムスタンプデータを取得します。
WTX_FKEYSによる関数キーデータの取得はサポートされていません。
2 手法
2.1 ユーザーが現在のポインティングデバイスとしてタブレットを使用しているか、マウスを使用しているかは、どのように判別できますか?
タブレットカーソルがいずれかのコンテキストに近づくか離れるたびに受信するWT_PROXIMITYメッセージを処理することで、タブレットを使用しているかどうかが分かります。カーソルがコンテキストに入ると、WT_PROXIMITYメッセージのlParamパラメータの下位ワードがゼロ以外になり、カーソルがコンテキストから離れるとゼロになります。また、コンテキストのステータスが変わったために、カーソルがコンテキストに入るか、コンテキストから離れると、WT_PROXIMITYメッセージがコンテキストに送信されます。たとえば、コンテキストが開かれているときにペンがタブレットに近づくと、ペンのWT_PROXIMITYを受信します。
2.2 特定のカーソル(エアブラシなど)からタブレットデータを取得したとき、どのようにすればそれが分かるでしょうか?
通常、手順は次のとおりです。
どのカーソルが各タブレットパケットを生成したかを知る必要があるとWintabに通知します。
新しいカーソルがコンテキストに入ったときに生成されるWT_CSRCHANGEメッセージに注意します。
WT_CSRCHANGEメッセージを受信した場合、パラメータのいずれか1つは新しいカーソルのパケットのシリアル番号です。そのパケットを確認すると、新しいカーソルのカーソル番号を取得できます。
カーソル番号を使用してWTInfo()を呼び出し、新しいカーソルに関する詳細な情報を確認して、目的のカーソルかどうかを判別します。このカーソル番号が目的のカーソルを示している場合、コンテキストがWT_PROXIMITYの離脱メッセージを受信するまで、このカーソル番号を持つそのコンテキストのすべてのパケットが目的のカーソルのパケットだと分かります。
このアルゴリズムのバリエーションは、カーソルの出入りを観察するためにWT_CSRCHANGEまたはWT_PROXIMITYメッセージを使用せず、パケット内のカーソル番号を探し、カーソルがいつコンテキストを出入りしたかを確認します。
詳細な手順は次のとおりです。
- どのカーソルが各タブレットパケットを生成したかを知る必要があるとWintabに通知します。コンテキストが受信したタブレットパケットにpkCursorフィールドを追加するには、PK_CURSORをPACKETDATAシンボルに追加します。
#include < wintab.h >
#define PACKETDATA
( PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE
| PK_ORIENTATION | PK_CURSOR )
#define PACKETMODE 0
#include < pktdef.h >
さらに、WintabコンテキストのlcPktDataフィールドの値でPACKETDATAを使用します。
wWTInfoRetVal = WTInfo( WTI_DEFSYSCTX, 0, &logicalContext );
logicalContext.lcPktData = PACKETDATA;
hWintabContext = WTOpen( hWnd, &logicalContext, TRUE);
各タブレットパケットのpkCursorフィールドには、パケットを生成したカーソルのカーソルインデックスが含まれることになります。
- 新しいカーソルがコンテキストに入ったときに生成されるWT_CSRCHANGEメッセージに注意します。WT_CSRCHANGEメッセージを取得するには、論理コンテキストのlcOptionsフィールドのCXO_CSRMESSAGESビットを設定してから開く必要があります。このメッセージのwParamパラメータのパケットシリアル番号を使用し、パケットを確認して、パケットのpkCursorフィールドの値を取得します。これには、新しいパケットのカーソル番号が含まれます。
bRetVal = WTDataPeek( hWintabContext, lParam, lParam, 1, &packet,&nNumPacketsCopied );
- カーソル番号を使用してWTInfo()を呼び出し、新しいカーソルに関する詳細な情報を確認して、目的のカーソルかどうかを判別します。新しいカーソルのCSR_TYPEとCSR_PHYSIDを取得します。CSR_TYPEは、カーソルの種類(ペン、エアブラシなど)を識別するビットフィールドです。CSR_PHYSIDはカーソルのシリアル番号です。CSR_TYPEとCSR_PHYSIDは、カーソルの完全にユニークなIDで一緒に構成されるもので、Wintab.hで定義されています。CursorMaskデモのDuoHand.hファイルは、どのカーソルかを識別するビットを指定します。
#define CSR_TYPE_SPECIFIC_MASK ( ( UINT ) 0x0F06 )
#define CSR_TYPE_SPECIFIC_STYLUS_BITS ( ( UINT ) 0x0802 )
#define CSR_TYPE_SPECIFIC_AIRBRUSH_BITS ( ( UINT ) 0x0902 )
#define CSR_TYPE_SPECIFIC_4DMOUSE_BITS ( ( UINT ) 0x0004 )
#define CSR_TYPE_SPECIFIC_LENSCURSOR_BITS ( ( UINT ) 0x0006 )
同じCursorMaskデモの一部のコードが次の定義を使用します。
if ( ( pCtxInfo->wCursorType & CSR_TYPE_SPECIFIC_MASK ) ==
CSR_TYPE_SPECIFIC_4DMOUSE_BITS ) { ...}
wWTInfoRetVal = WTInfo( WTI_CURSORS + packet.pkCursor, CSR_TYPE, wCsrType );
wWTInfoRetVal = WTInfo( WTI_CURSORS + packet.pkCursor, CSR_PHYSID, wCsrPhysId );
// CSR_TYPE_SPECIFIC_MASK (0x0F06)は特定のカーソルタイプを検索するために使用されるビットマスクです。
if ( ( wCsrType & CSR_TYPE_SPECIFIC_MASK ) == CSR_TYPE_SPECIFIC_AIRBRUSH_BITS)
{
// カーソルはエアブラシ
}
このFAQのどの説明にも適用されることですが、この例はシステムの最初のタブレットを前提にしたものです。
2.3 Wintab SDKの例は、Wintabがシステムにインストールされていない状態では実行されません。システムにタブレット(Wintab)がない場合、プログラムをどのように動作させればよいでしょうか?
http://wdnet.jp/library/windows のデモサンプルでは、Wintab関数に明示的にリンクするように記述されています。(Wintab32.libファイルを介した静的リンクで)暗黙的にWintabにリンクする場合、Windowsはプログラムの実行時にWintab関数への参照を解決します。Wintab32.dllがシステムにない場合、OSは参照を解決できず、アプリケーションをロードしません。
この問題を解決するには、独自のコードでWintab32.dllに明示的にリンクする必要があります(Wintab32.dllはどのWacomタブレットドライバでもインストールされています)。DLLに明示的にリンクする方法については、MSDNに記載されています。「明示的なリンク」というタイトルを検索してください。
デモサンプルのUtils.cファイルとUtils.hファイルを調べるという方法もあります。
次に、WTInfo()に明示的にリンクする方法を示します
- WTInfoの関数ポインタを定義します。
typedef UINT ( API * WTINFO ) ( UINT, UINT, LPVOID );
- LoadLibraryを呼び出してWintab32.dllをロードします。
ghWintab = LoadLibrary( "Wintab32.dll" );
if ( !ghWintab )
{
return FALSE;
}
- WTInfo()のアドレスを探します。文字列を返すWintab関数には、ASCIIバージョンとUNICODEバージョンがあります。ここで必要なのはASCIIバージョンです。
WTINFO pWTInfo;
pWTInfo = ( WTINFO ) GetProcAddress( ghWintab, "WTInfoA" );
if ( !pWTInfo )
{
return FALSE;
}
これで、WTInfoを呼び出す関数ポインタを使用できます。
wWTInfoRetVal = pWTInfo( WTI_INTERFACE, IFC_SPECVERSION, &wSpecVersion );
- プログラムが終了したら、Wintab32.dllをアンロードします。
if ( ghWintab )
{
FreeLibrary( ghWintab );
}
2.4 エアブラシのホイールデータを取得するにはどうすればよいですか?
エアブラシのホイールデータは接線の筆圧として返されます。データは、タブレットデータパケットのpkTangentPressureフィールドで返されます。データ項目のいずれか1つとしてPK_TANGENTPRESSUREをPACKETDATA定義に追加することで、接線の筆圧をパケットに追加するようにWintabに指示することもできます。接線の筆圧で返される値の範囲はWTInfo( WTI_DEVICES, DVC_TPRESSURE, &axis );を呼び出すと取得できます。
2.5 両手入力が可能なIntuosタブレットのDualTrack機能はどのようにサポートすればよいでしょうか?
両手入力をサポートする1つの方法は、Wintab CSRMASK拡張と2つのWintabコンテキストを使用することです。その際、コンテキストの一方はシステムポインタを動かし、もう一方は動かしません。CursorMaskExの例については、 http://wdnet.jp/library/windows を参照してください。この例では、これらのWintab機能を使用して両手入力をサポートする方法について説明しています。
UDII 12×12、Intuos、Intuos 2の各タブレットのみDualTrackがサポートされているので注意してください。Intuos 3以降、Cintiq、BambooラインはいずれもDualTrackをサポートしていません。
2.6 タブレット対応コードのパフォーマンスを改善するにはどうすればよいでしょうか?
Wintab関数呼び出しは手間がかかります。アプリケーションのパフォーマンスを改善するには、Wintabの呼び出し回数、特にパケット関数(WTPacket()やWTPacketsGet()など)の数を最小限に抑えます。最善の方法は、WTPacketsGet()を使用して、コンテキストのキューが保持できるパケットの最大数を取得することです。WTPacketsGet()の戻り値は、返されたパケットの数です。WTQueueSizeGet()を呼び出してキューのサイズを確認することもできます。WTQueuePacketsEx()を呼び出して、キュー内で待機しているパケットの数を確認する作業は手間がかかるので、必要ありません。
Wintab関数を呼び出す場合は、タスクスイッチがあります。WndProcは、タブレットの処理を多く行った場合は、簡単に再入可能になります。コードの再入可能性についてテストを実施し、再入可能性の影響を受けるグローバルまたは共有リソースへのアクセスを同期することもできます。
2.7 トランスデューサボタンの押下はどのように検出できますか?
CadTestデモでは、PACKET::pkButtonsメンバーを使用してボタンの押下を検出する方法を例示しています。WT_PACKETメッセージを受信すると、次のようにボタンの押下の有無を確認できます。
case WT_PACKET:
if (gpWTPacket((HCTX)lParam, wParam, &pkt))
{
if (HIWORD(pkt.pkButtons)==TBN_DOWN)
{
// ...
}
// ...
}
break;
パケット情報のボタンデータを取得するには、PACKETDATAの定義でボタンデータを有効にする必要があります。次に例を示します。
#define PACKETDATA PK_X | PK_Y | PK_BUTTONS
#define PACKETMODE PK_BUTTONS
3 一般的な問題
3.1 4DマウスのサムホイールからゼロのZ座標を取得するだけなのはなぜですか?
4Dマウスのサムホイールには複数の機能があります。ユーザーは、Wacom IntuosコントロールパネルアプレットのThumbWheelタブでサムホイールの機能を設定します。サムホイールのデフォルト機能はインテリマウスエミュレーションです。サムホイールからZ座標を受信するには、サムホイールタブにアクセスし、機能を「Application Defined」(アプリケーション定義)に設定する必要があります。プログラムから機能を変更する方法はありません。
3.2 Wintabプログラムの実行中、タブレットを使用しているときに、画面カーソルが動かないのはなぜですか?
論理コンテキストのlcOptionsフィールドのCXO_SYSTEMビットは、コンテキストがタブレットデータを受信したときにWintabがシステムポインタ(画面カーソル)を動かすかどうかを制御します。 このビットが設定されていない場合、アプリケーションがアクティブになっていてもシステムカーソルは動きません。WTInfo( WTI_DEFCONTEXT, … )を使用して独自のコンテキストを作成するためのコンテキスト情報を取得した場合、CXO_SYSTEMは、WTOpen()を呼び出す前に設定した場合を除き、未設定です。
LOGCONTEXT wintabLogicalContext;
wWTInfoRetVal = WTInfo( WTI_DEFSYSCTX, 0, &wintabLogicalContext );
wintabLogicalContext.lcOptions |= CXO_SYSTEM;
hWintabContext = WTOpen( hWnd, &wintabLogicalContext, TRUE );
WTInfo( WTI_DEFSYSCTX,…)を使用して独自のコンテキストを作成するためのコンテキスト情報を取得した場合、CXO_SYSTEMが設定され、アプリケーションがアクティブなときにカーソルが動きます。
3.3 タブレットからWT_PACKETメッセージの受信が急に停止する、または一部のタブレットパケットのみを受信しているように思われるのですが、なぜですか?
おそらく、コンテキストのパケットキューがオーバーフローしたために、タブレットパケットが紛失しています。各Wintabコンテキストには、タブレットパケットのキューがあります。Wintabは、キューがいっぱいでない限り、新しいパケットをキューに追加し、WT_PACKETメッセージをアプリケーションに送信するだけです。キューがいっぱいになると、Wintabはパケットを破棄し、コンテキストがタブレットパケットを受信したというWT_PACKETメッセージをアプリケーションに送信しなくなります。Intuosタブレットは1秒に100~200パケットを送信するので、デフォルトキューサイズの8パケットではすぐにオーバーフローします。
キューのオーバーフローを防ぐには、WTQueueSizeSet()関数でコンテキストのキューのサイズを増やし、32~128に設定します。パケットキュー用のメモリは限られたリソースなので、WTQueueSizeSet()の呼び出しが成功したことを必ず確認してください。WTQueueSizeSet()が失敗した場合は、現在よりも小さいキューサイズを要求してください。
また、キューのオーバーフローを防ぐために、WT_PACKETメッセージを受信したらキューからパケットを必ず削除し、WT_PROXIMITYメッセージを受信したらキューをフラッシュするという方法もあります。キューをフラッシュするには、次の呼び出しを実行します。
WTPacketsGet( hWintabContext, VALUE_LARGER_THAN_YOUR_QUEUE_SIZE, NULL);
または
WTPacket( hWintabContext, wPacketSerialNumber, NULL ) ;
3.4 別のタブレット対応(Wintab)アプリケーションが動作している場合、アプリケーションがタブレットデータを受信しない場合があるのですが、なぜでしょう?
アプリケーションがタブレットデータを受信しないのは、そのデータがWintabコンテキストの重複順序の一番上にないためです。Wintabコンテキストは1つ1つ積み重ねられます。通常、重複順序の一番上のコンテキストのみがタブレットデータを受信します。
アクティブになったアプリケーションは、WTOverlap( hWintabContext, TRUE )を呼び出して重複順序の一番上にコンテキストを移動します。非アクティブになったアプリケーションは、WTOverlap( hWintabContext, FALSE)を呼び出して、重複順序の一番下にコンテキストを移動します。CursorMaskサンプルは、WM_ACTIVATEメッセージの結果としてコンテキストの重複順序を適切に処理する方法を示しています。
Wintab仕様のWacom実装は、いくつかの点で違います。最も大きな違いは、アプリケーションによって作成されたコンテキストをWacomが処理する方法にあります。Wintab仕様では、アプリケーションはコンテキストのZ順序を手動で処理する必要があります。つまり、アプリケーションコンテキストが作成されると、他のすべてのコンテキストの一番上に置かれ、コンテキストが破棄されるか、新しいコンテキストが作成されるか、WTOverlap関数が呼び出されてコンテキストが一番下に移動しない限りそこに残ります。つまり、アプリケーションは、最小化されたときにリストの一番下にコンテキストを移動し、元の大きさに戻ったときにコンテキストを一番上に戻す必要があります。Wacom Wintabドライバの開発中に、多くのアプリケーションがコンテキストを正しく管理していないことが判明しました。Wacomは、アプリケーション用にコンテキスト順序を管理することにしました。
Wacomの自動処理として、アプリケーションがフォーカスを失ったときにスタックの一番下にコンテキストを移動し、フォーカスを取得したときにコンテキストを一番上に移動します。これにより、複数のWintabアプリケーションが1つのシステムで同時にアクティブになっている場合に関するさまざまな問題を解決できます。副作用として、現在のアプリケーションにシステムフォーカスがないために2番目のアプリケーション用にタブレットデータを収集するアプリケーションを作成している場合、アプリケーションはタブレットデータの取得に失敗します。
3.5 接続されたタブレットがWacomタブレットかどうかを判別するにはどうすればよいでしょうか?
接続されたタブレットがWacomタブレットかどうかを判別する方法は現在ありません。他のタブレットメーカーも、WTInfo( WTI_DEVICES, DVC_NAME, …)を呼び出すと、自社のタブレットを「Wacom」とレポートする場合があります。
ただし、WTInfo()関数を使用すると、タブレットでサポートされているデータ項目とその範囲を特定できます。
3.6 どのWacomタブレットモデルが使用されているかを判別するにはどうすればよいでしょうか?
どのタブレットモデルがコンピュータに接続されているかを判別する方法は現在ありません。ただし、WTInfo()関数を使用すると、タブレットでサポートされているデータ項目とその範囲を特定できます。
3.7 ユーザがWacomコントロールパネルアプレットを使用してアプリケーションまたはツールをカスタマイズする(たとえばアクティブなタブレットの一部のみ設定する)場合、カスタマイズされた設定が現在のアプリケーションに必ず影響します。これはバグか、設計上の仕様でしょうか?また、これを止めることはできますか?
これは設計上の仕様です。Intuosを設計する上で目標としたことの1つが、ユーザに最大限の柔軟性を提供し、タブレットの動作を制御できるようにすることでした。この制御の一部は、アプリケーションとカーソル(ツール)固有の設定です。もちろん、ユーザがアプリケーションやツールの設定をカスタマイズできることと、アプリケーションがベンダーの意図どおりに動作するようにアプリケーションコードを設定する必要があることは違います。
グラフィックタブレットアプリケーションは通常、2つのカテゴリーに分かれます。要求する物理座標空間にマップされるタブレット座標を必要とするアプリケーションと、そうした座標を必要としないアプリケーションです。CADアプリケーション、数値化アプリケーション、テンプレートユーティリティなどは前者で、ペインティングおよび描画プログラムなどは後者です。後者のカテゴリーに属するアプリケーションは、前者のカテゴリーに属するものよりもたくさんあります。
ほとんどの場合、Wacom Wintabでは、ユーザのカスタム設定がWintab APIによるアプリケーションの設定よりも優先されます。ただし、2番目のカテゴリーに属するCADなどのアプリケーションを適合させるために、アプリケーションが次の特性のいずれかでWintabコンテキストを開く場合、Wacom Wintabは、ユーザのカスタム設定よりもアプリケーションのWintabコンテキスト設定を優先させます。
コンテキストに、lcLocksで設定されたビットがある。
アプリケーションがタブレット入力の原点(lcInOrgX、lcInOrgY、またはlcInOrgZ)を変更している。
アプリケーションがタブレット入力サイズ(範囲)(lcInExtX、lcInExtY、またはlcInExtZ)を変更している。
アプリケーションが画面の原点(lcSysOrgXまたはlcSysOrgY)を変更している。
アプリケーションが画面の出力サイズ(範囲)(lcSysOrgXまたはlcSysOrgY)を変更している。
アプリケーションが相対モードで動くように画面カーソルを設定(lcSysModeをゼロ以外の値に設定)している。
3.8 レンズカーソルと4Dマウスは、ペン(絶対)モードではなく、相対(マウス)モードで画面ポインタを移動させています。これを変更するにはどうすればよいでしょうか?
この質問はFAQ 3.7のバリエーションです。回答については、そのFAQを参照してください。
3.9 論理コンテキストのlcPktRateフィールドにタブレットの正しいレポートレートが表示されないのはなぜですか?
lcPktRateフィールドは、旧Wacomタブレットに同梱のWacom Wintab以外では機能しません。Wacom Wintabも、現在、lcPktRateをサポートしていません。どちらのWintabでも、lcPktRateは100としてレポートされますが、タブレットは、どのモードでタブレットが設定されていても、可能な限り最も高いレートでデータを送信します。
3.10 .NET InkCollectorオブジェクトを使用して、タブレットからペンデータを取得するにはどうすればよいでしょうか?
VistaまたはWindows 7用にプログラミングを行なっている場合、InkCollector(Windows XPでは使用不可)の使用方法を示すサンプルがいくつかあります。msdn.microsoft.comで.NETドキュメントを参照するほか、TabletPCインクサンプルを次のWebページで参照できます。
http://msdn.microsoft.com/en-us/magazine/cc164069.aspx (筆圧のサンプルも含まれます)
http://www.code-magazine.com/article.aspx?quickid=0512032&page=3
3.11 ペンデータをLabViewアプリケーションにキャプチャするにはどうすればよいでしょうか?
LabViewはDLLに統合できるので、Wintab API(Wintab32.dllでサポートされています)を使用して、タブレットペンデータ(位置と筆圧)を提供できます。LabViewとDLLを統合する方法について説明した本があります(『LabView advanced programming techniques』Rick Bitter、Taqi Mohiuddin、Matt Nawrockiの共著)。
.NET InkCollector APIを使用してペンデータをキャプチャすることもできます。
3.12 Win32関数のGetRawInputData()がWacomタブレットで機能しないのですが、なぜですか?
タブレットドライバのカスタムペンデータコレクションを読み取ることができないので、この関数は無効です。
3.13 Webアプリケーションタブレットデータを使用するにはどうすればよいでしょうか?
Wacom webpluginを使用すると、ペンの位置、筆圧、回転、向き、傾きデータを抽出できます。Wacom webpluginは、タブレットドライバソフトウェアのインストール時にユーザのシステム(WindowsまたはMac)にインストールされます。このプラグインを使用するサンプルWebページが http://wdnet.jp/library/web/index.html にあります。
3.14 Bambooタッチデータ用のAPIはありますか?
現在、タッチデータ用のAPIはありません。これは検討中の事項です。今後の対応状況については、開発者サポートページ( http://wdnet.jp/ )を参照してください。
3.15 Wintab .NET APIはありますか?
Wintab用の.NET APIがあります。次のページには、このAPIのドキュメントとサンプルコードが含まれています。
http://www.wacomeng.com/windows/code/WintabDN.zip
3.16 WPFアプリケーションでBambooペンおよびタッチデータにアクセスするにはどうすればよいでしょうか?
WPF InkCanvasオブジェクトを使用すると、ペンデータをキャプチャできます。サンプルアプリケーションが http://www.codeproject.com/KB/WPF/Ink1.aspxにあります。ペンデータをキャプチャするには、まずこのページを参照してください。タッチデータの場合、InkCanvasはBambooタッチデータを認識しません。
3.17 Intuosの傾き角、方位角、および回転データを取得するにはどうすればよいでしょうか?
標準的なグリップペンでは、傾き角と方位角が提供されます。弊社の開発者サイトにある傾きテストデモでは、この方法についてサンプルが表示されます。同じアプリケーションでアートペンを使用すると、さらに回転データを取得可能です。
3.18 タブレットエリアをアプリケーションピクセルエリアにマップするにはどうすればよいでしょうか?
次に、タブレットをピクセルにマップする方法を示します(MfcDemo Wintabアプリケーションからの抜粋)。
下記は、重要と思われるいくつかのコードスニペットで構成されています。基本的には、より高い解像度のタブレット座標を用いたピクセル間の補間を行なっています。
CMFC_DEMOView::OnCreate
{
// デフォルトコンテキスト情報を取得
// データパケットにデフォルトのデジタルコンテキストを使用してから
// gpWTOpenAを呼び出すこと。
gpWTInfoA( WTI_DEFCONTEXT, 0, &lc );
...
gpWTOpenA( ...);
...
}
CMFC_DEMOView::OnWTPacket
{
...
POINT csr;
...
// パケットを読み取ってタブレット座標を取得。
PACKET pkt;
gpWTPacket( (HCTX)hCtx, wSerial, &pkt );
...
// ウィンドウサイズを取得してピクセル範囲を特定。
RECT window_rect;
GetWindowRect( &window_rect );
POINT size;
size.x = window_rect.right - window_rect.left;
size.y = window_rect.bottom - window_rect.top;
...
// タブレット位置データを使用して、ピクセル空間内のポイントを計算
csr.x = (size.x * pkt.pkX) / lc.lcInExtX;
csr.y = size.y - (size.y * pkt.pkY) / lc.lcInExtY;
...
}
3.19 WPFのInkCanvasは(一部のTabletPCで)マルチタッチイベントをWindows 7でレポートしません。
これは、WacomタッチドライバがデバイスID文字列記述子をサポートしていないためです。Microsoftが修正版を提供しています( http://support.microsoft.com/kb/2328751を参照してください)。
これは、.NET 4.0以降にのみ適用されます。次に、修正版をダウンロードできるリンクを示します。
http://code.msdn.microsoft.com/KB2328751/Release/ProjectReleases.aspx?ReleaseId=5030
3.20 webpluginがインストールされ、ブラウザで動作しているかどうかを判別するにはどうすればよいでしょうか?
webpluginが動作するには、最新のタブレットドライバ(ConsumerまたはProfessional)をインストールする必要があります。これにより、Webpluginがタブレットドライバと通信するために必要なWintabサポートファイルに加え、必要なwebpluginインストーラがインストールされます。ドライバをインストールしたら、http://wdnet.jp/ でwebpluginのデモのいずれか1つを開き、機能を試します(たとえば、走り書きデモなど)。
Firefoxでは、URLフィールドに「about:plugins」と入力すると、プラグインがインストールされたかどうかを確認できます。「Wacom Dynamic Link Library」のエントリを確認してください。これはChromeでも有効です。
Internet Explorerでは、[ツール | アドオンの管理]を選択し、ドロップダウンから[現在読み込まれているアドオン | すべてのアドオン]を選択します。「WacomTablet Class」のエントリを確認してください。
3.21 Linuxタブレットプログラミングに関する情報はどこにありますか?
http://www.wacomeng.com/linux/index.htmlにアクセスしてください。ここで、Linux WacomプロジェクトおよびOpenSolarisサポートに関する情報が見つかります。
3.22 接続されているタブレットがある場合、その数を判別するにはどうすればよいでしょうか?
WTInfo(WTI_INTERFACE, IFC_NDEVICES, &numDevices)を実行すると、接続されているタブレットの数またはゼロが返されます。
3.23 STU-300、STU-500、またはSTU-520 液晶サインタブレットをプログラムするにはどうすればよいでしょうか?
STU-300、STU-500、STU-520 用のSDK(C++、C#、Java)およびインターフェース仕様書を使用してプログラムします。次のホームページからお問い合わせください。
http://tablet.wacom.co.jp/business/contact/index.html
3.24 Wintab用のMATLABサポートはありますか?
いいえ。現在、統合されたMATLABサポートはありません。このサポートは作成されているので、利用可能です(『PENTOOLS – A MATLAB Toolkit for On-Line Pen-based Data Experimentation』R. M. Guest著 –
http://www.cvc.uab.es/icdar2009/papers/3725b221.pdfを参照)。
3.25 WintabはWTX_TILTをサポートしていますか?
いいえ。Wintabの弊社の実装はWTX_TILT拡張をサポートしていません。ただし、標準グリップペンから傾き角と方位角データを利用できるので、それを基に傾きを計算できます(傾きテストデモを参照)。
3.26 値から完全なタブレット拡張範囲を取得できないのですが、なぜですか?
タブレットは、描画領域の周囲に余白(無効エリア)があり、この余白ではペンは反応しません。
3.27 Wintabを使用して、接続されているタブレットのモデルを特定できますか?
Wintabでは、(WTInfoを介して)問い合わせ機能を利用できます。これは、接続されているタブレットの機能です。
3.28 タブレットがメッセージを送信しているかどうかを判別するために、どのツールを使用できますか?
WinDDKのhclientツールを使用すると、タブレットがペンメッセージを送信しているかどうかを判別できます。このツールは、Wintabに依存せず、タブレットのHID記述子に接続するので、HIDカーネルスタックから送信されたタブレットデータを監視できます。その際、必要な作業は、hclientが列挙したHIDデバイスのリストからデバイスを選択することだけです(WacomのVendor IDは0x56aです)。Usage Page = 0xD、Usage = 0x1であることを確認してください。ダイアログの下部にある[Blocked Read Data]ボタンをクリックし、データダイアログが表示されたら[Continuous Asynchronous Read]ボタンをクリックします。ペンでタブレットに触れて、データを確認してください。
3.29 古いWintab32x.libライブラリが見つからないのですが、なぜでしょうか?
この旧型ライブラリは、静的リンクを必要とします。そのため、プログラムは、新しいバージョンのWintab32を含むシステムで実行された場合、中断する可能性があります。したがって、クライアントアプリケーション内でWintab32.dllを動的にロードすることを強く推奨します。それでも旧型ライブラリが必要な場合は、使用できます。
3.30 アプリケーションがすべてのタブレットペンイベントに対する排他アクセスを持つようにするにはどうすればよいでしょうか?
アプリケーションを強制的に前面(フォアグラウンド)に持ってくる必要があります。
3.31 Wacomタブレットのインターフェース仕様書を入手するにはどうすればよいでしょうか?
Wintabはタブレットペンデータの取得をサポートしているため(または、VistaシステムとWindows 7システムで.NET InkCollectorを使用できます)提供していません。
3.32 Wintabデモを実行しようとすると、「Could not load wintab32.dll」(wintab32.dllを読み込めませんでした)というエラーメッセージが表示されるのですが、なぜでしょうか?
これは通常、アプリケーションがWTInfo()から情報を取得できなかったことを示します。次のいずれかの理由によるものです。
- タブレットドライバがインストールされていないか、インストールが中断された。ドライバを再インストールしてください。
- タブレットドライバがWintabを介して通信していない。システムを再起動してください。
3.33 キーコンビネーションが、キーボードではなく、ペンまたはタブレットボタンから来たものかどうかを判別するにはどうすればよいですか?
タブレットドライバソフトウェアは、キーボードのキーコンビネーションをキーボードから送信された場合と可能な限り同じようにエミュレートします。キーコンビネーションがペンまたはタブレットから来たものかどうかを判別するには、アプリケーションで検出し、除去できる一部の追加文字を含むキーコンビネーションを送信するようにタブレットを設定します。たとえば、「Ctrl + Z」のコンビネーションの場合、「Ctrl + Z + t」を送信し、アプリケーションに「t」を除去させるようにタブレットを設定します。「t」が存在しない場合、キーボードから来たものと分かります。
3.34 PACKETEXTデータを取得するために、どのWintab関数を使用すればよいでしょうか?
アプリケーションがPACKETEXTデータを取得するように設定した場合は、 WTPacket()を使用し、WT_PACKETEXTメッセージに応答してデータを問合せします。
3.35 アプリケーションはWintabを介してタブレットと画面間のユーザ設定マッピングを取得できますか?
取得できません。Wintabはそのマッピングを隠すためにさまざまなことを実行しています。それにより、アプリケーションのコンテキストの外で設定されたユーザ設定用に、タブレットと画面間のマッピングを処理しなくても済みます。Wintabでは、アプリケーションは、タブレットと画面間のマッピングを任意のタイミングで設定できます。この設定内容は、ユーザ設定よりも優先されます。
どのカーソルが各タブレットパケットを生成したかを知る必要があるとWintabに通知します。
新しいカーソルがコンテキストに入ったときに生成されるWT_CSRCHANGEメッセージに注意します。
WT_CSRCHANGEメッセージを受信した場合、パラメータのいずれか1つは新しいカーソルのパケットのシリアル番号です。そのパケットを確認すると、新しいカーソルのカーソル番号を取得できます。
カーソル番号を使用してWTInfo()を呼び出し、新しいカーソルに関する詳細な情報を確認して、目的のカーソルかどうかを判別します。このカーソル番号が目的のカーソルを示している場合、コンテキストがWT_PROXIMITYの離脱メッセージを受信するまで、このカーソル番号を持つそのコンテキストのすべてのパケットが目的のカーソルのパケットだと分かります。
このアルゴリズムのバリエーションは、カーソルの出入りを観察するためにWT_CSRCHANGEまたはWT_PROXIMITYメッセージを使用せず、パケット内のカーソル番号を探し、カーソルがいつコンテキストを出入りしたかを確認します。
詳細な手順は次のとおりです。
- どのカーソルが各タブレットパケットを生成したかを知る必要があるとWintabに通知します。コンテキストが受信したタブレットパケットにpkCursorフィールドを追加するには、PK_CURSORをPACKETDATAシンボルに追加します。
#include < wintab.h > #define PACKETDATA ( PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_CURSOR ) #define PACKETMODE 0 #include < pktdef.h >
さらに、WintabコンテキストのlcPktDataフィールドの値でPACKETDATAを使用します。
wWTInfoRetVal = WTInfo( WTI_DEFSYSCTX, 0, &logicalContext ); logicalContext.lcPktData = PACKETDATA; hWintabContext = WTOpen( hWnd, &logicalContext, TRUE);
各タブレットパケットのpkCursorフィールドには、パケットを生成したカーソルのカーソルインデックスが含まれることになります。
- 新しいカーソルがコンテキストに入ったときに生成されるWT_CSRCHANGEメッセージに注意します。WT_CSRCHANGEメッセージを取得するには、論理コンテキストのlcOptionsフィールドのCXO_CSRMESSAGESビットを設定してから開く必要があります。このメッセージのwParamパラメータのパケットシリアル番号を使用し、パケットを確認して、パケットのpkCursorフィールドの値を取得します。これには、新しいパケットのカーソル番号が含まれます。
bRetVal = WTDataPeek( hWintabContext, lParam, lParam, 1, &packet,&nNumPacketsCopied );
- カーソル番号を使用してWTInfo()を呼び出し、新しいカーソルに関する詳細な情報を確認して、目的のカーソルかどうかを判別します。新しいカーソルのCSR_TYPEとCSR_PHYSIDを取得します。CSR_TYPEは、カーソルの種類(ペン、エアブラシなど)を識別するビットフィールドです。CSR_PHYSIDはカーソルのシリアル番号です。CSR_TYPEとCSR_PHYSIDは、カーソルの完全にユニークなIDで一緒に構成されるもので、Wintab.hで定義されています。CursorMaskデモのDuoHand.hファイルは、どのカーソルかを識別するビットを指定します。
#define CSR_TYPE_SPECIFIC_MASK ( ( UINT ) 0x0F06 ) #define CSR_TYPE_SPECIFIC_STYLUS_BITS ( ( UINT ) 0x0802 ) #define CSR_TYPE_SPECIFIC_AIRBRUSH_BITS ( ( UINT ) 0x0902 ) #define CSR_TYPE_SPECIFIC_4DMOUSE_BITS ( ( UINT ) 0x0004 ) #define CSR_TYPE_SPECIFIC_LENSCURSOR_BITS ( ( UINT ) 0x0006 )
同じCursorMaskデモの一部のコードが次の定義を使用します。
if ( ( pCtxInfo->wCursorType & CSR_TYPE_SPECIFIC_MASK ) == CSR_TYPE_SPECIFIC_4DMOUSE_BITS ) { ...} wWTInfoRetVal = WTInfo( WTI_CURSORS + packet.pkCursor, CSR_TYPE, wCsrType ); wWTInfoRetVal = WTInfo( WTI_CURSORS + packet.pkCursor, CSR_PHYSID, wCsrPhysId ); // CSR_TYPE_SPECIFIC_MASK (0x0F06)は特定のカーソルタイプを検索するために使用されるビットマスクです。 if ( ( wCsrType & CSR_TYPE_SPECIFIC_MASK ) == CSR_TYPE_SPECIFIC_AIRBRUSH_BITS) { // カーソルはエアブラシ }
このFAQのどの説明にも適用されることですが、この例はシステムの最初のタブレットを前提にしたものです。
この問題を解決するには、独自のコードでWintab32.dllに明示的にリンクする必要があります(Wintab32.dllはどのWacomタブレットドライバでもインストールされています)。DLLに明示的にリンクする方法については、MSDNに記載されています。「明示的なリンク」というタイトルを検索してください。
デモサンプルのUtils.cファイルとUtils.hファイルを調べるという方法もあります。
次に、WTInfo()に明示的にリンクする方法を示します
- WTInfoの関数ポインタを定義します。
typedef UINT ( API * WTINFO ) ( UINT, UINT, LPVOID );
- LoadLibraryを呼び出してWintab32.dllをロードします。
ghWintab = LoadLibrary( "Wintab32.dll" ); if ( !ghWintab ) { return FALSE; }
- WTInfo()のアドレスを探します。文字列を返すWintab関数には、ASCIIバージョンとUNICODEバージョンがあります。ここで必要なのはASCIIバージョンです。
WTINFO pWTInfo; pWTInfo = ( WTINFO ) GetProcAddress( ghWintab, "WTInfoA" ); if ( !pWTInfo ) { return FALSE; }
これで、WTInfoを呼び出す関数ポインタを使用できます。
wWTInfoRetVal = pWTInfo( WTI_INTERFACE, IFC_SPECVERSION, &wSpecVersion );
- プログラムが終了したら、Wintab32.dllをアンロードします。
if ( ghWintab ) { FreeLibrary( ghWintab ); }
UDII 12×12、Intuos、Intuos 2の各タブレットのみDualTrackがサポートされているので注意してください。Intuos 3以降、Cintiq、BambooラインはいずれもDualTrackをサポートしていません。
Wintab関数を呼び出す場合は、タスクスイッチがあります。WndProcは、タブレットの処理を多く行った場合は、簡単に再入可能になります。コードの再入可能性についてテストを実施し、再入可能性の影響を受けるグローバルまたは共有リソースへのアクセスを同期することもできます。
case WT_PACKET: if (gpWTPacket((HCTX)lParam, wParam, &pkt)) { if (HIWORD(pkt.pkButtons)==TBN_DOWN) { // ... } // ... } break;
パケット情報のボタンデータを取得するには、PACKETDATAの定義でボタンデータを有効にする必要があります。次に例を示します。
#define PACKETDATA PK_X | PK_Y | PK_BUTTONS #define PACKETMODE PK_BUTTONS
3.1 4DマウスのサムホイールからゼロのZ座標を取得するだけなのはなぜですか?
3.2 Wintabプログラムの実行中、タブレットを使用しているときに、画面カーソルが動かないのはなぜですか?
LOGCONTEXT wintabLogicalContext; wWTInfoRetVal = WTInfo( WTI_DEFSYSCTX, 0, &wintabLogicalContext ); wintabLogicalContext.lcOptions |= CXO_SYSTEM; hWintabContext = WTOpen( hWnd, &wintabLogicalContext, TRUE );
WTInfo( WTI_DEFSYSCTX,…)を使用して独自のコンテキストを作成するためのコンテキスト情報を取得した場合、CXO_SYSTEMが設定され、アプリケーションがアクティブなときにカーソルが動きます。
3.3 タブレットからWT_PACKETメッセージの受信が急に停止する、または一部のタブレットパケットのみを受信しているように思われるのですが、なぜですか?
キューのオーバーフローを防ぐには、WTQueueSizeSet()関数でコンテキストのキューのサイズを増やし、32~128に設定します。パケットキュー用のメモリは限られたリソースなので、WTQueueSizeSet()の呼び出しが成功したことを必ず確認してください。WTQueueSizeSet()が失敗した場合は、現在よりも小さいキューサイズを要求してください。
また、キューのオーバーフローを防ぐために、WT_PACKETメッセージを受信したらキューからパケットを必ず削除し、WT_PROXIMITYメッセージを受信したらキューをフラッシュするという方法もあります。キューをフラッシュするには、次の呼び出しを実行します。
WTPacketsGet( hWintabContext, VALUE_LARGER_THAN_YOUR_QUEUE_SIZE, NULL);
または
WTPacket( hWintabContext, wPacketSerialNumber, NULL ) ;
3.4 別のタブレット対応(Wintab)アプリケーションが動作している場合、アプリケーションがタブレットデータを受信しない場合があるのですが、なぜでしょう?
アクティブになったアプリケーションは、WTOverlap( hWintabContext, TRUE )を呼び出して重複順序の一番上にコンテキストを移動します。非アクティブになったアプリケーションは、WTOverlap( hWintabContext, FALSE)を呼び出して、重複順序の一番下にコンテキストを移動します。CursorMaskサンプルは、WM_ACTIVATEメッセージの結果としてコンテキストの重複順序を適切に処理する方法を示しています。
Wintab仕様のWacom実装は、いくつかの点で違います。最も大きな違いは、アプリケーションによって作成されたコンテキストをWacomが処理する方法にあります。Wintab仕様では、アプリケーションはコンテキストのZ順序を手動で処理する必要があります。つまり、アプリケーションコンテキストが作成されると、他のすべてのコンテキストの一番上に置かれ、コンテキストが破棄されるか、新しいコンテキストが作成されるか、WTOverlap関数が呼び出されてコンテキストが一番下に移動しない限りそこに残ります。つまり、アプリケーションは、最小化されたときにリストの一番下にコンテキストを移動し、元の大きさに戻ったときにコンテキストを一番上に戻す必要があります。Wacom Wintabドライバの開発中に、多くのアプリケーションがコンテキストを正しく管理していないことが判明しました。Wacomは、アプリケーション用にコンテキスト順序を管理することにしました。
Wacomの自動処理として、アプリケーションがフォーカスを失ったときにスタックの一番下にコンテキストを移動し、フォーカスを取得したときにコンテキストを一番上に移動します。これにより、複数のWintabアプリケーションが1つのシステムで同時にアクティブになっている場合に関するさまざまな問題を解決できます。副作用として、現在のアプリケーションにシステムフォーカスがないために2番目のアプリケーション用にタブレットデータを収集するアプリケーションを作成している場合、アプリケーションはタブレットデータの取得に失敗します。
3.5 接続されたタブレットがWacomタブレットかどうかを判別するにはどうすればよいでしょうか?
ただし、WTInfo()関数を使用すると、タブレットでサポートされているデータ項目とその範囲を特定できます。
3.6 どのWacomタブレットモデルが使用されているかを判別するにはどうすればよいでしょうか?
3.7 ユーザがWacomコントロールパネルアプレットを使用してアプリケーションまたはツールをカスタマイズする(たとえばアクティブなタブレットの一部のみ設定する)場合、カスタマイズされた設定が現在のアプリケーションに必ず影響します。これはバグか、設計上の仕様でしょうか?また、これを止めることはできますか?
グラフィックタブレットアプリケーションは通常、2つのカテゴリーに分かれます。要求する物理座標空間にマップされるタブレット座標を必要とするアプリケーションと、そうした座標を必要としないアプリケーションです。CADアプリケーション、数値化アプリケーション、テンプレートユーティリティなどは前者で、ペインティングおよび描画プログラムなどは後者です。後者のカテゴリーに属するアプリケーションは、前者のカテゴリーに属するものよりもたくさんあります。
ほとんどの場合、Wacom Wintabでは、ユーザのカスタム設定がWintab APIによるアプリケーションの設定よりも優先されます。ただし、2番目のカテゴリーに属するCADなどのアプリケーションを適合させるために、アプリケーションが次の特性のいずれかでWintabコンテキストを開く場合、Wacom Wintabは、ユーザのカスタム設定よりもアプリケーションのWintabコンテキスト設定を優先させます。
コンテキストに、lcLocksで設定されたビットがある。
アプリケーションがタブレット入力の原点(lcInOrgX、lcInOrgY、またはlcInOrgZ)を変更している。
アプリケーションがタブレット入力サイズ(範囲)(lcInExtX、lcInExtY、またはlcInExtZ)を変更している。
アプリケーションが画面の原点(lcSysOrgXまたはlcSysOrgY)を変更している。
アプリケーションが画面の出力サイズ(範囲)(lcSysOrgXまたはlcSysOrgY)を変更している。
アプリケーションが相対モードで動くように画面カーソルを設定(lcSysModeをゼロ以外の値に設定)している。
3.8 レンズカーソルと4Dマウスは、ペン(絶対)モードではなく、相対(マウス)モードで画面ポインタを移動させています。これを変更するにはどうすればよいでしょうか?
3.9 論理コンテキストのlcPktRateフィールドにタブレットの正しいレポートレートが表示されないのはなぜですか?
3.10 .NET InkCollectorオブジェクトを使用して、タブレットからペンデータを取得するにはどうすればよいでしょうか?
http://msdn.microsoft.com/en-us/magazine/cc164069.aspx (筆圧のサンプルも含まれます)
http://www.code-magazine.com/article.aspx?quickid=0512032&page=3
3.11 ペンデータをLabViewアプリケーションにキャプチャするにはどうすればよいでしょうか?
.NET InkCollector APIを使用してペンデータをキャプチャすることもできます。
3.12 Win32関数のGetRawInputData()がWacomタブレットで機能しないのですが、なぜですか?
3.13 Webアプリケーションタブレットデータを使用するにはどうすればよいでしょうか?
3.14 Bambooタッチデータ用のAPIはありますか?
3.15 Wintab .NET APIはありますか?
http://www.wacomeng.com/windows/code/WintabDN.zip
3.16 WPFアプリケーションでBambooペンおよびタッチデータにアクセスするにはどうすればよいでしょうか?
3.17 Intuosの傾き角、方位角、および回転データを取得するにはどうすればよいでしょうか?
3.18 タブレットエリアをアプリケーションピクセルエリアにマップするにはどうすればよいでしょうか?
下記は、重要と思われるいくつかのコードスニペットで構成されています。基本的には、より高い解像度のタブレット座標を用いたピクセル間の補間を行なっています。
CMFC_DEMOView::OnCreate { // デフォルトコンテキスト情報を取得 // データパケットにデフォルトのデジタルコンテキストを使用してから // gpWTOpenAを呼び出すこと。 gpWTInfoA( WTI_DEFCONTEXT, 0, &lc ); ... gpWTOpenA( ...); ... } CMFC_DEMOView::OnWTPacket { ... POINT csr; ... // パケットを読み取ってタブレット座標を取得。 PACKET pkt; gpWTPacket( (HCTX)hCtx, wSerial, &pkt ); ... // ウィンドウサイズを取得してピクセル範囲を特定。 RECT window_rect; GetWindowRect( &window_rect ); POINT size; size.x = window_rect.right - window_rect.left; size.y = window_rect.bottom - window_rect.top; ... // タブレット位置データを使用して、ピクセル空間内のポイントを計算 csr.x = (size.x * pkt.pkX) / lc.lcInExtX; csr.y = size.y - (size.y * pkt.pkY) / lc.lcInExtY; ... }
3.19 WPFのInkCanvasは(一部のTabletPCで)マルチタッチイベントをWindows 7でレポートしません。
これは、.NET 4.0以降にのみ適用されます。次に、修正版をダウンロードできるリンクを示します。
http://code.msdn.microsoft.com/KB2328751/Release/ProjectReleases.aspx?ReleaseId=5030
3.20 webpluginがインストールされ、ブラウザで動作しているかどうかを判別するにはどうすればよいでしょうか?
Firefoxでは、URLフィールドに「about:plugins」と入力すると、プラグインがインストールされたかどうかを確認できます。「Wacom Dynamic Link Library」のエントリを確認してください。これはChromeでも有効です。
Internet Explorerでは、[ツール | アドオンの管理]を選択し、ドロップダウンから[現在読み込まれているアドオン | すべてのアドオン]を選択します。「WacomTablet Class」のエントリを確認してください。
3.21 Linuxタブレットプログラミングに関する情報はどこにありますか?
3.22 接続されているタブレットがある場合、その数を判別するにはどうすればよいでしょうか?
3.23 STU-300、STU-500、またはSTU-520 液晶サインタブレットをプログラムするにはどうすればよいでしょうか?
http://tablet.wacom.co.jp/business/contact/index.html
3.24 Wintab用のMATLABサポートはありますか?
http://www.cvc.uab.es/icdar2009/papers/3725b221.pdfを参照)。
3.25 WintabはWTX_TILTをサポートしていますか?
3.26 値から完全なタブレット拡張範囲を取得できないのですが、なぜですか?
3.27 Wintabを使用して、接続されているタブレットのモデルを特定できますか?
3.28 タブレットがメッセージを送信しているかどうかを判別するために、どのツールを使用できますか?
3.29 古いWintab32x.libライブラリが見つからないのですが、なぜでしょうか?
3.30 アプリケーションがすべてのタブレットペンイベントに対する排他アクセスを持つようにするにはどうすればよいでしょうか?
3.31 Wacomタブレットのインターフェース仕様書を入手するにはどうすればよいでしょうか?
3.32 Wintabデモを実行しようとすると、「Could not load wintab32.dll」(wintab32.dllを読み込めませんでした)というエラーメッセージが表示されるのですが、なぜでしょうか?
- タブレットドライバがインストールされていないか、インストールが中断された。ドライバを再インストールしてください。
- タブレットドライバがWintabを介して通信していない。システムを再起動してください。
3.33 キーコンビネーションが、キーボードではなく、ペンまたはタブレットボタンから来たものかどうかを判別するにはどうすればよいですか?
3.34 PACKETEXTデータを取得するために、どのWintab関数を使用すればよいでしょうか?
3.35 アプリケーションはWintabを介してタブレットと画面間のユーザ設定マッピングを取得できますか?