2001/9月のテーマは コンソールアプリケーションを作ろう!

コンソールアプリケーションとは?
WindowsのGUI(グラフィック ユーザー インターフェース)はとてもすばらしい環境です。
ですが、単純な文字モードのプログラムで十分な場合やMS-DOSからのプログラムの移植などのときは
かえって不便なものです。
文字モードのプログラムとはASCII文字セットを使って、文字ベースのデバイス
(80文字 x 25行のディスプレイシステムなど)を想定したプログラムのことです。
Visual Basicでは全くサポートされていません。そこで作ってみました。
WinMain関数?
Windowsのプログラムは基本的にはWinMain関数から始まります。
でもVisual Basicを使っていてWinMain関数などという関数は見ませんね。
まあ代わりにForm_Loadを使っています。
しかしVisual BasicにもWinMain関数の代わりがあります。
それはSub Main()関数です。
WinMain関数と同等の関数なのでクラス構造体なども全て定義しなければなりません。
サンプルはRegisterClassEx()関数を参考にしてください。
ですがコンソールアプリケーションの場合はWinMain関数からではなくmain関数から始まるのです。

さて困りました。Visual BasicにはWinMain関数の代わりはあってもmain関数の代わりはありません。
なにはともあれSub Main()関数からしかできないのでやるだけやってみましょう。
コンソール基礎知識
コンソールアプリケーションはGUI系のAPIは全く使えないので
コンソール用のAPIを使って実現します。
まずコンソールプログラムはコンソールウィンドウがなくては話になりません。
コンソールウィンドウを用意する場合、現在のコンソールウィンドウを継承するか
(Command.comなど)実行時にコンソールが存在しない場合はコンソールが割り当てられるのがデフォルトです。
ですがコンソールウィンドウを作るときは専用のコンソールウィンドウを作ったほうが
便利でしょう。そのほうが変更内容がそのコンソールにしか影響しないからです。
それにはAllocConsole()関数を使います。
この関数は新しいコンソールを確保してくれます。
割り当てられたコンソールはウィンドウを作成します。このウィンドウは
他のウィンドウと同じように動作しますが、このウィンドウ内では文字モードしか使用できません。

1つのコンソールセッション内から文字モードプログラムを実行するとき
新しいコンソールを割り当てる前に古いコンソールを解放する必要があります。
これにはFreeConsole()関数を使用します。
この関数は古いコンソールを解放します。
コンソールはプログラム終了と同時に自動的に解放されますが
FreeConsole()関数を使用して明示的に解放することもできます。
コンソールウィンドウへのタイトルの追加
コンソールウィンドウにももちろんキャプションバーなどはあります。
ということは当然のようにキャプションバーへの文字の追加する関数が用意されています。
APIのSetConsoleTitle()関数を使います。
ハンドルの取得
GUIウィンドウを操作するときはウィンドウハンドル(hWnd)というものが必要でした。
同じようにコンソールウィンドウを扱うときにも色々なハンドルを取得しなくてはなりません。
コンソールを操作するときに必要な標準ハンドルを取得する関数はGetStdHandle()関数です。
標準ハンドルはキーボードからの文字を受け取ったり、文字を表示したりするのに使います。
画面に文字を出力するには?
文字モードのプログラムで文字が出力できなかったら全く話になりませんね。
そのコンソールウィンドウに文字を出力する方法の一つとして、APIのWriteConsole()関数を使用します。
使い方はまずGetStdHandle()関数で標準出力ハンドルを取得したあと、文字列を指定して
関数を実行します。使い方は結構簡単です。
画面の文字の色を変えたい!
コンソールウィンドウに文字を出力するにはAPIのWriteConsole()関数を使用します。
そのとき文字の色や背景色が変更できたら便利ですね。実はそのためにAPIが用意されています。
テキスト色は白、背景色が黒です。これを変更するにはSetConsoleTextAttribute()関数を使います。
実際の色は、指定した色要素の組み合わせによって決まります。
白を作成する場合は3色全てを組み合わせますし、黒を作成する場合には色を1つも作成しません。
詳しくはSetConsoleTextAttribute()関数の解説を見てください。
カーソル位置を設定する
コンソールウィンドウに文字を出力するとき、出力位置が変更できなければとても不便です。
そう。昔のBASIC言語のLocate命令(カーソルの文字位置を指定する命令)が欲しいですね。
コンソールウィンドウ内でカーソルの位置を変更するにはSetConsoleCursorPosition()関数を使います。
カーソル位置はCOORD構造体を使用して指定します。
最後にキーボードからの入力を知りたい!
長いですね。さすがに疲れてきました。
さて基礎知識の最後にキーボードから入力された情報を読み込みましょう。
そのためにはReadConsole()関数を使います。
このときに必要なハンドルは標準入力ハンドルですから気をつけてくださいね。
この関数は、指定した文字数に達するか、[Enter]キーを押されるまで読み取りを行います。
サンプル
お疲れ様です。とりあえず最低限必要な知識はここまでで解説してしまいました。
最後にサンプルをダウンロードして実行してみてください
ダウンロード(Console1.lzh 5.80KB)