図―地反転図形
図―地反転図形の実験のデモンストレーションプログラムFigureGround.exeをVisual C++で作成した。プログラムファイル名FigureGround.exeをクリックしてダウンロードすれば、ダブルクリックなどによって実行することができる。ただし、.NET Framework3.5対応である。ソースプログラムなどをまとめたものは圧縮ファイルFigureGround.zipとして用意した。ダウンロードしたファイルのファイル名FigureGround.zipをマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」を選ぶと解凍することができる。解凍したファイルは、Visual C++2008などで開くことができる。
プログラムを実行すると図1のフォームが表示される。

図1
実験は「OK」ボタンのクリックで始まる。「OK」ボタンのクリックで図2のようになる。

図2
中央の扇形の組み合わされた円において、黒の部分が図になっている間はJキーを押し続け、白の部分が図になっているときはFキーを押し続ける。2分が経過すると、図3のようなフォームになる。
 
図3
時間軸を横方向にとって、黒が地に見えたとき(Jキーが押されているとき)を黒の線分で、白が地になっているとき(Fキーが押されているとき)を白の線分で表わしている。JキーもFキーも押されていないときは、黒の線分の位置と白の線分の位置の間に黄色の線分で表わされる。
プログラムでは、押されているキーのチェックをタイマーコントロールの時間間隔を
this->timer1->Interval = 500;
と設定して、0.5秒間隔で行っている。タイマーイベントに対して
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
                         if (nData
< MaxN){
                                        data[nData++]
= resp;
・・・
と、respに設定された状態を配列dataに保存している。MaxNはソースファイルcommon.cppに
const int MaxN = 240; // 2*60*2
と定義しているが、この変数はヘッダーファイルcommonn.hにおける宣言
extern const int MaxN;
によって読み込まれる。
キーの状態を表わす変数bttn_jとbttn_f、および変数respの値は、ヘッダーファイルcommon.hにおいて
        enum bttn_state { on, off };
        enum choice { black, white, non };
と宣言されている。これらの値によって、キー押しイベントおよびキーの解放イベントに対応するイベントハンドラの処理が
private: System::Void
Form1_KeyDown(System::Object^ 
sender, System::Windows::Forms::KeyEventArgs^  e) {
                         if
(bttn){
                                 switch(e->KeyData){
                                         case Keys::J
: bttn_j = on; resp = black; break;
                                         case
Keys::F : bttn_f = on; resp = white; break;
                                         default:       break;
                                 }
                         }
                 }
private: System::Void
Form1_KeyUp(System::Object^  sender,
System::Windows::Forms::KeyEventArgs^ 
e) {
                         if (bttn){
                                 switch(e->KeyData){
                                         case
Keys::J : bttn_j = off; 
                                                        if (bttn_f == on) resp = white;
                                                        else              resp = non;
                                                        break;
                                         case
Keys::F : bttn_f = off; 
                                                        if (bttn_j == on) resp = black;
                                                        else              resp = non;
                                                        break;
                                         default:       break;
                                 }
                         }
}
と行われている。これらのイベントハンドラの用意の仕方については<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>p. 235などを参照されたい。特に、キー押しイベントについては、p. 252で説明している。
2分間の実験が終了すると配列dataの値が
                 for (int i = 0; i < MaxN; i++){
                         switch
(data[i]){
                                case black :    g->DrawLine(pnBk,
int(10.0 + i * size), y0 + 5, int(10.0 + (i+1) * size), y0 + 5);
                                                                break;
                                case white :    g->DrawLine(pnWt,
int(10.0 + i *size) , y0 - 5, int(10.0 + (i+1) * size), y0 - 5);
                                                                break;
                                default :       g->DrawLine(pnYw,
int(10.0 + i *size) , y0, int(10.0 + (i+1) * size), y0);
                         }
}
と描画される。
参考文献: 大山 正(編著)「実験心理学」サイエンス社、2007.