Chapter 06. キーボードを使おう
このチュートリアルは、キーボードのコールバック関数を導入を解説します。キーボードを使って、「a」キーを押した時の処理や、 「d」キーを押した時の処理、と言った具合にキーボードを押した時の実行されるプログラムを書くことができます。
1. 準備

Chapter 06 で使用するサンプルファイルをご用意致しましたので、ダウンロードして下さい。 Excel ファイルを開きます。開く際に警告が表示された場合は、マクロを有効にする、を選択して下さい。もし、マクロを無効に してしまった場合は、Excel ファイルを一旦閉じ、もう一度開いて今度はマクロを有効にする、を選択して下さい。
2. コールバック関数の登録
キーボードのキーが押された時に実行する関数を用意します。 この関数は、関数名は任意ですが、引数は以下に載せたもので固定です。 今回は、関数名を key としました。
/** * c (unsigned char) 押されたキーボードのキー * x (int) キーを押した時のマウスの位置X座標 * y (int) キーを押した時のマウスの位置Y座標 */ void key(unsigned char c, int x, int y) { }
キーの「x」、「y」、「z」を押した時の処理は、以下のように書きます。他のキーの場合も同様です。
void key(unsigned char c, int x, int y) { if (c == 'x') { // x キーを押した時の処理 } else if (c == 'y') { // y キーを押した時の処理 } else if (c == 'z') { // z キーを押した時の処理 } }
関数を key をコールバック関数に登録します。登録するためには、SGKeyBoard() 関数の引数に関数名を指定すると思ってください。 今回、関数名は key なので以下のようにして登録します。SGKeyBoard() 関数は main() 関数の中に書きます。
SGKeyBoard(key);
では、Chapter 01で作った雛形に「2. キーボードのコールバック関数を登録しよう」で作成したコードを 追加します。
#include "sfcglx.h" void display() { BGColor(200, 200, 200); // 背景の色 SGBeginEdit(); // 形状の描画の開始. SGEndEdit(); // 形状の描画の終了. SGSwapFrames(); // フレームを入れ替える. } void key(unsigned char c, int x, int y) { if (c == 'x') { // x キーを押した時の処理 printf("x キー\n"); } else if (c == 'y') { // y キーを押した時の処理 printf("y キー\n"); } else if (c == 'z') { // z キーを押した時の処理 printf("z キー\n"); } } int main(int argc, char** argv) { SGInit(argc, argv); // SGL の初期化 // SGLX の初期化 SGLXInit("C:\Users\\Akito\\Documents\\MediaDesign3D\\6"); SGOpenWindow(0,0,500,500); // 500x500のウィンドウ SGSetDisplay(display); // 描画 SGKeyBoard(key); // キーボード SGCallBack(); // コールバック関数を登録 return 0; }
3. キーを押された時の処理
ここでは、x キーを押した時に、変数 x_value (int 型) が 1 つ増えるようにします。 同様に y キーの場合は、変数 y_value (int 型) が 1 つ増えるようにします。 z キーの場合は、変数 z_value (int 型) が 1 つ増えるようにします。 x_value、y_value、z_value を宣言・定義しましょう。それぞれ 0 で初期化します。
int x_value = 0; // x キーを押した時に、+ 1 int y_value = 0; // y キーを押した時に、+ 1 int z_value = 0; // z キーを押した時に、+ 1
では、key 関数の所定の位置に、それぞれのキーが押された時に値を + 1 するようなコードを加えます。
void key(unsigned char c, int x, int y) { if (c == 'x') { // x キーを押した時の処理 x_value++; } else if (c == 'y') { // y キーを押した時の処理 y_value++; } else if (c == 'z') { // z キーを押した時の処理 z_value++; } }
さらに、x キーを押した時に、x_value の値をセルに入力するようにします。セルへの入力は、SGLXInput() 関数を使用します。同様に、y キーを押した時に y_value を、z キーを押した時に z_value を入力するようにしてみましょう。 入力するセルの座標は任意です。ここでは、x_value の値を AC2 、y_value の値を AD2 、z_value の値を AE2 に入力します。 SGLXInput()関数、並びにChapter 04を参照して下さい。 では、SGLXInput()関数を使った、セルへの入力の部分を加えます。
void key(unsigned char c, int x, int y) { if (c == 'x') { x_value++; SGLXInput(x_value, "AC2"); // SGLXInput(x_value, Cell("AC", 2); でも OK } else if (c == 'y') { y_value++; SGLXInput(y_value, "AD2"); // SGLXInput(x_value, Cell("AD", 2); でも OK } else if (c == 'z') { z_value++; SGLXInput(z_value, "AE2"); // SGLXInput(x_value, Cell("AE", 2); でも OK } }
以下のような書き方も出来ます
void key(unsigned char c, int x, int y) { switch (c) { case 'x': SGLXInput(++x_value, "AC2"); break; case 'y': SGLXInput(++y_value, "AD2"); break; case 'z': SGLXInput(++z_value, "AE2"); break; } }
では、ここまでのソースコードを全部載せます。
// Chapter 06. キーボードを使おう #include "sfcglx.h" int x_value = 0; // x キーを押した時に、+ 1 int y_value = 0; // y キーを押した時に、+ 1 int z_value = 0; // z キーを押した時に、+ 1 void display() { BGColor(200, 200, 200); // 背景の色 SGBeginEdit(); // 形状の描画の開始. SGEndEdit(); // 形状の描画の終了. SGSwapFrames(); // フレームを入れ替える. } void key(unsigned char c, int x, int y) { if (c == 'x') { x_value++; SGLXInput(x_value, "AC2"); } else if (c == 'y') { y_value++; SGLXInput(y_value, "AD2"); } else if (c == 'z') { z_value++; SGLXInput(z_value, "AE2"); } } int main(int argc, char** argv) { SGInit(argc, argv); // SGL の初期化 // SGLX の初期化 SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\6"); SGOpenWindow(0,0,500,500); // 500x500のウィンドウ SGSetDisplay(display); // 描画 SGKeyBoard(key); // キーボード SGCallBack(); // コールバック関数を登録 return 0; }
プログラムを保存、コンパイル、実行してみてください。x キー、y キー、z キーを押してみましょう。 セルに値が入力されていくと思います。
4. グラフにしてみよう
では、AC2、AD2、AE2 の値を参照したグラフを作成してみましょう。 AC2、AD2、AE2 をマウスでドラッグします。挿入 -> グラフ から、自由にグラフを選択してください。 複数グラフを作っても構いません。私は、3Dの棒グラフを作りました。

一旦、グラフを作ったら、もう一度プログラムを保存、コンパイル、実行し、x キー、y キー、z キーを押してみましょう。 キーボードを押すたびに、棒グラフが変わっていくと思います。
Chapter 06 は以上です。お疲れ様でした。