「Windows API/文字表示の命令」の版間の差分
削除された内容 追加された内容
{{Nav}}, s/命令/関数/ |
|||
1 行
{{Nav}}
== 文字表示の
=== 基本 ===
「Windows デスクトップアプリケーション」で自動作成されたコードをもとに説明しますので、そのコードを用意してください。(空のテンプレートで作ったコードでもウィンドウに文字や画像を描画することは可能。とりあえず本wikibooksでは、説明の単純化のために、先に「Windows デスクトップアプリケーション」で自動作成されたコードで説明する。)
Windows APIの文字表示で、いちばん簡単な
<
TextOut(hdc, 10, 30, TEXT("テスト"), 3);
</syntaxhighlight>
のように使います。「hdc」は対象のウィンドウ名(「ハンドル名」などという)です。初期設定をウィザードで自動作成した場合に標準ではこの名前になってるので、本書では、特に断らない限り、この関数名を使う事とします。
16 行
ただし、このTextOut
<
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
</syntaxhighlight>
という関数(120行目あたりにある。)から始まるブロック中にある条件分岐「 case WM_PAINT: 」のブロック中で書きます。
26 行
すでに、
<
case WM_PAINT:
{
35 行
EndPaint(hWnd, &ps);
}
</syntaxhighlight>
とあるので、そこに TextOut
<
case WM_PAINT:
{
50 行
EndPaint(hWnd, &ps);
}
</syntaxhighlight>
のようになります。
87 行
そのクラス登録の一連のコード中の70行目あたりに、
<
wcex.lpfnWndProc = WndProc;
</syntaxhighlight>
とあるはずです。これにより、コールバック関数 WndProc が、ウィンドウと関連づけられています。
=== 文字表示での変数などの活用 ===
<
TextOut(hdc, 10, 20, TEXT("Hello"), 5);
</syntaxhighlight>
のように、毎回、字数を入力するのは、面倒である。
そこで、「lstrlen()」という、文字列の長さを返す
APIプログラミングでは、strlen
また、毎回メッセージごとにTextOut
コード例
<
static TCHAR aisatu[60] ;
lstrcpy(aisatu, TEXT("Hello"));
TextOut(hdc, 10, 20, aisatu, lstrlen(aisatu));
</syntaxhighlight>
のように書くのが実用的である。
124 行
lstrcpyは、C言語でいう文字列のコピー
このように、Windows独自の
TextOutする事じたいは難しくないのだが、それを実用的なコードにするためにWindows独自の型などを学ばなければならず、そっちが難しい。
134 行
=== MSDNのシンタックスの読みかた ===
たとえば、マイクロソフトの開発者むけサイト MSDN を見ると、TextOut関数について、
<
BOOL TextOutA(
HDC hdc,
142 行
int c
);
</syntaxhighlight>
と、冒頭に、あかたも文法のような何か が書いてある。[https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-textouta MSDN TextOutA function]
164 行
TextOut関数にかぎらず、API関数を実際に使う場合、冒頭の型は宣言しない。つまり、
プログラミング中にTextOut関数を実際に呼び出して使用するための
<
TextOutA(
HDC hdc,
173 行
int c
);
</syntaxhighlight>
のような、冒頭のBOOL型を除去した書式で書く必要がある。
187 行
実際、MSDNのサンプルコードでは、
<
TextOut(hdc,r.left,r.top,text, ARRAYSIZE(text));
</syntaxhighlight>
のように、冒頭の型を除去したあとに1行でまとめて宣言している。
206 行
さて、TextOut
よって、まずC言語の組み込み関数 sprintf という、これは数値型を文字列型に変換できる組み込み関数ですが、これのWindows版で _stprintf_s というのがありますので、Win32 API では _stprintf_s を使って、変数を文字列型に変換します。
223 行
結局、身長の変数 sintyo を画面に表示するには・・・
<
int sintyo = 153 ; // この 153 を画面に表示したい
static TCHAR henkan[50] ; // 文字列を格納するための変数 henkan を準備
_stprintf_s( henkan, 200, TEXT("%d"), sintyo); // ここで153を文字列に置き換え、文字列変数 henkan に格納してる
TextOut(hdc, 10, 20, henkan, lstrlen(henkan));
</syntaxhighlight>
のように、なります。
237 行
_stprintf_s で代入先になる第一引数になる文字列変数(例では henkan )は TCHAR 型でなければなりません。(もし char型だと コンパイルでエラーになる。)
_stprintf_s
;実数型の場合のコード例
<
double sintyo = 153 ; // double型の場合
static TCHAR henkan[50] ;
_stprintf_s( henkan, 200, TEXT("%d"), (int) sintyo); // (int)は整数型への型変換である。
TextOut(hdc, 10, 20, henkan, lstrlen(henkan));
</syntaxhighlight>
となります。
254 行
まず、とりあえず100倍して、それを型変換の <code>(int)</code>
そのあと、上記の章と同様に sprintf すれば、小数点の上位2ケタの表示がされます。
<
// 正常に動作するコード例
int hensuu = 0.38 ;
268 行
TextOut(hdc, 450, 415, henkan, lstrlen(henkan));
</syntaxhighlight>
===== 駄目なコード =====
282 行
<
// ダメなコード例
int hensuu = 0.38 ;
290 行
TextOut(hdc, 450, 415, henkan, lstrlen(henkan));
</syntaxhighlight>
このコードは駄目なのです。
314 行
なお、int整数値を TCHAR 形に変換するには、_itot_s を使います。
<
_itot_s(sintyo , henkan, 200, 10); // 第4引数の「10」は10進数という意味。
TextOut(hdc, 10, 20, henkan, lstrlen(henkan));
</syntaxhighlight>
のように、なります。
328 行
2つ以上の文字を連結したい場合は、単に、C言語の sprintfs のTCHAR版である <code>_stprintf_s</code> を使えばいいだけです。
<
_stprintf_s(mojibuf, TEXT("%s %s"), TEXT("私の名は"), person_name);
TextOut(hdc, 10, 20, mojibuf, lstrlen(mojibuf));
</syntaxhighlight>
のようになります。
|