「Windows API」の版間の差分

読み取ったファイルの文章表示
(読み取ったファイルの文章表示)
 
=== ファイルの読み書き ===
==== 総論 ====
まず、Win32 API でテキストファイルなどの読み書きをする際、文字列型でTCHARなどのマルチバイト文字列を使っているので、原則的にテキストファイルの文字コードとしてUnicodeを使う。(ただし、文字列型でcharを使っている場合には、文字コードをANSIにする。なお、ウィンドウズの日本語の文字コードの Shift-JIS はANSIに含まれる。)
 
 
Windowsアクセサリ「メモ帳」で「名前をつけて保存」を選ぶと、ダイアログボックスの下のほうに「文字コード」という項目があるので、そこで 「Unicode」 を選んで保存すればいい。
 
 
==== 読み取ったファイルの文章表示 ====
日本語の場合、ワイド文字型 wchar_t を使わないと、TextOutの困難になる。 char型でも不可能ではないが、面倒くさいので、ワイド文字型で説明する。
 
例として
;読み取りたいファイル
<pre>
これはテストです。
this is a test.
</pre>
としよう。
 
まず、このテキストファイルの文字コードを「ANSI」に設定する。「名前をつけて保存」で、「文字コード」の欄を「ANSI」にすれば良い。
 
 
いっぽう、Win32APIのプログラミングでは、まず、読み取った文字列を格納するための変数を、グローバル変数で、
<source lang=c>
wchar_t str1[100];
</source>
のように wchar_t 型の文字配列を宣言する。
 
 
グローバル変数にする理由は、ファイル読み取りの関数と、画面表示などの別の関数で、読み取り結果を共有するので、グローバル変数で宣言する必要があるからである。
 
 
そして次に、プログラム中のファイル読み取りを実行したい箇所で、
<source lang=c>
 
// TODO: ここにコードを挿入してください。
setlocale(LC_ALL, ""); // ロケールの設定。空白で良い。
FILE *fp;
fopen_s(&fp, "test.txt", "r");
 
fgetws(str1, 100, fp); // fgetsではなく fgetws
fclose(fp);
 
// 行末に改行文字がつくので、それを除去
wchar_t *p = wcschr(str1, '\n');
if (p) *p = '\0'; // '\n' を除去
 
</source>
 
 
などとして、str1 に読み取ったワイド文字を入れる。
 
あとは、例えば読み取った文字列を表示したいなら、単に WM_PAINT で
<source lang=c>
// TODO: HDC を使用する描画コードをここに追加してください...
TextOut(hdc, 30, 80, str1, lstrlen(str1));
</source>
 
のように、すれば済む。
 
 
;実行結果
座標(30,80)の位置に
:「これはテストです。」
(カギ括弧なしの状態で)と表示される。
 
 
== 参考リンク ==
20,150

回編集