Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.02 KB | None | 0 0
  1. // ヘッダファイルのインクルード
  2. #include <windows.h> // 標準WindowsAPI
  3. #include <tchar.h> // TCHAR型
  4.  
  5. // 関数のプロトタイプ宣言
  6. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // ウィンドウメッセージに対して独自の処理をするように定義したコールバンク関数WindowProc.
  7.  
  8. // _tWinMain関数の定義
  9. int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd){
  10.  
  11. // 変数の宣言
  12. HWND hWnd; // CreateWindowで作成したウィンドウのウィンドウハンドルを格納するHWND型変数hWnd.
  13. MSG msg; // ウィンドウメッセージ情報を格納するMSG構造体型変数msg.
  14. WNDCLASS wc; // ウィンドウクラス情報をもつWNDCLASS構造体型変数wc.
  15.  
  16. // ウィンドウクラスの設定
  17. wc.lpszClassName = _T("CreateDIBitmap"); // ウィンドウクラス名は"CreateDIBitmap".
  18. wc.style = CS_HREDRAW | CS_VREDRAW; // スタイルはCS_HREDRAW | CS_VREDRAW.
  19. wc.lpfnWndProc = WindowProc; // ウィンドウプロシージャは独自の処理を定義したWindowProc.
  20. wc.hInstance = hInstance; // インスタンスハンドルは_tWinMainの引数.
  21. wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコンはアプリケーション既定のもの.
  22. wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルは矢印.
  23. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景は白ブラシ.
  24. wc.lpszMenuName = NULL; // メニューはなし.
  25. wc.cbClsExtra = 0; // 0でいい.
  26. wc.cbWndExtra = 0; // 0でいい.
  27.  
  28. // ウィンドウクラスの登録
  29. if (!RegisterClass(&wc)){ // RegisterClassでウィンドウクラスを登録し, 0が返ったらエラー.
  30.  
  31. // エラー処理
  32. MessageBox(NULL, _T("RegisterClass failed!"), _T("CreateDIBitmap"), MB_OK | MB_ICONHAND); // MessageBoxで"RegisterClass failed!"とエラーメッセージを表示.
  33. return -1; // 異常終了(1)
  34.  
  35. }
  36.  
  37. // ウィンドウの作成
  38. hWnd = CreateWindow(_T("CreateDIBitmap"), _T("CreateDIBitmap"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // CreateWindowで, 上で登録した"CreateDIBitmap"ウィンドウクラスのウィンドウを作成.
  39. if (hWnd == NULL){ // ウィンドウの作成に失敗したとき.
  40.  
  41. // エラー処理
  42. MessageBox(NULL, _T("CreateWindow failed!"), _T("CreateDIBitmap"), MB_OK | MB_ICONHAND); // MessageBoxで"CreateWindow failed!"とエラーメッセージを表示.
  43. return -2; // 異常終了(2)
  44.  
  45. }
  46.  
  47. // ウィンドウの表示
  48. ShowWindow(hWnd, SW_SHOW); // ShowWindowでSW_SHOWを指定してウィンドウの表示.
  49.  
  50. // メッセージループ
  51. while (GetMessage(&msg, NULL, 0, 0) > 0){ // GetMessageでメッセージを取得, 戻り値が0より大きい間はループし続ける.
  52.  
  53. // ウィンドウメッセージの送出
  54. DispatchMessage(&msg); // DispatchMessageで受け取ったメッセージをウィンドウプロシージャ(この場合は独自に定義したWindowProc)に送出.
  55. TranslateMessage(&msg); // TranslateMessageで仮想キーメッセージを文字メッセージへ変換.
  56.  
  57. }
  58.  
  59. // プログラムの終了
  60. return (int)msg.wParam; // 終了コード(msg.wParam)を戻り値として返す.
  61.  
  62. }
  63.  
  64. // WindowProc関数の定義
  65. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ // ウィンドウメッセージに対して独自の処理をするように定義したウィンドウプロシージャ.
  66.  
  67. // ウィンドウプロシージャ全体で使われるスタティック変数の宣言.
  68. static HBITMAP hBackBitmap; // バックバッファ用ビットマップのハンドルを格納するHBITMAP型スタティック変数hBackBitmap.
  69. static HBITMAP hDDB; // DIBからDDBへの変換で得られたビットマップハンドルを格納するHBITMAP型スタティック変数hDDB.
  70. static LPBYTE lpBitsPixel; // ピクセルビット列lpBitsPixel.
  71. static HDC hBackMemDC; // hBackBitmap用のデバイスコンテキストhBackMemDC.
  72. static HDC hDDBMemDC; // hDDB用のデバイスコンテキストhDDBMemDC.
  73. static HBITMAP hOldBackBitmap; // 選択前のバックバッファビットマップhOldBackBitmap.
  74. static HBITMAP hOldDDB; // 選択前のDDB側のビットマップhOldDDB.
  75. static BITMAPINFO bi; // BITMAPINFO構造体変数bi.
  76.  
  77. // ウィンドウメッセージに対する処理.
  78. switch (uMsg){ // switch-casa文でuMsgの値ごとに処理を振り分ける.
  79.  
  80. // ウィンドウの作成が開始された時.
  81. case WM_CREATE: // ウィンドウの作成が開始された時.(uMsgがWM_CREATEの時.)
  82.  
  83. // WM_CREATEブロック
  84. {
  85.  
  86. // このブロックのローカル変数の宣言・初期化
  87. HDC hDC = NULL; // ウィンドウのデバイスコンテキストハンドルhDCをNULLに初期化.(互換ビットマップ作成に必要.)
  88. HANDLE hFile; // ファイルハンドルhFile.
  89. DWORD dwSize; // ファイルサイズdwSize.
  90. BITMAPFILEHEADER bfh; // BITMAPFILEHEADER構造体変数bfh.
  91. DWORD dwReadBytes; // 読み込んだ長さdwReadBytes.
  92.  
  93. // ウィンドウのデバイスコンテキストハンドルを取得.
  94. hDC = GetDC(hwnd); // GetDCでウィンドウのデバイスコンテキストハンドルを取得し, hDCに格納.
  95.  
  96. // バックバッファ用ビットマップを生成.
  97. hBackBitmap = (HBITMAP)CreateCompatibleBitmap(hDC, 640, 480); // CreateCompatibleBitmapでサイズ(640, 480)のhDCと互換性のあるビットマップhBackBitmapを作成.
  98.  
  99. // ファイルを開く
  100. hFile = CreateFile(_T("test.bmp"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // CreateFileで"test.bmp"を開いて, 取得したハンドルをhFileに格納.
  101. if (hFile == INVALID_HANDLE_VALUE){ // hFileがINVALID_HANDLE_VALUEなら.
  102.  
  103. // エラー処理
  104. DeleteObject(hBackBitmap); // DeleteObjectでhBackBitmapを削除.
  105. ReleaseDC(hwnd, hDC); // ReleaseDCでhDCを解放.
  106. hDC = NULL; // hDCをNULLにする.
  107. return -1; // -1を返す.
  108.  
  109. }
  110.  
  111. // ファイルサイズの取得.
  112. dwSize = GetFileSize(hFile, NULL); // GetFileSizeで"test.bmp"のファイルサイズを取得する.
  113.  
  114. // BITMAPFILEHEADERの読み込み.
  115. ReadFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwReadBytes, NULL); // ReadFileでBITMAPFILEHEADERを読み込む.
  116.  
  117. // BITMAPINFOHEADERの読み込み.(BITMAPINFO構造体にBITMAPINFOHEADERのみ読み込む.)
  118. ReadFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &dwReadBytes, NULL); // ReadFileでBITMAPINFOの構造体変数にBITMAPINFOHEADERのデータのみ読み込む.
  119.  
  120. // ピクセル列を格納するバッファの確保.
  121. lpBitsPixel = new BYTE[dwSize - bfh.bfOffBits]; // dwSize - bfh.bfOffBits = (ピクセル列のサイズ)
  122.  
  123. // ピクセル列の読み込み.
  124. ReadFile(hFile, lpBitsPixel, dwSize - bfh.bfOffBits, &dwReadBytes, NULL); // ReadFileでピクセル列を読み込む.
  125.  
  126. // DIBからDDBを作成.
  127. hDDB = CreateDIBitmap(hDC, &bi.bmiHeader, CBM_INIT, lpBitsPixel, &bi, DIB_RGB_COLORS); // CreateDIBitmapでピクセル列からDDBを作成.
  128.  
  129. // hBackMemDC用のメモリデバイスコンテキストを作成.
  130. hBackMemDC = CreateCompatibleDC(hDC); // CreateCompatibleDCでhBackMemDC用のメモリデバイスコンテキストを作成.
  131.  
  132. // hDDB用のメモリデバイスコンテキストを作成.
  133. hDDBMemDC = CreateCompatibleDC(hDC); // CreateCompatibleDCでhDDB用のメモリデバイスコンテキストを作成.
  134.  
  135. // バックバッファビットマップの選択.
  136. hOldBackBitmap = (HBITMAP)SelectObject(hBackMemDC, hBackBitmap); // SelectObjectでhBackBitmapを選択.
  137.  
  138. // DDBの選択.
  139. hOldDDB = (HBITMAP)SelectObject(hDDBMemDC, hDDB); // SelectObjectでhDDBを選択.
  140.  
  141. // 閉じる.
  142. CloseHandle(hFile); // CloseHandleでhFileを閉じる.
  143.  
  144. // ウィンドウのデバイスコンテキストを解放.
  145. ReleaseDC(hwnd, hDC); // ReleaseDCでhDCを解放.
  146. hDC = NULL; // hDCをNULLにする.
  147.  
  148. // 0を返す.
  149. return 0; // return 0.
  150.  
  151. }
  152.  
  153. // 既定の処理へ向かう.
  154. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  155.  
  156. // ウィンドウが破棄された時.
  157. case WM_DESTROY: // ウィンドウが破棄された時.(uMsgがWM_DESTROYの時.)
  158.  
  159. // WM_DESTROYブロック
  160. {
  161.  
  162. // 元に戻す.
  163. SelectObject(hDDBMemDC, hOldDDB); // SelectObjectでhOldDDBに戻す.
  164.  
  165. // 元に戻す.
  166. SelectObject(hBackMemDC, hOldBackBitmap); // SelectObjectでhOldBackBitmapに戻す.
  167.  
  168. // hDDBMemDCの削除
  169. if (hDDBMemDC){ // hDDBMemDCがNULLでない時.
  170. DeleteDC(hDDBMemDC); // DeleteDCでhDDBMemDCを削除.
  171. hDDBMemDC = NULL; // NULLを代入.
  172. }
  173.  
  174. // hBackMemDCの削除
  175. if (hBackMemDC){ // hBackMemDCがNULLでない時.
  176. DeleteDC(hBackMemDC); // DeleteDCでhBackMemDCを削除.
  177. hBackMemDC = NULL; // NULLを代入.
  178. }
  179.  
  180. // DDBのビットマップハンドル削除.
  181. if (hDDB){ // hDDBがNULLでない時.
  182. DeleteObject(hDDB); // DeleteObjectでhDDBを削除.
  183. hDDB = NULL; // NULLを代入.
  184. }
  185.  
  186. // ピクセル列の解放.
  187. if (lpBitsPixel){ // hBitsPixelがNULLでない時.
  188. delete[] lpBitsPixel; // delete[]でlpBitsPixelを解放.
  189. lpBitsPixel = NULL; // NULLを代入.
  190. }
  191.  
  192. // バックバッファ用ビットマップの削除.
  193. if (hBackBitmap){ // hBackBitmapがNULLでない時.
  194. DeleteObject(hBackBitmap); // DeleteObjectでhBackBitmapを削除.
  195. hBackBitmap = NULL; // NULLを代入.
  196. }
  197.  
  198. // メッセージループを抜ける.
  199. PostQuitMessage(0); // PostQuitMessageで抜ける.
  200.  
  201. }
  202.  
  203. // 既定の処理へ向かう.
  204. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  205.  
  206. // 画面の描画を要求された時.
  207. case WM_PAINT: // 画面の描画を要求された時.(uMsgがWM_PAINTの時.)
  208.  
  209. // WM_PAINTブロック
  210. {
  211.  
  212. // このブロックのローカル変数の宣言
  213. HDC hDC; // デバイスコンテキストハンドルを格納するHDC型変数hDC.
  214. PAINTSTRUCT ps; // ペイント情報を管理するPAINTSTRUCT構造体型の変数ps.
  215.  
  216. // ウィンドウの描画開始
  217. hDC = BeginPaint(hwnd, &ps); // BeginPaintでこのウィンドウの描画の準備をする. 戻り値にはデバイスコンテキストハンドルが返るので, hDCに格納.
  218.  
  219. // DIBをDDBに変換したものを描画.
  220. BitBlt(hBackMemDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, hDDBMemDC, 0, 0, SRCCOPY); // BitBltでhDDBMemDCをhBackMemDCに描画.
  221. BitBlt(hDC, 0, 0, 640, 480, hBackMemDC, 0, 0, SRCCOPY); // BitBltでhBackMemDCをhDCに描画.
  222.  
  223. // ウィンドウの描画終了
  224. EndPaint(hwnd, &ps); // EndPaintでこのウィンドウの描画処理を終了する.
  225.  
  226. }
  227.  
  228. // 既定の処理へ向かう.
  229. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
  230.  
  231. default:
  232.  
  233. break;
  234.  
  235. }
  236.  
  237. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  238.  
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement