第59章 コンソールアプリで簡易時計を作る


今回は、コンソールアプリでカーソル位置の指定をやります。 これができると好きな位置にテキストを表示できるので大変便利です。
いきなりですが、カーソル位置を指定する関数は

BOOL SetConsoleCursorPosition( HANDLE hConsoleOutput, COORD dwCursorPosition // カーソル位置 );

を使います。hConsoleOutputは前章でやった

GetStdHandle(STD_OUTPUT_HANDLE);

で取得します。 次にCOORDは次のように定義された構造体です。

typedef struct _COORD { SHORT X; SHORT Y; } COORD

この構造体もtypedefされているのでCOORDをデータ型として 扱うことができます。

では、カーソル位置指定を利用して最も簡単なデジタル時計を 作ってみましょう。

// 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; }

main関数だけを見るとずいぶん簡単です。

Locate(hStdout, X, Y);でカーソル位置を指定できるように 自作関数を作ってみました。

また、TxtPrint関数も作ってみました。これは、WriteConsole関数を 簡単に使えるようにした自作関数です。

BOOL WriteConsole( HANDLE hConsoleOutput, // スクリーンバッファへのハンドル CONST VOID *lpBuffer, // 書き込む文字列 DWORD nNumberOfCharsToWrite, // 書き込む文字列のバイト数 LPDWORD lpNumberOfCharsWritten, // 書き込まれたバイト数 LPVOID lpReserved // 予約(常にNULL) );

こんな感じでコンソールに書き込みますがprintfが使えるので わざわざ使う必要はないかもしれません。また、scanfみたいな 働きをするReadConsoleという関数もありますので暇な人は ヘルプをみて研究してみてください。

それとローカル時間を取得するGetLocalTime関数については SDK編第10章で解説していますので そちらを参照してください。

main関数内で使っているSleep関数についてはその正確な 意味合いを解説するのは大変難しいのですが、ここでは 適当な時間プログラムを眠らせてカーソルのちらつきを防いでいる 程度に理解しておいてください。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Jun/24/1998 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。