Win32 App Module 1. Your First Windows Program - yoshimune/LearningDirectX11 GitHub Wiki
This page refers to 【Module 1. Your First Windows Program】
このモジュールでは、最小のWindowsプログラムを記述します。やることは、単純なウィンドウを表示することです。最初のプログラムは、50行のコードで構成されます(ブランク行、コメントは含めません)。後のグラフィックス、テキスト、ユーザー入力、他様々な機能の足がかりになります。
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
//Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent Window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
// Run the message loop.
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(hwnd, &ps);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
このコードが何をしているのかを簡単に理解しておくと良いです。後のトピックでコードを詳しく説明します。
-
wWinMainはエントリーポイントです。プログラムが開始すると、いくつかのアプリケーションウィンドウの振る舞いに関する方法が登録されます。最も重要な項目の一つは
WindowProc
という関数のアドレスです。この関数はWindowの振る舞い(外観、どうやってユーザーとやり取りするか、などなど)を定義しています。 - 次にプログラムはウィンドウを作成し、ウィンドウ固有の識別するハンドルを受け取ります。
- もしウィンドウ作成に成功した場合、プログラムはwhileループに配します。プログラムは、ユーザーがウィンドウを閉じ、アプリケーションが終了するまでこのループ内にいます。
プログラムはWindoeProc
関数を明示的に呼ばないことに注意してください。ほとんどのアプリケーションロジックが定義される場所であっても、呼び出しません。Windowsはメッセージを通してプログラムとやりとりします。Whileループ内のコードはこのプロセスを駆動します。プログラムがDispatchMessageを呼び出すたびに、間接的にWindowsが各メッセージに対してWindowProc関数を呼び出すようにします。