Win32API
Win32APIはWindowsを動かすための32bitのApplication Programming Interface (API)です。
Windows上で動作するプログラムを作成するにはWin32APIを使うことが一般的です(裏で動いているため意識することはないかもしれませんが)。
Win32APIをVisucal C++でプログラムしたサンプルを以下に示します。
Hello World
あらゆるプログラム言語はHello Worldから始まるそうです。
以下のように打ち込みました。
Source1.cpp
やっていることは
- WNDCLASSの設計と登録
- windowの作成
- window messageを処理するwindow procedureの作成
です。ビルドしました。
task1.exe
Hello World!と表示されます。
画面を640x480に
ChangeDisplaySettingsという関数を使ってプログラム起動時に画面を640x480に変更します。
Source2.cpp
- windowが作成されるWM_CREATEの時にChangeDisplaySettingsを使います。
- windowが破壊されるWM_DESTROYの時に再度ChangeDisplaySettingsを使います。
ビルドしました。
task2.exe
640x480の画面になっています。
windowのタイトル・枠を消去する
全画面表示できるようにします。
するとWindowを閉じる×ボタンもなくなってしまいます。
そこでESCAPEキーを押すことでWindowを閉じることができるようにしました。
Source3.cpp
- CreateWindowのwindow sytleをPOPUP | WS_VISIBLEにするとタイトル・枠なしウインドウが作られる。
- キー入力の処理はVM_KEYDOWNで行う。
task3.exe
タイトルと枠が消えました。
背景黒に白い文字を表示
背景色を黒にして、白い文字を表示させます。
Source4.cpp
- WNDCLASSの設計時に背景色を黒に設定
- font、大きさ、表示矩形領域の指定後DrawTextで文字表示
task4.exe
文字のfont、大きさが指定できました。
プログラムの見通しがよくなるようVM_PAINTの内容をhns_DrawTextの関数にまとめています。
500ミリ秒毎表示文字の色を変える
ミリ秒レベルの制御を行うためWindowsでは御法度の無限ループを使います。
無限ループは
比治山大学現代文化学部社会臨床心理学科 吉田弘司先生のホームページ
に教えていただきました。
Source5.cpp
- 時間制御はWindowsが開始してからの時間(システム時刻)を使用
- 上記の目的のためmmsystem.hをinclude、winmm.libをlink
- 乱数を使って文字色を変えています。
- while(1)と無限ループを使用
- 最後にmessageを消去
task5.exe
RETURNキーで開始、ESCAPEキーで終了です。
先ほど作成したhnsDrawText関数の内容を変えています。
GIVEIOを使ってパラレルポートからトリガー信号出力
GIVEIO.sysを使います。Windows98/MEでは不要です。
Source6.cpp
- GIVEIOはCreateFile関数を使って開きます。不要になればCloseHandle関数で閉じます。
- 文字の描画範囲をグラフィックパスを用いて取得し、領域に変換しています。
- 文字の領域を作成したブラシを用いて描画しています。
task6.exe
壊れかけたネオンみたいになってしまいました。
背景をランダムドットで連続表示
背景を時間変化するランダムドット、文字部分を時間変化しないランダムドットにしました。
Source7.cpp
- ランダムドットのビットマップをCreateBitmap関数で作成
- メモリデバイスコンテキストの内容をランダムドットのビットマップにする
- メモリデバイスコンテキストの内容をデバイスコンテキストにブロック転送する
task7.exe
一時期はやったランダムドットのステレオ画像みたいで、すぐには何が書かれているかわかりません。
WAVファイル再生
がらっと変わってWAVファイルを再生してみます。
Source8.cpp
標準刺激standard.wav
逸脱刺激deviant.wav
- do while文使用
- 刺激提示をSleep関数と乱数で適当に振る
- 実行ファイルと同じフォルダのファイル名がstandard.wavとdeviant.wavのみ使用可能
- PlaySound()関数で再生
task8.exe
逸脱刺激後は強制的に標準刺激になるようにしています。
標準刺激:逸脱刺激は85:15です。
PlaySound関数の3番目の引数にSND_ASYNCを使うと、ズレガ生じるそうなのでトリガー出力後にWAVファイルを再生しています。