を使います。hConsoleOutputは前章でやったBOOL SetConsoleCursorPosition( HANDLE hConsoleOutput, COORD dwCursorPosition // カーソル位置 );
GetStdHandle(STD_OUTPUT_HANDLE);
で取得します。 次にCOORDは次のように定義された構造体です。
この構造体もtypedefされているのでCOORDをデータ型として 扱うことができます。typedef struct _COORD { SHORT X; SHORT Y; } COORD
では、カーソル位置指定を利用して最も簡単なデジタル時計を 作ってみましょう。
main関数だけを見るとずいぶん簡単です。// con02.c #include <windows.h> #include <stdio.h> #include <conio.h> int Locate(HANDLE, int, int); int TxtPrint(HANDLE, char *); int main() { HANDLE hStdout; SYSTEMTIME st; char str[32]; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); while(!_kbhit()) { Locate(hStdout, 10, 10); GetLocalTime(&st); wsprintf(str, "現在%2d時%2d分%2d秒です", st.wHour, st.wMinute, st.wSecond); TxtPrint(hStdout, str); Sleep(500); } return 0; } int Locate(HANDLE hOut, int x, int y) { COORD dwPos; dwPos.X = (SHORT)x; dwPos.Y = (SHORT)y; if (SetConsoleCursorPosition(hOut, dwPos) == 0) return -1; else return 0; } int TxtPrint(HANDLE hOut, char *str) { BOOL bResult; DWORD dwResult; bResult = WriteConsole(hOut, (CONST VOID *)str, (DWORD)lstrlen(str), &dwResult, NULL); if (bResult == 0) return -1; else return 0; }
Locate(hStdout, X, Y);でカーソル位置を指定できるように 自作関数を作ってみました。
また、TxtPrint関数も作ってみました。これは、WriteConsole関数を 簡単に使えるようにした自作関数です。
こんな感じでコンソールに書き込みますがprintfが使えるので わざわざ使う必要はないかもしれません。また、scanfみたいな 働きをするReadConsoleという関数もありますので暇な人は ヘルプをみて研究してみてください。BOOL WriteConsole( HANDLE hConsoleOutput, // スクリーンバッファへのハンドル CONST VOID *lpBuffer, // 書き込む文字列 DWORD nNumberOfCharsToWrite, // 書き込む文字列のバイト数 LPDWORD lpNumberOfCharsWritten, // 書き込まれたバイト数 LPVOID lpReserved // 予約(常にNULL) );
それとローカル時間を取得するGetLocalTime関数については SDK編第10章で解説していますので そちらを参照してください。
main関数内で使っているSleep関数についてはその正確な 意味合いを解説するのは大変難しいのですが、ここでは 適当な時間プログラムを眠らせてカーソルのちらつきを防いでいる 程度に理解しておいてください。
Update Jun/24/1998 By Y.Kumei