タブレットとスタイラスペンを使うと、パソコンに手書きの線を入力できます。筆圧を入力することができるので毛筆のような表現も可能です。ペンの傾きを入力できる機種もあり、アイデア次第で面白いことに使えそうです。
私は昔(94年頃)、WACOMのタブレットを用いたプログラム開発をしたことがあります。当初A3版ほどの大きさのUDというタブレットを使っていて、その後 ArtPad という小さいサイズのものに移行しました。いずれもシリアルポートに接続するようになっていました。当時はWACOMコマンドという簡単な制御用コマンドを直接シリアルポートに書き込み、タブレットからの応答をシリアルポートから読み取って解析するというプログラムを書いていました。OSはMS-DOSでWACOMから出ているパケットの資料に基づきデータを取得してました。Windows 3.1/95に移行してからも、Windows APIでシリアルポートを読み書きしてました。
余談ですが、その後、お子様向けのタブレットであるWACOMプレピオを入手しました。ArtPadと比べて1万円ほど安く、PS2ポートから電源を取るのでACアダプタ不要というのが魅力でした(その分、データの分解能は低く抑えられています)。KidPicsというお絵かきソフトまでバンドルされてました。最近のFAVOなどはもちろんUSB接続で、AC電源も不要です。
現在ではシリアルポート、USBの接続方式の違いはドライバが吸収してくれて、WinTabというAPIセットを利用してペンデータを取得できます。WinTab APIを利用するためのSDKが、WinTabの開発元であるLCS/Telegraphicsから提供されていますので、タブレット対応アプリケーションを作成することができます。
SDKの入手
LCS/TelegraphicsのサイトからWinTabのSDKを入手します。ダウンロードページは、
http://www.pointing.com/FTP.HTM
です。WTKIT126.ZIP が、SDKのバイナリです。ヘッダファイルやLIBファイル、サンプルファイルがアーカイブされています。サンプルをビルドするのが面倒な場合は、コンパイル済みのファイルが WT32X126.ZIP で用意されています。他にWord形式のドキュメント(英文)もあります。WinTab APIを提供するWinTab.dllはタブレットドライバをインストールすると自動的にインストールされます。WinTabを利用するVisual C++ プロジェクトの設定方法
WTK126.ZIPを適当なディレクトリに展開します。サンプルプログラム、ヘッダファイル、ライブラリファイルのディレクトリができます。Visual Studio のオプション設定でincludeパスとlibパスを指定します。図は E:/wacom というディレクトリにWTK126.ZIPを展開した場合の例です。
サンプルプログラムのディレクトリに必ず含まれている Pktdef.h もincludeディレクトリにコピーしておくと便利です
![]() |
![]() |
includeパス設定 | libパス設定 |
リンクファイル指定
WinTab対応MFCアプリケーションを作ってみる
SDKに含まれるサンプルプログラムはすべてC言語でWindowsのメッセージを処理するコールバックルーチンで書かれています。サンプルのPrsTestあたりを参考にWinTab対応MFCアプリケーションを作ってみます。まず、AppWizardでDocument-Viewサポート付のMFCアプリケーションを生成します(別にDocument-Viewでなくてもいいのですが、Documentにペンデータを格納するようにすればお絵かきソフトなどが作れそうです)。CView派生クラスのヘッダファイルの先頭に以下のようにmsgpack.h wintab.h pktdef.hをインクルードし、3つのdefine文を記述します。
#include <msgpack.h> #include <wintab.h> #define PACKETDATA (PK_CURSOR | PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION) #define PACKETMODE PK_BUTTONS #define NPACKETQSIZE 32 #include <pktdef.h> |
○WTメッセージによるデータ取得
タブレットドライバからのデータは独自のWindowメッセージであるWT_PACKETメッセージとして受け取ることができます。WT_PACKETを受け取るには、メッセージを受信したいWindowのハンドルをWTOpen というWinTab API関数に渡す必要があります。CView派生クラスで処理したい場合は、CViewのパブリックメンバ変数 m_hWndを使用すればOKです。WTOpenではLOGCONTEXT構造体に値を設定してモードや解像度の設定を行います。WTInfo API 関数を用いてLOGCONTEXTのデフォルト値を取得し、必要な項目だけを設定するようなコーディングをします。次のような初期化用ヘルパー関数を用意し、タブレット受信の開始イベントハンドラで呼ぶようにします。WTOpenはHTCX構造体を返します。このヘルパー関数ではWTOpenの返り値をそのままreturnしています。
HCTX TestView::TabletInit() { LOGCONTEXT lcMine; /* WTInfoを使用してデフォルト設定値を取得 */ WTInfo(WTI_DEFCONTEXT, 0, &lcMine); /* 必要な項目を設定 */ wsprintf(lcMine.lcName, "WinTab test %x", AfxGetApp()->m_hInstance); lcMine.lcOptions |= CXO_MESSAGES; // WTメッセージが渡されるようにする lcMine.lcPktData = PACKETDATA; lcMine.lcPktMode = PACKETM |