Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.54 KB | None | 0 0
  1. // 二重インクルード防止
  2. #pragma once // #pragma onceで二重インクルード防止.
  3.  
  4. // ヘッダのインクルード
  5. // 独自のヘッダ
  6. #include "PictureBox.h" // ピクチャーボックスクラス
  7.  
  8. // コンストラクタCPictureBox()
  9. CPictureBox::CPictureBox() {
  10.  
  11. // 初期化
  12. m_hBitmap = NULL; // m_hBitmapにNULLをセット.
  13. m_hMemDC = NULL; // m_hMemDCにNULLをセット.
  14. m_iPictureWidth = 0; // m_iPictureWidthに0をセット.
  15. m_iPictureHeight = 0; // m_iPictureHeightに0をセット.
  16.  
  17. }
  18.  
  19. // デストラクタ~CPictureBox()
  20. CPictureBox::~CPictureBox() {
  21.  
  22. // 終了処理
  23. m_iPictureHeight = 0; // m_iPictureHeightに0をセット.
  24. m_iPictureWidth = 0; // m_iPictureWidthに0をセット.
  25. if (m_hMemDC != NULL) {
  26. DeleteDC(m_hMemDC); // DelteDCでm_hMemDCを削除.
  27. m_hMemDC = NULL; // m_hMemDCにNULLをセット.
  28. }
  29. if (m_hBitmap != NULL) {
  30. DeleteObject(m_hBitmap); // DeleteObjectでm_hBitmapを削除.
  31. m_hBitmap = NULL; // m_hBitmapにNULLをセット.
  32. }
  33.  
  34. }
  35.  
  36. // ウィンドウ作成関数Create(lpctszClassName省略)
  37. BOOL CPictureBox::Create(LPCTSTR lpctszWindowName, DWORD dwStyle, int x, int y, int iWidth, int iHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance) {
  38.  
  39. // ウィンドウの作成.
  40. return CCustomControl::Create(_T("Static"), lpctszWindowName, dwStyle, x, y, iWidth, iHeight, hWndParent, hMenu, hInstance); // CCustomControl::Createでウィンドウを作成し, その戻り値をreturnで返す.
  41.  
  42. }
  43.  
  44. // 画像をロードする関数Load.
  45. BOOL CPictureBox::Load(LPCTSTR lpctszFileName, int iWidth, int iHeight) {
  46.  
  47. // 変数の宣言・初期化.
  48. HINSTANCE hInstance; // アプリケーションインスタンスハンドルhInstance.
  49. BITMAP bitmap = { 0 }; // BITMAP構造体変数bitmap.
  50.  
  51. // 幅と高さをメンバにセット.
  52. m_iPictureWidth = iWidth; // m_iPictureWidthにiWidthをセット.
  53. m_iPictureHeight = iHeight; // m_iPictureHeightにiHeightをセット.
  54.  
  55. // インスタンスハンドルの取得.
  56. hInstance = (HINSTANCE)GetWindowLong(m_hWnd, GWLP_HINSTANCE); // GetWindowLongでインスタンスハンドルを取得.
  57.  
  58. // 画像のロード.(ひとまずビットマップのみ.)
  59. m_hBitmap = (HBITMAP)LoadImage(hInstance, lpctszFileName, IMAGE_BITMAP, m_iPictureWidth, m_iPictureHeight, LR_LOADFROMFILE); // LoadImageでビットマップをロード.
  60. if (m_hBitmap == NULL) { // NULLなら.
  61.  
  62. // 失敗.
  63. return FALSE; // 失敗なのでFALSEを返す.
  64.  
  65. }
  66.  
  67. // 画像から幅と高さを取得.
  68. GetObject(m_hBitmap, sizeof(BITMAP), &bitmap); // GetObjectでビットマップ情報を取得.
  69. m_iPictureWidth = bitmap.bmWidth; // m_iPictureWidthにbitmap.bmWidthをセット.
  70. m_iPictureHeight = bitmap.bmHeight; // m_iPictureHeightにbitmap.bmHeightをセット.
  71.  
  72. // 成功.
  73. return TRUE; // 成功なのでTRUEを返す.
  74.  
  75. }
  76.  
  77. // 画像をセット(表示)する関数SetImage.
  78. void CPictureBox::SetImage() {
  79.  
  80. // 変数の宣言
  81. HDC hDC; // デバイスコンテキストハンドルHDC型hDC.
  82.  
  83. // デバイスコンテキストの取得.
  84. hDC = GetDC(m_hWnd); // GetDCでデバイスコンテキストを取得.
  85.  
  86. // メモリデバイスコンテキストの作成.
  87. m_hMemDC = CreateCompatibleDC(hDC); // CreateCompatibleDCでメモリデバイスコンテキスト作成.
  88.  
  89. // 画像をセットする.
  90. SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_hBitmap); // SendMessageでSTM_SETIMAGEを送信することでm_hBitmapをセットする.
  91.  
  92. // スクロールバーの位置(メンバ)の初期化.
  93. m_iHScrollPos = 0;
  94. m_iVScrollPos = 0;
  95.  
  96. // デバイスコンテキストの解放.
  97. ReleaseDC(m_hWnd, hDC); // ReleaseDCでデバイスコンテキスト解放.
  98.  
  99. }
  100.  
  101. // ウィンドウの描画を要求された時のハンドラOnPaint.
  102. void CPictureBox::OnPaint() {
  103.  
  104. // 変数の宣言
  105. HDC hDC; // デバイスコンテキストハンドルHDC型hDC.
  106. PAINTSTRUCT ps; // PAINTSTRUCT構造体変数ps.
  107. HBITMAP hOld; // 以前のビットマップハンドルhOld.
  108. int iDrawWidth; // 実際の描画幅.
  109. int iDrawHeight; // 実際の描画高さ.
  110.  
  111. // 描画開始.
  112. hDC = BeginPaint(m_hWnd, &ps); // BeginPaintで描画開始.
  113.  
  114. // ビットマップの選択.
  115. hOld = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); // SelectObjectでm_hBitmapを選択.
  116.  
  117. // ビット転送による描画.
  118. iDrawWidth = m_iWidth - SCROLLBAR_THICKNESS; // 実際にはコントロール幅 - スクロールバーの厚さ.
  119. iDrawHeight = m_iHeight - SCROLLBAR_THICKNESS; // 実際にはコントロール高さ - スクロールバーの厚さ.
  120. BitBlt(hDC, 0, 0, iDrawWidth, iDrawHeight, m_hMemDC, m_iHScrollPos, m_iVScrollPos, SRCCOPY); // BitBltでm_hMemDCからhDCにビット転送することで描画される.
  121.  
  122. // 古いビットマップを再選択して戻す.
  123. SelectObject(m_hMemDC, hOld); // SelectObjectでhOldを選択.
  124.  
  125. // スクロールバー設定.
  126. // 横
  127. ZeroMemory(&m_ScrollInfo, sizeof(SCROLLINFO));
  128. m_ScrollInfo.cbSize = sizeof(SCROLLINFO); // サイズをセット.
  129. m_ScrollInfo.fMask = SIF_PAGE | SIF_RANGE; // フラグをセット.
  130. m_ScrollInfo.nPage = iDrawWidth; // 幅をセット.
  131. m_ScrollInfo.nMin = 0; // 最小値をセット.
  132. m_ScrollInfo.nMax = m_iPictureWidth; // 最大値をセット.
  133. SetScrollInfo(m_hWnd, SB_HORZ, &m_ScrollInfo, FALSE); // SetScrollInfoでセット.
  134. // 縦
  135. ZeroMemory(&m_ScrollInfo, sizeof(SCROLLINFO));
  136. m_ScrollInfo.cbSize = sizeof(SCROLLINFO); // サイズをセット.
  137. m_ScrollInfo.fMask = SIF_PAGE | SIF_RANGE; // フラグをセット.
  138. m_ScrollInfo.nPage = iDrawHeight; // 高さをセット.
  139. m_ScrollInfo.nMin = 0; // 最小値をセット.
  140. m_ScrollInfo.nMax = m_iPictureHeight; // 最大値をセット.
  141. SetScrollInfo(m_hWnd, SB_VERT, &m_ScrollInfo, FALSE); // SetScrollInfoでセット.
  142.  
  143. // 描画終了.
  144. EndPaint(m_hWnd, &ps); // EndPaintで描画終了.
  145.  
  146. }
  147.  
  148. // 水平方向スクロールバーイベント時のハンドラOnHScroll.
  149. void CPictureBox::OnHScroll(UINT nSBCode, UINT nPos) {
  150.  
  151. // スクロール情報取得.
  152. m_ScrollInfo.fMask = SIF_POS; // 位置だけ変更モード(これがないと, スクロールバーが元の位置に戻ってしまうので注意!こっちが前!)
  153. GetScrollInfo(m_hWnd, SB_HORZ, &m_ScrollInfo); // マスクを設定してからGetScrollInfo.(こっちが後!)
  154.  
  155. // スクロールバー処理.
  156. switch (nSBCode) { // nSBCodeごとに振り分け.
  157.  
  158. // 一番左
  159. case SB_LEFT:
  160.  
  161. // 位置を最小値に.
  162. m_ScrollInfo.nPos = m_ScrollInfo.nMin;
  163. break;
  164.  
  165. // 一番右
  166. case SB_RIGHT:
  167.  
  168. // 位置を最大値に.
  169. m_ScrollInfo.nPos = m_ScrollInfo.nMax;
  170. break;
  171.  
  172. // 1列左
  173. case SB_LINELEFT:
  174.  
  175. // nPosが0でなければデクリメント.
  176. if (m_ScrollInfo.nPos > 0) {
  177. m_ScrollInfo.nPos--;
  178. }
  179. break;
  180.  
  181. // 1列右
  182. case SB_LINERIGHT:
  183.  
  184. // nPosが最大値-1でなければインクリメント.
  185. if (m_ScrollInfo.nPos < m_ScrollInfo.nMax - 1) {
  186. m_ScrollInfo.nPos++;
  187. }
  188. break;
  189.  
  190. // 1ページ左
  191. case SB_PAGELEFT:
  192.  
  193. // nPage分減らす.
  194. m_ScrollInfo.nPos -= m_ScrollInfo.nPage;
  195. break;
  196.  
  197. // 1ページ右
  198. case SB_PAGERIGHT:
  199.  
  200. // nPage分増やす.
  201. m_ScrollInfo.nPos += m_ScrollInfo.nPage;
  202. break;
  203.  
  204. // つまみをドラッグ中.
  205. case SB_THUMBTRACK:
  206.  
  207. // 引数のnPosをセット
  208. m_ScrollInfo.nPos = nPos;
  209. break;
  210.  
  211. // つまみをドラッグ後.
  212. case SB_THUMBPOSITION:
  213.  
  214. // 引数のnPosをセット
  215. m_ScrollInfo.nPos = nPos;
  216. break;
  217.  
  218. // それ以外.
  219. default:
  220.  
  221. break;
  222.  
  223. }
  224.  
  225. // スクロール情報設定.
  226. SetScrollInfo(m_hWnd, SB_HORZ, &m_ScrollInfo, TRUE);
  227. // メンバにもセット.
  228. m_iHScrollPos = m_ScrollInfo.nPos;
  229. // 無効領域を作成して画面の更新.
  230. InvalidateRect(m_hWnd, NULL, TRUE); // InvalidateRectで無効領域作成.
  231.  
  232. }
  233.  
  234. // 垂直方向スクロールバーイベント時のハンドラOnVScroll.
  235. void CPictureBox::OnVScroll(UINT nSBCode, UINT nPos) {
  236.  
  237. // スクロール情報取得.
  238. m_ScrollInfo.fMask = SIF_POS; // 位置だけ変更モード(これがないと, スクロールバーが元の位置に戻ってしまうので注意!こっちが前!)
  239. GetScrollInfo(m_hWnd, SB_VERT, &m_ScrollInfo); // マスクを設定してからGetScrollInfo.(こっちが後!)
  240.  
  241. // スクロールバー処理.
  242. switch (nSBCode) { // nSBCodeごとに振り分け.
  243.  
  244. // 一番上
  245. case SB_TOP:
  246.  
  247. // 位置を最小値に.
  248. m_ScrollInfo.nPos = m_ScrollInfo.nMin;
  249. break;
  250.  
  251. // 一番下
  252. case SB_BOTTOM:
  253.  
  254. // 位置を最大値に.
  255. m_ScrollInfo.nPos = m_ScrollInfo.nMax;
  256. break;
  257.  
  258. // 1行上
  259. case SB_LINEUP:
  260.  
  261. // nPosが0でなければデクリメント.
  262. if (m_ScrollInfo.nPos > 0) {
  263. m_ScrollInfo.nPos--;
  264. }
  265. break;
  266.  
  267. // 1行下
  268. case SB_LINEDOWN:
  269.  
  270. // nPosが最大値-1でなければインクリメント.
  271. if (m_ScrollInfo.nPos < m_ScrollInfo.nMax - 1) {
  272. m_ScrollInfo.nPos++;
  273. }
  274. break;
  275.  
  276. // 1ページ上
  277. case SB_PAGEUP:
  278.  
  279. // nPage分減らす.
  280. m_ScrollInfo.nPos -= m_ScrollInfo.nPage;
  281. break;
  282.  
  283. // 1ページ下
  284. case SB_PAGEDOWN:
  285.  
  286. // nPage分増やす.
  287. m_ScrollInfo.nPos += m_ScrollInfo.nPage;
  288. break;
  289.  
  290. // つまみをドラッグ中.
  291. case SB_THUMBTRACK:
  292.  
  293. // 引数のnPosをセット
  294. m_ScrollInfo.nPos = nPos;
  295. break;
  296.  
  297. // つまみをドラッグ後.
  298. case SB_THUMBPOSITION:
  299.  
  300. // 引数のnPosをセット
  301. m_ScrollInfo.nPos = nPos;
  302. break;
  303.  
  304. // それ以外.
  305. default:
  306.  
  307. break;
  308.  
  309. }
  310.  
  311. // スクロール情報設定.
  312. SetScrollInfo(m_hWnd, SB_VERT, &m_ScrollInfo, TRUE);
  313. // メンバにもセット.
  314. m_iVScrollPos = m_ScrollInfo.nPos;
  315. // 無効領域を作成して画面の更新.
  316. InvalidateRect(m_hWnd, NULL, TRUE); // InvalidateRectで無効領域作成.
  317.  
  318. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement