Cプログラミンの一環として始めた Windos API ですが、やってみたら面白かったので、もっと詳しく、かつ簡単に、ステップバイステップで学習するコーナーも作りました。
Windows API Primer
Primer は、入門書という意味です。
このサイトでは、各GUIフレームワークの「はじめの一歩」でウィンドウを作成しています。しかし、Windows APIは、ウィンドウを表示するだけでもとても多くのコードが必要です。そのため、この章ではまず、ウィンドウに比べると簡単に表示できるメッセージボックスというGUIを使って、プログラムの開始ポイントであるメイン関数について説明します。
次のソースコードを、お好きなエディタで記述して、messagebox.c という名前でお好きな場所に保存してください。
#include <windows.h>
/* メイン関数 */
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
/* メッセージボックス */
MessageBox (
NULL,
TEXT("日本語などの2バイト文字では、\n文字化けする文字もあるみたいです。"),
TEXT("はじめの一歩"),
MB_OK
);
/* アプリケーションの終了 */
return 0;
}
ソースコードの記述が終わりましたら、ソースコードを機械語に変えるコンパイルという作業が必要です。
コマンドプロンプトもしくはMsys2を起動して、messagebox.cを保存したディレクトリに移動してください。そして次のコマンドでコンパイルします。
gcc messagebox.c -o messagebox -mwindows
gcc のあとに ファイル名を指定します。-o のあとにはコンパイルされる実行ファイル名を指定します。このオプションを省略すると a.exe という実行ファイルが作成されます。また、-mwindows オプションを省略すると、実行ファイルをダブルクリックで実行した場合、コマンドプロンプトが一緒に起動します。
コマンドプロンプトもしくはMsys2で次のようにコマンドするか、実行ファイルをダブルクリックしてください。
// コマンドプロンプトの場合
messagebox
// Msys2の場合
./messagebox
次に、この節では、ウィンドウを作成します。Windows APIでは、ウィンドウを表示するために次の5つステップが必要です。
では、次のソースコードを、お好きなエディタで記述して、window.c という名前でお好きな場所に保存してください。このコードではウィンドウの表示を維持するためにメッセージボックスを使っています。
#include <windows.h>
/* メイン関数 */
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
/* ローカル変数 */
WNDCLASS wc;
HWND hwnd;
/* WNDCLASSの作成 */
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("MainWindow");
/* WNDCLASSの登録 */
RegisterClass(&wc);
/* ウィンドウの作成 */
hwnd = CreateWindow (TEXT("MainWindow"),
TEXT("メインウィンドウ"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
/* ウィンドウの表示 */
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
/* メッセージボックス */
MessageBox (hwnd,
TEXT("OKボタンをクリックすると、\nアプリケーションが終了します。"),
TEXT("はじめの一歩"),
MB_OK);
/* アプリケーションの終了 */
return 0;
}
ソースコードの記述が終わりましたら、ソースコードを機械語に変えるコンパイルという作業が必要です。
コマンドプロンプトもしくはMsys2を起動して、window.cを保存したディレクトリに移動してください。そして次のコマンドでコンパイルします。
gcc window.c -o window -mwindows
gcc のあとに ファイル名を指定します。-o のあとにはコンパイルされる実行ファイル名を指定します。このオプションを省略すると a.exe という実行ファイルが作成されます。また、-mwindows オプションを省略すると、実行ファイルをダブルクリックで実行した場合、コマンドプロンプトが一緒に起動します。
コマンドプロンプトもしくはMsys2で次のようにコマンドするか、実行ファイルをダブルクリックしてください。
// コマンドプロンプトの場合
window
// Msys2の場合
./window
Windows APIのアプリケーションは、「メッセージループ」と呼ばれるものでアプリケーションの実行を維持し続けます。メッセージループはwhileループで作ります。
アプリケーションを終了するには、メッセージループにメッセージを送ります。そのメッセージの受け手となる関数も必要になります。このメッセージの受け手となる関数のことをWindows APIでは「ウィンドウプロシージャ」と呼びます。他の開発環境でイベントハンドラー(evnt handler)と呼ばれるものとだいたい同じですが、Windows APIでは次の点で違います。
Windows APIでは、すべてのGUI部品はウィンドウの一種として認識されています。ボタンもウィンドウの一種です。そしてそのウィンドウをウィンドウプロシージャと接続しておきます。ウィンドウプロシージャでは、送られてきたメッセージによって処理を選り分けます。つまりメッセージ(イベント)によって接続する関数を選り分けるのではなく、関数側でメッセージによって処理を選り分けます
次のソースコードを、お好きなエディタで記述して、hello.c という名前でお好きな場所に保存してください。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,
UINT,
WPARAM,
LPARAM);
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
HWND hwnd;
MSG msg;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("MainWindow");
RegisterClass(&wc);
hwnd = CreateWindow (TEXT("MainWindow"),
TEXT("Hello Windows API"),
WS_OVERLAPPEDWINDOW,
(GetSystemMetrics(SM_CXSCREEN) - 400) / 2,
(GetSystemMetrics(SM_CYSCREEN) - 250) / 2,
400,
250,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,
msg,
wParam,
lParam);
}
ソースコードの記述が終わりましたら、ソースコードを機械語に変えるコンパイルという作業が必要です。
コマンドプロンプトもしくはMsys2を起動して、hello.cを保存したディレクトリに移動してください。そして次のコマンドでコンパイルします。
gcc hello.c -o hello -mwindows
gcc のあとに ファイル名を指定します。-o のあとにはコンパイルされる実行ファイル名を指定します。このオプションを省略すると a.exe という実行ファイルが作成されます。また、-mwindows オプションを省略すると、実行ファイルをダブルクリックで実行した場合、コマンドプロンプトが一緒に起動します。
コマンドプロンプトもしくはMsys2で次のようにコマンドするか、実行ファイルをダブルクリックしてください。
// コマンドプロンプトの場合
hello
// Msys2の場合
./hello