Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.58 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. ReleaseDC(m_hWnd, hDC); // ReleaseDCでデバイスコンテキスト解放.
  94.  
  95. }
  96.  
  97. // ウィンドウの描画を要求された時のハンドラOnPaint.
  98. void CPictureBox::OnPaint() {
  99.  
  100. // 変数の宣言
  101. HDC hDC; // デバイスコンテキストハンドルHDC型hDC.
  102. PAINTSTRUCT ps; // PAINTSTRUCT構造体変数ps.
  103. HBITMAP hOld; // 以前のビットマップハンドルhOld.
  104. int iDrawWidth; // 実際の描画幅.
  105. int iDrawHeight; // 実際の描画高さ.
  106.  
  107. // 描画開始.
  108. hDC = BeginPaint(m_hWnd, &ps); // BeginPaintで描画開始.
  109.  
  110. // ビットマップの選択.
  111. hOld = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); // SelectObjectでm_hBitmapを選択.
  112.  
  113. // ビット転送による描画.
  114. iDrawWidth = m_iWidth - SCROLLBAR_THICKNESS; // 実際にはコントロール幅 - スクロールバーの厚さ.
  115. iDrawHeight = m_iHeight - SCROLLBAR_THICKNESS; // 実際にはコントロール高さ - スクロールバーの厚さ.
  116. //BitBlt(hDC, 0, m_iHeight - m_ScrollInfo.nPos, iDrawWidth, m_ScrollInfo.nPos, m_hMemDC, 0, 0, SRCCOPY); // BitBltでm_hMemDCからhDCにビット転送することで描画される.
  117. BitBlt(hDC, 0, 0, iDrawWidth, iDrawHeight, m_hMemDC, 0, 0, SRCCOPY);
  118. BitBlt(hDC, 0, iDrawHeight - m_ScrollInfo.nPos, iDrawWidth, m_ScrollInfo.nPos, m_hMemDC, 0, iDrawHeight, SRCCOPY);
  119.  
  120. // 古いビットマップを再選択して戻す.
  121. SelectObject(m_hMemDC, hOld); // SelectObjectでhOldを選択.
  122.  
  123. // スクロールバー設定.
  124. // 横
  125. ZeroMemory(&m_ScrollInfo, sizeof(SCROLLINFO));
  126. m_ScrollInfo.cbSize = sizeof(SCROLLINFO); // サイズをセット.
  127. m_ScrollInfo.fMask = SIF_PAGE | SIF_RANGE; // フラグをセット.
  128. m_ScrollInfo.nPage = m_iWidth; // 幅をセット.
  129. m_ScrollInfo.nMin = 0; // 最小値をセット.
  130. m_ScrollInfo.nMax = m_iPictureWidth; // 最大値をセット.
  131. SetScrollInfo(m_hWnd, SB_HORZ, &m_ScrollInfo, FALSE); // SetScrollInfoでセット.
  132. // 縦
  133. ZeroMemory(&m_ScrollInfo, sizeof(SCROLLINFO));
  134. m_ScrollInfo.cbSize = sizeof(SCROLLINFO); // サイズをセット.
  135. m_ScrollInfo.fMask = SIF_PAGE | SIF_RANGE; // フラグをセット.
  136. m_ScrollInfo.nPage = m_iHeight; // 高さをセット.
  137. m_ScrollInfo.nMin = 0; // 最小値をセット.
  138. m_ScrollInfo.nMax = m_iPictureHeight; // 最大値をセット.
  139. SetScrollInfo(m_hWnd, SB_VERT, &m_ScrollInfo, FALSE); // SetScrollInfoでセット.
  140.  
  141. // 描画終了.
  142. EndPaint(m_hWnd, &ps); // EndPaintで描画終了.
  143.  
  144. }
  145.  
  146. // 水平方向スクロールバーイベント時のハンドラOnHScroll.
  147. void CPictureBox::OnHScroll(UINT nSBCode, UINT nPos) {
  148.  
  149. // スクロール情報取得.
  150. GetScrollInfo(m_hWnd, SB_HORZ, &m_ScrollInfo);
  151. m_ScrollInfo.fMask = SIF_POS; // 位置だけ変更モード(これがないと, スクロールバーが元の位置に戻ってしまうので注意!)
  152.  
  153. // スクロールバー処理.
  154. switch (nSBCode) { // nSBCodeごとに振り分け.
  155.  
  156. // 一番左
  157. case SB_LEFT:
  158.  
  159. // 位置を最小値に.
  160. m_ScrollInfo.nPos = m_ScrollInfo.nMin;
  161. break;
  162.  
  163. // 一番右
  164. case SB_RIGHT:
  165.  
  166. // 位置を最大値に.
  167. m_ScrollInfo.nPos = m_ScrollInfo.nMax;
  168. break;
  169.  
  170. // 1列左
  171. case SB_LINELEFT:
  172.  
  173. // nPosが0でなければデクリメント.
  174. if (m_ScrollInfo.nPos > 0) {
  175. m_ScrollInfo.nPos--;
  176. }
  177. break;
  178.  
  179. // 1列右
  180. case SB_LINERIGHT:
  181.  
  182. // nPosが最大値-1でなければインクリメント.
  183. if (m_ScrollInfo.nPos < m_ScrollInfo.nMax - 1) {
  184. m_ScrollInfo.nPos++;
  185. }
  186. break;
  187.  
  188. // 1ページ左
  189. case SB_PAGELEFT:
  190.  
  191. // nPage分減らす.
  192. m_ScrollInfo.nPos -= m_ScrollInfo.nPage;
  193. break;
  194.  
  195. // 1ページ右
  196. case SB_PAGERIGHT:
  197.  
  198. // nPage分増やす.
  199. m_ScrollInfo.nPos += m_ScrollInfo.nPage;
  200. break;
  201.  
  202. // つまみをドラッグ中.
  203. case SB_THUMBTRACK:
  204.  
  205. // 引数のnPosをセット
  206. m_ScrollInfo.nPos = nPos;
  207. break;
  208.  
  209. // つまみをドラッグ後.
  210. case SB_THUMBPOSITION:
  211.  
  212. // 引数のnPosをセット
  213. m_ScrollInfo.nPos = nPos;
  214. break;
  215.  
  216. // それ以外.
  217. default:
  218.  
  219. break;
  220.  
  221. }
  222.  
  223. // スクロール情報設定.
  224. SetScrollInfo(m_hWnd, SB_HORZ, &m_ScrollInfo, TRUE);
  225.  
  226. }
  227.  
  228. // 垂直方向スクロールバーイベント時のハンドラOnVScroll.
  229. void CPictureBox::OnVScroll(UINT nSBCode, UINT nPos) {
  230.  
  231. // スクロール情報取得.
  232. m_ScrollInfo.fMask = SIF_POS; // 位置だけ変更モード(これがないと, スクロールバーが元の位置に戻ってしまうので注意!こっちが前!)
  233. GetScrollInfo(m_hWnd, SB_VERT, &m_ScrollInfo); // マスクを設定してからGetScrollInfo.(こっちが後!)
  234. int dy = 0; // 変化量dyを0に初期化,
  235.  
  236. // スクロールバー処理.
  237. switch (nSBCode) { // nSBCodeごとに振り分け.
  238.  
  239. // 一番上
  240. case SB_TOP:
  241.  
  242. // 位置を最小値に.
  243. m_ScrollInfo.nPos = m_ScrollInfo.nMin;
  244. break;
  245.  
  246. // 一番下
  247. case SB_BOTTOM:
  248.  
  249. // 位置を最大値に.
  250. m_ScrollInfo.nPos = m_ScrollInfo.nMax;
  251. break;
  252.  
  253. // 1行上
  254. case SB_LINEUP:
  255.  
  256. // nPosが0でなければデクリメント.
  257. if (m_ScrollInfo.nPos > 0) {
  258. m_ScrollInfo.nPos--;
  259. }
  260. dy = -1;
  261. break;
  262.  
  263. // 1行下
  264. case SB_LINEDOWN:
  265.  
  266. // nPosが最大値-1でなければインクリメント.
  267. if (m_ScrollInfo.nPos < m_ScrollInfo.nMax - 1) {
  268. m_ScrollInfo.nPos++;
  269. }
  270. dy = 1;
  271. break;
  272.  
  273. // 1ページ上
  274. case SB_PAGEUP:
  275.  
  276. // nPage分減らす.
  277. m_ScrollInfo.nPos -= m_ScrollInfo.nPage;
  278. dy = -1 * m_ScrollInfo.nPage;
  279. break;
  280.  
  281. // 1ページ下
  282. case SB_PAGEDOWN:
  283.  
  284. // nPage分増やす.
  285. m_ScrollInfo.nPos += m_ScrollInfo.nPage;
  286. dy = 1 * m_ScrollInfo.nPage;
  287. break;
  288.  
  289. // つまみをドラッグ中.
  290. case SB_THUMBTRACK:
  291.  
  292. // 引数のnPosをセット
  293. dy = nPos - m_ScrollInfo.nPos;
  294. m_ScrollInfo.nPos = nPos;
  295. break;
  296.  
  297. // つまみをドラッグ後.
  298. case SB_THUMBPOSITION:
  299.  
  300. // 引数のnPosをセット
  301. //dy = nPos - m_ScrollInfo.nPos;
  302. m_ScrollInfo.nPos = nPos;
  303. break;
  304.  
  305. // それ以外.
  306. default:
  307.  
  308. break;
  309.  
  310. }
  311.  
  312. // スクロール情報設定.
  313. SetScrollInfo(m_hWnd, SB_VERT, &m_ScrollInfo, TRUE);
  314.  
  315. // スクロール
  316. RECT rc; // クリッピングする矩形.
  317. rc.left = 0;
  318. rc.top = 0;
  319. rc.right = m_iWidth;
  320. rc.bottom = m_iHeight;
  321. ScrollWindow(m_hWnd, 0, -dy, NULL, &rc);
  322. //UpdateWindow(m_hWnd);
  323.  
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement