skyblue_PinTuView.cpp
上传用户:hbrsgg1
上传日期:2014-05-08
资源大小:2826k
文件大小:7k
源码类别:

其他智力游戏

开发平台:

C/C++

  1. /*++
  2. Copyright (c) AFE(Active-Free-Elegance)
  3. Module Name:
  4.     skyblue_PinTuView.cpp
  5. Abstract:
  6. View , manage drawing 
  7. Author:
  8.     Weijian Luo (Arthur Luo)   15-Jun-2005
  9. E-mail: skybluehacker@yahoo.com.cn
  10. Revision History:      1.0
  11. --*/
  12. #include "stdafx.h"
  13. #include "skyblue_PinTu.h"
  14. #include "skyblue_PinTuDoc.h"
  15. #include "skyblue_PinTuView.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CSkyblue_PinTuView
  23. IMPLEMENT_DYNCREATE(CSkyblue_PinTuView, CView)
  24. BEGIN_MESSAGE_MAP(CSkyblue_PinTuView, CView)
  25. //{{AFX_MSG_MAP(CSkyblue_PinTuView)
  26. ON_WM_LBUTTONDOWN()
  27. ON_WM_KEYDOWN()
  28. ON_WM_SHOWWINDOW()
  29. ON_WM_SETFOCUS()
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CSkyblue_PinTuView construction/destruction
  34. CSkyblue_PinTuView::CSkyblue_PinTuView()
  35. {
  36. // TODO: add construction code here
  37. m_bFirstRun = TRUE;
  38. }
  39. CSkyblue_PinTuView::~CSkyblue_PinTuView()
  40. {
  41. }
  42. BOOL CSkyblue_PinTuView::PreCreateWindow(CREATESTRUCT& cs)
  43. {
  44. // TODO: Modify the Window class or styles here by modifying
  45. //  the CREATESTRUCT cs
  46. return CView::PreCreateWindow(cs);
  47. }
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CSkyblue_PinTuView drawing
  50. void CSkyblue_PinTuView::OnDraw(CDC* pDC)
  51. {
  52. //a.获取文档数据控制权
  53. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  54. //b.使用内存设备环境memDC
  55. //  与内存环境关联的内存位图memBmp
  56. CDC memDC;
  57. memDC.CreateCompatibleDC(pDC);
  58. CBitmap memBmp;
  59. memBmp.CreateCompatibleBitmap(pDC,
  60. pDoc->m_bmpWidth,pDoc->m_bmpHeight);
  61. memDC.SelectObject(&memBmp);
  62. //c. 将图像绘制到内存位图memBmp中
  63. //1.绘制游戏所有当前散乱的方块
  64. DrawGameBlocks(&memDC);
  65. //2.绘制空白方块
  66. DrawBlankBlock(&memDC);
  67. //3.绘制边界间隔线条
  68. DrawLines(&memDC);
  69. //d.整幅图从内存memBmp拷贝到屏幕
  70. pDC->BitBlt(0,0,pDoc->m_bmpWidth,pDoc->m_bmpHeight,
  71. &memDC,0,0,SRCCOPY);
  72. }
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CSkyblue_PinTuView diagnostics
  75. #ifdef _DEBUG
  76. void CSkyblue_PinTuView::AssertValid() const
  77. {
  78. CView::AssertValid();
  79. }
  80. void CSkyblue_PinTuView::Dump(CDumpContext& dc) const
  81. {
  82. CView::Dump(dc);
  83. }
  84. #endif //_DEBUG
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CSkyblue_PinTuView message handlers
  87. //
  88. //  绘制方块间的边界线
  89. //
  90. void CSkyblue_PinTuView::DrawLines(CDC *pDC)
  91. {
  92. //创建并设定铅笔的样式
  93. CPen linePen;
  94. linePen.CreatePen(PS_SOLID, 3, RGB(255,0,0));
  95. CPen *pOldPen = pDC->SelectObject(&linePen);
  96. //获取文档核心数据访问权
  97. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  98. int i;
  99. //竖向线绘制
  100. for(i=1;i<pDoc->hnums;i++)
  101. {
  102. pDC->MoveTo(i*pDoc->m_cellWidth-1,0);
  103. pDC->LineTo(i*pDoc->m_cellWidth-1,pDoc->m_bmpHeight);
  104. }
  105. //横向线绘制
  106. for(i=1;i<pDoc->vnums;i++)
  107. {
  108. pDC->MoveTo(0,i*pDoc->m_cellHeight-1);
  109. pDC->LineTo(pDoc->m_bmpWidth,i*pDoc->m_cellHeight-1);
  110. }
  111. //设备恢复
  112. pDC->SelectObject(pOldPen);
  113. }
  114. //
  115. //  绘制空白方块
  116. //
  117. void CSkyblue_PinTuView::DrawBlankBlock(CDC *pDC)
  118. {
  119. //获取文档核心数据访问权
  120. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  121. //计算出矩形区域位置
  122. RECT rc;
  123. rc.left =(pDoc->m_blankPos.row-1)*pDoc->m_cellWidth;
  124. rc.top =(pDoc->m_blankPos.col -1)*pDoc->m_cellHeight;
  125. rc.right=rc.left +pDoc->m_cellWidth;
  126. rc.bottom =rc.top +pDoc->m_cellHeight;
  127. //矩形区域填充
  128. pDC->FillSolidRect(&rc,RGB(153,153,153));
  129. }
  130. //
  131. //  绘制某cell单元方块
  132. //
  133. void CSkyblue_PinTuView::DrawCellBlock(CDC *pDC, pos destPos, pos srcPos)
  134. {
  135. //获取文档核心数据访问权
  136. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  137. //使用内存DC,宣布与当前位图关联
  138. //以便为下面提供拷贝的数据源(位图)
  139. CDC memdc;
  140. memdc.CreateCompatibleDC(pDC);
  141. memdc.SelectObject(pDoc->m_bitmap);
  142. //根据源方块的位置和目标放开位置(当前方块实际位置)
  143. //进行拷贝
  144. pDC->BitBlt((destPos.row-1)*pDoc->m_cellWidth,
  145. (destPos.col-1)*pDoc->m_cellHeight,
  146. pDoc->m_cellWidth,pDoc->m_cellHeight,&memdc,
  147. (srcPos.row-1)*pDoc->m_cellWidth,
  148. (srcPos.col-1)*pDoc->m_cellHeight,SRCCOPY);
  149. }
  150. //
  151. //  绘制游戏所有当前散乱的方块
  152. //
  153. void CSkyblue_PinTuView::DrawGameBlocks(CDC *pDC)
  154. {
  155. //获取文档核心数据访问权
  156. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  157. int i;
  158. int j;
  159. pos destPos; //目标位置
  160. pos srcPos;  //图像在源位图的位置
  161. //将所有方块逐个拷贝
  162. for(i = 1;i<=pDoc->hnums;i++)
  163. {
  164. for(j = 1;j<=pDoc->vnums;j++)
  165. {
  166. srcPos.row = pDoc->m_map[i][j].row;
  167. srcPos.col = pDoc->m_map[i][j].col;
  168. destPos.row = i;
  169. destPos.col = j;
  170. DrawCellBlock(pDC,destPos, srcPos);
  171. }
  172. }
  173. }
  174. //
  175. //  处理键盘消息
  176. //
  177. void CSkyblue_PinTuView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  178. {
  179. //响应视图区域的键盘事件,然后交给文档作数据运算处理
  180. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  181. pDoc->OnKeyDown(nChar,nRepCnt,nFlags);
  182. CView::OnKeyDown(nChar, nRepCnt, nFlags);
  183. }
  184. //
  185. //  处理鼠标左键消息
  186. //
  187. void CSkyblue_PinTuView::OnLButtonDown(UINT nFlags, CPoint point) 
  188. {
  189. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  190. //计算出鼠标点击所在的cell方块位置
  191. pos DownPos;
  192. DownPos.row =point.x/pDoc->m_cellWidth+1;
  193. DownPos.col =point.y/pDoc->m_cellHeight+1;
  194. //根据当前空白方块位置将鼠标点击其相邻方块的情况
  195. //转换成键盘输入提交给文档document作数据运算处理
  196. if(abs(DownPos.row-pDoc->m_blankPos.row)+abs(DownPos.col-pDoc->m_blankPos.col)==1)
  197. {
  198. if(DownPos.row - pDoc->m_blankPos.row == 1)
  199. {
  200. pDoc->OnKeyDown(VK_RIGHT,0,0);
  201. }
  202.         if(DownPos.row - pDoc->m_blankPos.row == -1)
  203. {
  204. pDoc->OnKeyDown(VK_LEFT,0,0);
  205. }
  206. if(DownPos.col - pDoc->m_blankPos.col == 1)
  207. {
  208. pDoc->OnKeyDown(VK_DOWN,0,0);
  209. }
  210. if(DownPos.col - pDoc->m_blankPos.col == -1)
  211. {
  212. pDoc->OnKeyDown(VK_UP,0,0);
  213. }
  214. }
  215. }
  216. //响应Document的UpdateAllViews()
  217. void CSkyblue_PinTuView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  218. {
  219. Invalidate(FALSE);
  220. }
  221. void CSkyblue_PinTuView::OnShowWindow(BOOL bShow, UINT nStatus) 
  222. {
  223. CView::OnShowWindow(bShow, nStatus);
  224. /*
  225. if(m_bFirstRun)
  226. {
  227. m_bFirstRun = FALSE;
  228. //获取文档核心数据访问权
  229. CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
  230. pDoc->OnNewgame();
  231. }
  232. */
  233. }
  234. void CSkyblue_PinTuView::OnSetFocus(CWnd* pOldWnd) 
  235. {
  236. CView::OnSetFocus(pOldWnd);
  237. // TODO: Add your message handler code here
  238. }