Advertisement
Guest User

Untitled

a guest
May 6th, 2015
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.57 KB | None | 0 0
  1. // ヘッダファイルのインクルード
  2. #include <windows.h> // 標準WindowsAPI
  3. #include <tchar.h> // TCHAR型
  4. #include <stdio.h> // C標準入出力
  5. #include <string.h> // C文字列処理
  6.  
  7. // 関数のプロトタイプ宣言
  8. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // ウィンドウメッセージに対して独自の処理をするように定義したコールバンク関数WindowProc.
  9.  
  10. // _tWinMain関数の定義
  11. int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd){
  12.  
  13. // 変数の宣言
  14. HWND hWnd; // CreateWindowで作成したウィンドウのウィンドウハンドルを格納するHWND型変数hWnd.
  15. MSG msg; // ウィンドウメッセージ情報を格納するMSG構造体型変数msg.
  16. WNDCLASS wc; // ウィンドウクラス情報をもつWNDCLASS構造体型変数wc.
  17.  
  18. // ウィンドウクラスの設定
  19. wc.lpszClassName = _T("WM_PAINT"); // ウィンドウクラス名は"WM_PAINT".
  20. wc.style = CS_HREDRAW | CS_VREDRAW; // スタイルはCS_HREDRAW | CS_VREDRAW.
  21. wc.lpfnWndProc = WindowProc; // ウィンドウプロシージャは独自の処理を定義したWindowProc.
  22. wc.hInstance = hInstance; // インスタンスハンドルは_tWinMainの引数.
  23. wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコンはアプリケーション既定のもの.
  24. wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルは矢印.
  25. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景は白ブラシ.
  26. wc.lpszMenuName = NULL; // メニューはなし.
  27. wc.cbClsExtra = 0; // 0でいい.
  28. wc.cbWndExtra = 0; // 0でいい.
  29.  
  30. // ウィンドウクラスの登録
  31. if (!RegisterClass(&wc)){ // RegisterClassでウィンドウクラスを登録し, 0が返ったらエラー.
  32.  
  33. // エラー処理
  34. MessageBox(NULL, _T("RegisterClass failed!"), _T("WM_PAINT"), MB_OK | MB_ICONHAND); // MessageBoxで"RegisterClass failed!"とエラーメッセージを表示.
  35. return -1; // 異常終了(1)
  36.  
  37. }
  38.  
  39. // ウィンドウの作成
  40. hWnd = CreateWindow(_T("WM_PAINT"), _T("WM_PAINT"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // CreateWindowで, 上で登録した"WM_PAINT"ウィンドウクラスのウィンドウを作成.
  41. if (hWnd == NULL){ // ウィンドウの作成に失敗したとき.
  42.  
  43. // エラー処理
  44. MessageBox(NULL, _T("CreateWindow failed!"), _T("WM_PAINT"), MB_OK | MB_ICONHAND); // MessageBoxで"CreateWindow failed!"とエラーメッセージを表示.
  45. return -2; // 異常終了(2)
  46.  
  47. }
  48.  
  49. // ウィンドウの表示
  50. ShowWindow(hWnd, SW_SHOW); // ShowWindowでSW_SHOWを指定してウィンドウの表示.
  51.  
  52. // メッセージループ
  53. while (GetMessage(&msg, NULL, 0, 0) > 0){ // GetMessageでメッセージを取得, 戻り値が0より大きい間はループし続ける.
  54.  
  55. // ウィンドウメッセージの送出
  56. DispatchMessage(&msg); // DispatchMessageで受け取ったメッセージをウィンドウプロシージャ(この場合は独自に定義したWindowProc)に送出.
  57.  
  58. }
  59.  
  60. // プログラムの終了
  61. return (int)msg.wParam; // 終了コード(msg.wParam)を戻り値として返す.
  62.  
  63. }
  64.  
  65. // WindowProc関数の定義
  66. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ // ウィンドウメッセージに対して独自の処理をするように定義したウィンドウプロシージャ.
  67.  
  68. // ウィンドウプロシージャ全体で使われるスタティック変数の宣言.
  69. static int iCount; // 画面が描画された回数をカウントするint型スタティック変数iCount.
  70.  
  71. // ウィンドウメッセージに対する処理.
  72. switch (uMsg){ // switch-casa文でuMsgの値ごとに処理を振り分ける.
  73.  
  74. // ウィンドウの作成が開始された時.
  75. case WM_CREATE: // ウィンドウの作成が開始された時.(uMsgがWM_CREATEの時.)
  76.  
  77. // WM_CREATEブロック
  78. {
  79.  
  80. // ウィンドウ作成成功
  81. return 0; // return文で0を返して, ウィンドウ作成成功とする.
  82.  
  83. }
  84.  
  85. // 既定の処理へ向かう.
  86. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  87.  
  88. // ウィンドウが破棄された時.
  89. case WM_DESTROY: // ウィンドウが破棄された時.(uMsgがWM_DESTROYの時.)
  90.  
  91. // WM_DESTROYブロック
  92. {
  93.  
  94. // 終了メッセージの送信.
  95. PostQuitMessage(0); // PostQuitMessageで終了コードを0としてWM_QUITメッセージを送信.(するとメッセージループのGetMessageの戻り値が0になるので, メッセージループから抜ける.)
  96.  
  97. }
  98.  
  99. // 既定の処理へ向かう.
  100. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  101.  
  102. // 画面の描画を要求された時.
  103. case WM_PAINT: // 画面の描画を要求された時.(uMsgがWM_PAINTの時.)
  104.  
  105. // WM_PAINTブロック
  106. {
  107.  
  108. // このブロックのローカル変数・配列の宣言
  109. HDC hDC; // デバイスコンテキストハンドルを格納するHDC型変数hDC.
  110. TCHAR tszTxt[128]; // 画面の描画が行われた回数を表示するために用意したTCHAR型文字配列tszTxt.(長さ128)
  111. size_t uiLen; // tszTxtに格納された文字列の長さを格納するためのsize_t型変数uiLen.
  112.  
  113. // このウィンドウのデバイスコンテキストハンドルを取得.
  114. hDC = GetDC(hwnd); // GetDCでhwndのデバイスコンテキストハンドルを取得し, hDCに格納.
  115.  
  116. // 画面の描画が行われた回数を表示.
  117. iCount++; // 画面の描画が行われた回数iCountを1つ増やす.
  118. _stprintf(tszTxt, _T("%d times painted!"), iCount); // _stprintfでtszTxtにiCountの値を"%d times painted!"のフォーマットでセット.
  119. uiLen = _tcslen(tszTxt); // _tcslenでtszTxtの長さを取得.
  120. TextOut(hDC, 50, 50, tszTxt, (int)uiLen); // TextOutでウィンドウhwndの座標(50, 50)の位置にtszTxtを描画.
  121.  
  122. // デバイスコンテキストの解放.
  123. ReleaseDC(hwnd, hDC); // ReleaseDCでhDCに格納されているデバイスコンテキストを解放.
  124.  
  125. }
  126.  
  127. // 既定の処理へ向かう.
  128. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  129.  
  130. // 上記以外の時.
  131. default: // 上記以外の値の時の既定処理.
  132.  
  133. // 既定の処理へ向かう.
  134. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  135.  
  136. }
  137.  
  138. // あとは既定の処理に任せる.
  139. return DefWindowProc(hwnd, uMsg, wParam, lParam); // 戻り値も含めDefWindowProcに既定の処理を任せる.
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement