「Windows API/ウィンドウの表示」の版間の差分

削除された内容 追加された内容
Windows API』 2019年9月4日 (水) 21:48‎ から該当する章をそれぞれのサブページに移動。
(相違点なし)

2019年9月4日 (水) 21:51時点における版

「空のプロジェクト」

初期設定(Windows API/初期設定のしかた)を終えたら、次に「空のプロジェクト」でプロジェクトを開始してみましょう。Visual Studio 2017 では、「空のプロジェクト」で開始したプロジェクトは、本当に、ほぼ空であり、なんと、入力用のファイルすら存在しません。

ソースファイル用フォルダなどの各種のフォルダは用意されてますが、存在するのはフォルダだけです。フォルダの中に、そのファイルは、まだ無い状態です。なので、まだソースコードの入力すら、できません。

なので、ソースファイル用フォルダにマウスカーソルを合わせた状態で、右クリックで出現するメニュー一覧から「追加」を選択し、cppファイル(C++用のファイル形式)の追加を命令して、cppファイルを追加してください。

これで、ようやく、ソースコードの入力ができます。


では、入力できるようになったソースファイルに、さっそく、次のように入力してみましょう。

例1
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MessageBox(NULL, TEXT("Hello, World!"), TEXT("アプリ名"), MB_OK);
	return 0;
}

これで、メッセージボックスが表示されます。これ以外に、ファイルを追加しなくても、メッセージボックスを表示できます。このように、いくつかの命令文は、Windows自身が命令を判断してくれるので、コードを大幅に省略できます。

上述のように、かならずしも、Windows デスクトップアプリケーション」のように何百行(行数がいくつあるかは数えてない)もありそうな長い設定ファイルを書かなくても、たったの数行でもWindows APIによるアプリケーションを開発することも、上述のコードのように可能です。

なお、上記コード 例1 の WinMain を 「wWinMain」 にすると、現状ではエラーになってしまいます。まだ、wWinMainを使うための設定がソースコードに書かれてないからです。


さて、命令 MessageBox は、API開発 にかぎらず、C#などの初心者むけGUIプログラミングでも使われる命令です。特に設定を定義する必要もなく、1行の命令でメッセージボックスを呼び出せるので、開発ではデバッグなどにも役立ちます。

また、

#include <windows.h>

は、APIプログラミングにかぎらず、C言語規格の標準ライブラリでは用意されてないWindows用ライブラリを使う際に、インクルードする必要があります。

当然、Windows API は、ウィンドウズ独自の規格なので、C言語標準ライブラリには無いので、よって、Windows APIアプリの開発でも、 windows.h をインクルードする必要があります。


上記のコードは、実行すると、メッセージボックスが表示され、表示されるOKボタンを押すとアプリが終了します。

重要なこととして、WinMain 関数ブロックの最後まで来るか return が実行されると、アプリが終了します。

ウィンドウの表示

ウィンドウを表示するプログラムで、簡単なコード例をあげます。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND aaa = CreateWindow("STATIC",
		TEXT("窓タイトルと本文"),
		WS_OVERLAPPEDWINDOW,
		0, 100, 200, 300, NULL, NULL,
		hInstance, NULL
	);

	ShowWindow(aaa, SW_SHOW);

	MessageBox(NULL, TEXT("ボタンを押してください"), TEXT("ボックスタイトル"), MB_OK);

	return 0;
}

上述のコードにある「aaa」は、われわれが自由に命名できるハンドル名です。

CreateWindow関数によって、ウィンドウが作成されます。ウィンドウ作成時に、どのようなウィンドウを作成するのかを引数(カッコ内の部分、「STATIC」「TEXT」など)で指定しなければなりません。

この命令は、単に作成するだけであり、まだ表示しません。

作成したウィンドウを表示するには、さらに、ShowWindow 命令を用いて、ウィンドウの表示状態を表示オンにする必要があります。この ShowWindow 関数は、ウィンドウ表示の関数ではなく、ウィンドウの表示状態を指定する関数です。なので、上述のコードのように引数で SW_SHOW を指定して、ウィンドウを表示させます。第一引数の「aaa」の部分は、対象となるウィンドウを指定しています。

そして、こうしてウィンドウ表示をしても、WinMain関数が終わるまでの間しか、ウィンドウを表示できません。

なので、なんらかの方法で、プログラムの進行を止めないと、パソコンではプログラム実行後に高速でプログラムが終了するので、人間の目には何のウィンドウも見えません。

よって、上記のコード例では、MessageBox 命令によって、プログラムの進行を止めています。


さて、上記コード例の「"STATIC"」は、ウィンドウズで定められた意味をもつ宣言命令なので、上記の例では、変えてはいけません。命令なのに、なぜ「 " " 」で囲むのか疑問に感じるでしょうが、昔のマイクロソフトの人とかが、こう決めてしまったので、あきらめてください。

なお、この第一引数(上記コードでは「"STATIC"」)の部分で、そのウィンドウの大まかな性質を決定しており、これをウィンドウクラスといいます。

「クラス」といっても、C++でいうグループ化の機能をもつ「クラス」とは別物です。

たとえるなら、昔のコンピューターRPGゲーム(w:ウィザードリィ など)で、「戦士」「魔法使い」などの職業の種類のことを「クラス」と言ってました。このWindows API のウィンドウ「クラス」も、ウィンドウの機能の種類のことを言っています。


「0, 100, 200, 300, 」の部分は、表示位置のXY座標と(原点はパソコン画面の左上)、ウィンドウのヨコ幅とタテ幅です。


上記のコード例では、X=0、Y=100,の位置に、

ヨコ幅=200とタテ幅=300の、タテ長のウィンドウを作成しています。