/*****************************************************
     HelloWindow
 
     2002.Jun.29
     K_Yaguchi
 
     URL     http://www5b.biglobe.ne.jp/~kouta_y/
     mailto  kouta_y@mve.biglobe.ne.jp
 *****************************************************/
 
 
 #include <windows.h>    // DOSでは stdio.h だが、WINDOWSではこれが標準のインクルードファイル
 
 #define ClassName       "HelloWindowSample"     // クラス名(テキトー)
 
 
 char cnt = 'A';         // グローバル変数
 
 
 /******************************
 
     ウィンドウプロージャ
 
 *******************************/
 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
     
     HDC         hdc; // デバイスコンテキスト
     PAINTSTRUCT ps;  // ペイント構造体
 
 
 //  メッセージを受け取ったら分岐させて処理する
     switch (msg) {
         case WM_DESTROY:            // ウィンドウが閉じられた時のメッセージ
             PostQuitMessage(0);     // スレッドの終了を要求する
             break;
         
         case WM_LBUTTONUP:                      // マウスの左ボタン
             cnt++;                              // インクリメント
             InvalidateRect(hWnd, NULL, TRUE);   // ウィンドウの内容を消す(同時に再描画命令も呼ばれる)
             break;
 
         case WM_PAINT:                          // 再描画命令のメッセージ
             hdc = BeginPaint(hWnd, &ps);        // デバイスコンテキストを取得
             SetBkMode(hdc, TRANSPARENT);        // 文字の背景モード(透明にする)
             TextOut(hdc, 150, 110, &cnt, 1);    // 文字の描画
             EndPaint(hWnd, &ps);                // 描画終わり
             break;
 
         default:
             return DefWindowProc(hWnd, msg, wp, lp);    // 何もしない時は既定のコールバック関数へ(その戻り値を返す)
     }
 
     return 0;   // 処理をした時は0を返す
 }
 
 
 
 /***************
 
     メイン
 
 ****************/
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, PSTR lpCmdLine, int nCmdShow) {
     HWND     hWnd;  // ウィンドウハンドル
     MSG      msg;   // メッセージ構造体
     WNDCLASS wc;    // ウィンドウクラス構造体
 
 
 //  ウィンドウクラス登録
     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_WINDOW;             // 背景色(デフォルトのウィンドウ色)
     wc.lpszMenuName     = NULL;                             // メニューリソースの名前
     wc.lpszClassName    = ClassName;                        // ウィンドウクラス名
     
     if (!RegisterClass(&wc)) return 0;  // 登録する
 
 
 //  登録したらそのクラスでウィンドウを作成する
     hWnd = CreateWindow(
                 ClassName,                          // ウィンドウクラス名
                 "ハローウィンドウ!",               // ウィンドウのタイトル
                 WS_OVERLAPPEDWINDOW | WS_VISIBLE,   // ウィンドウのスタイル
                 CW_USEDEFAULT, CW_USEDEFAULT,       // ウィンドウの初期位置(ピクセル単位のXとY)
                 320, 240,                           // ウィンドウの初期サイズ(ピクセル単位の幅と高さ)
                 NULL,                               // 親ウィンドウ
                 NULL,                               // メニューバーのハンドル、もしくはIDを指定
                 hInstance,                          // インスタンスハンドル
                 NULL                                // WM_CREATE時に渡されるlParamの値
             );
     if (hWnd == NULL) return 0;
 
 
 //  ユーザーから送られるメッセージを
 //  ウィンドウプロージャへ渡す為のループ
     while(1) {
         if(GetMessage(&msg, NULL, 0, 0) == 0)   // メッセージの取得(0はウィンドウが閉じられた事を示す)
             break;
         TranslateMessage(&msg);                 // 仮想キーメッセージを文字メッセージに変換
         DispatchMessage (&msg);                 // ウィンドウプロージャへメッセージを送る(ここでウィンドウプロージャが呼ばれる)
     }
 
 //  ウィンドウクラスの登録解除
 //  ここは明示的に呼び出さなくても良い
     UnregisterClass(ClassName, hInstance);
     return msg.wParam;
 }