6:文字列処理と"t"

 ひととおりクラスをおさらいしたので、今回からいよいよゲームの土台を作っていくことにします。土台さえしっかりしていれば、この土台を基盤にパズルゲームだろうがロールプレイングゲームだろうが、楽~に開発することができるようになります。

 すべてが音だけで進行するセガサターン「風のリグレット」のような、よっぽど特殊なゲームでない限り、ゲームには処理結果を表示する画面が不可欠です。MacOSやWindowsのような環境では、それらの描画はすべてウィンドウ上で行われます。そこでまず手始めに、ウィンドウを表示するプログラムを作成することにします。
 では、新規にWin32プロジェクトを作成したら、以下のコードを記入しましょう。
#include <tchar.h>
#include <windows.h>

int APIENTRY _tWinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPTSTR lpszCmdLine, int nCmdShow)
{
    return 0;
}
 GUIを利用する(逆に言えばコマンドラインを利用しない)ウィンドウズ用のアプリケーションソフトは、すべてWinMain関数がはじめに呼び出されます。この関数に宣言は<windows.h>内で記述されています。……と、普通のWindows開発の解説書にはそう書かれていますが、上のプログラムはそんな解説書のコードとは若干異なっています。「_tWinMain」の「_t」は何を意味するのでしょうか。

 Windowsでは2通りの文字処理方法があります。ひとつは1バイト毎に1文字を代入した配列(つまり
char
[])を利用する方法、もうひとつは2バイト毎に1文字を代入した配列(つまり
wchar_t
[])を利用する方法です。前者はANSI、後者はUnicodeと呼ばれています

 Unicode対応のOSでは、ANSI文字列は、内部では一度Unicodeに変換されていますので、そんな手間をかけるならはじめからUnicodeで処理できるようにすればいいじゃないかというのが人間の常というもので、その違いを吸収するのがこの「T」というわけです。
 一般の解説書に書かれているコードはANSIコード専用の関数で構築されています。専用である以上、Unicodeプログラムでは当然使えません。そこで、WinMainの代わりに「_tWinMain」としておくことで、プログラムのコンパイル時に必要に応じて、ANSI専用関数「WinMain」か、Unicode専用関数「wWinMain」に置換できるようにしておくのです。こうすれば、それぞれのOSの処理にふさわしいアクションを起こさせることができるようになります。ちなみにVisual Studioでは、特に指定しない限りUnicodeモードでのコンパイルになります。

 他にも、ANSI専用命令の関数や宣言が数多くあります。以下はその一例です。なお、共通の宣言を記述する際には<tchar.h>が必要となりますので、お忘れのないように。
ANSIUnicode共通(コンパイル時に適時変換)
charwchar_tTCHAR
strcpywcscpy_tcscpy
LPSTR(=char*)LPWSTR(=wchar_t*)LPTSTR(=TCHAR*)
"文字列"L"文字列"_T("文字列")

 シフトJISやUTF-8では漢字などの文字はchar型では収まりきれないため、2バイト分の領域を使用するわけですが、1バイト分の領域しか使わない英数字と組み合わせた文字列になると、その対処方法は非常にやっかいなものになります。当プログラミング講座では、<tchar.h>を用いた混合スタイルを利用しますが、面倒であればUnicode専用命令のみで記述してコンパイルしてもよいでしょう。