//
//   リージョンとウインドウの形
//
//   1998/ 5/25  宍戸 輝光
//

#include <windows.h>

HINSTANCE hInst;
HWND hwnd;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow){

	MSG  msg;
	WNDCLASSEX  wndclass ;

	hInst=hInstance;

	wndclass.cbSize        = sizeof(wndclass);
	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc   = WndProc;
	wndclass.cbClsExtra    = 0;
	wndclass.cbWndExtra    = 0;
	wndclass.hInstance     = hInstance;
	wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wndclass.lpszMenuName  = NULL;
	wndclass.lpszClassName = "Test Window";
	wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION);

	RegisterClassEx (&wndclass);

	hwnd = CreateWindow ("Test Window",
		    "Test",           
                    WS_VISIBLE|WS_POPUP, // ウインドウの表示形式
                    32,32,
                    160,160,
                    NULL,
                    NULL,
                    hInstance,
		            NULL);

	ShowWindow (hwnd,iCmdShow);      // ウインドウを表示
	UpdateWindow (hwnd);             // 再描画

	while (GetMessage (&msg,NULL,0,0)) { // メッセージ処理

		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}

	return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {

	static HWND hwCtrB1,hwCtrB2;
	static HRGN hRg;

	switch (iMsg) {

		case WM_CREATE: // 初期設定

			hwCtrB1=CreateWindow("Button","円", // ボタン作成
				WS_CHILD | WS_VISIBLE,44,32,72,32,hwnd,
				(HMENU)0,hInst,NULL);

			hwCtrB2=CreateWindow("Button","終了",
				WS_CHILD | WS_VISIBLE,44,96,72,32,hwnd,
				(HMENU)1,hInst,NULL);

			hRg=CreateEllipticRgn(0,0,160,160); // 領域作成

			return 0;

		case WM_COMMAND:

			switch (LOWORD(wParam)) { // ボタンの処理

				case 0: // 円ボタン

					SetWindowRgn(hwnd,hRg,TRUE); // リージョン設定
					EnableWindow(hwCtrB1,FALSE); // ボタンを無効化

					break;

				case 1: // 終了ボタン

					SendMessage(hwnd,WM_CLOSE,0,0); // 終了

			}

			return 0;

		case WM_DESTROY :

			PostQuitMessage(0);

			return 0;

	}

	return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

}