Boxman_EditerWnd.cpp
上传用户:qiangti
上传日期:2022-04-06
资源大小:644k
文件大小:8k
源码类别:

其他智力游戏

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) AFE(Active-Free-Elegance)
  3. Module Name:
  4.     BoxMan_EditWnd.cpp
  5. Abstract:
  6. program's MainFrame 
  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 "BoxMan_Editer.h"
  14. #include "Boxman_EditerWnd.h"
  15. #include "LoadMapDlg.h"
  16. #include <Wingdi.h>
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. extern int MAP_WIDTH; //=                16;
  23. extern int MAP_HEIGHT;  // =             14;
  24. extern int MAP_SMALL_SQUARE_SIZE; // =   20;
  25. //地图状态
  26. #define MAP_BACKGROUP  48  //'0'  
  27. #define MAP_WHITEWALL  49  //'1'
  28. #define MAP_BLUEWALL   50  //'2'
  29. #define MAP_BALL       51  //'3'
  30. #define MAP_YELLOWBOX  52  //'4'
  31. #define MAP_REDBOX     53  //'5'
  32. #define MAP_MANWALL    54  //'6'
  33. #define MAP_MANBALL    55  //'7'
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CBoxman_EditerWnd
  36. IMPLEMENT_DYNCREATE(CBoxman_EditerWnd, CFrameWnd)
  37. CBoxman_EditerWnd::CBoxman_EditerWnd()
  38. {
  39. m_bMouseDown = FALSE;
  40. }
  41. CBoxman_EditerWnd::~CBoxman_EditerWnd()
  42. {
  43. }
  44. BEGIN_MESSAGE_MAP(CBoxman_EditerWnd, CFrameWnd)
  45. //{{AFX_MSG_MAP(CBoxman_EditerWnd)
  46. ON_WM_CREATE()
  47. ON_COMMAND(ID_MENU_MAP_BALL, OnMenuMapBall)
  48. ON_COMMAND(ID_MENU_MAP_BLUEWALL, OnMenuMapBluewall)
  49. ON_COMMAND(ID_MENU_MAP_MAN_WALL_BALL, OnMenuMapManWallBall)
  50. ON_COMMAND(ID_MENU_MAP_WHITEWALL, OnMenuMapWhitewall)
  51. ON_COMMAND(ID_MENU_MAP_YELLOWBOX, OnMenuMapYellowbox)
  52. ON_WM_MOUSEMOVE()
  53. ON_WM_LBUTTONDOWN()
  54. ON_WM_PAINT()
  55. ON_COMMAND(ID_MENU_MAP_BKGROUND, OnMenuMapBkground)
  56. ON_WM_LBUTTONUP()
  57. ON_COMMAND(ID_MENU_SAVE_MAP, OnMenuSaveMap)
  58. ON_COMMAND(ID_MENU_NEW_MAP, OnMenuNewMap)
  59. ON_COMMAND(ID_MENU_LOAD_MAP, OnMenuLoadMap)
  60. //}}AFX_MSG_MAP
  61. END_MESSAGE_MAP()
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CBoxman_EditerWnd drawing
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CBoxman_EditerWnd diagnostics
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CBoxman_EditerWnd message handlers
  68. int CBoxman_EditerWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  69. {
  70. if (CWnd::OnCreate(lpCreateStruct) == -1)
  71. return -1;
  72. //创建工具栏
  73. if (CreateExToolBar() == -1 )
  74. {
  75. MessageBox("创建工具栏失败");
  76. }
  77. return 0;
  78. }
  79. BOOL CBoxman_EditerWnd::CreateExToolBar( void )
  80. {
  81. CImageList img;
  82. CString str;
  83. if (!m_wndToolBar.CreateEx(this))
  84. {
  85. return -1;
  86. }
  87. //设置按钮的宽度和长度
  88. m_wndToolBar.GetToolBarCtrl().SetButtonWidth(40, 100);
  89. //改变属性
  90. m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT |CBRS_TOOLTIPS | 
  91. TBSTYLE_TRANSPARENT|TBBS_CHECKBOX );
  92. //设置按钮数为6
  93. m_wndToolBar.SetButtons(NULL,6);
  94. // 2. 添加图像
  95. //设置"热/hot"状态的的位图
  96. img.Create(28, 28, ILC_COLOR8|ILC_MASK,2,2);
  97. img.SetBkColor(RGB(0, 0, 102));
  98. //顺序增添按键的图标
  99. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_WALL));
  100.     img.Add(AfxGetApp()->LoadIcon(IDR_ICON_PATH));
  101. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_DISTINATION));
  102.     img.Add(AfxGetApp()->LoadIcon(IDR_ICON_BOX));
  103. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_MAN));
  104. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_BACKGROUND)); 
  105. m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
  106. img.Detach();
  107. //设置"冷/cold"状态的位图
  108. img.Create(26, 26, ILC_COLOR8|ILC_MASK, 2,2);
  109. img.SetBkColor(::GetSysColor(COLOR_BTNFACE));
  110. //顺序增添按键的图标
  111. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_WALL));
  112.     img.Add(AfxGetApp()->LoadIcon(IDR_ICON_PATH));
  113. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_DISTINATION));
  114.     img.Add(AfxGetApp()->LoadIcon(IDR_ICON_BOX));
  115. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_MAN)); 
  116. img.Add(AfxGetApp()->LoadIcon(IDR_ICON_BACKGROUND));
  117. m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
  118. img.Detach();
  119. /*
  120. ID_MENU_MAP_WHITEWALL     围墙
  121. ID_MENU_MAP_BLUEWALL      通道
  122. ID_MENU_MAP_BALL          目的点
  123. ID_MENU_MAP_YELLOWBOX     箱子
  124. ID_MENU_MAP_MAN_WALL_BALL 工人
  125. */
  126. //3. 设置文字  
  127. m_wndToolBar.SetButtonInfo(0, ID_MENU_MAP_WHITEWALL, TBSTYLE_BUTTON, 0);
  128. m_wndToolBar.SetButtonText(0, "围墙");
  129. m_wndToolBar.SetButtonInfo(1, ID_MENU_MAP_BLUEWALL, TBSTYLE_BUTTON, 1);
  130. m_wndToolBar.SetButtonText(1, "通道");
  131. m_wndToolBar.SetButtonInfo(2, ID_MENU_MAP_BALL, TBSTYLE_BUTTON,2);
  132. m_wndToolBar.SetButtonText(2, "目的点");
  133. m_wndToolBar.SetButtonInfo(3, ID_MENU_MAP_YELLOWBOX, TBSTYLE_BUTTON,3);
  134. m_wndToolBar.SetButtonText(3, "箱子");
  135. m_wndToolBar.SetButtonInfo(4, ID_MENU_MAP_MAN_WALL_BALL, TBSTYLE_BUTTON, 4);
  136. m_wndToolBar.SetButtonText(4, "工人");
  137. m_wndToolBar.SetButtonInfo(5, ID_MENU_MAP_BKGROUND, TBSTYLE_BUTTON, 5);
  138. m_wndToolBar.SetButtonText(5, "背景");
  139. CRect rectToolBar;
  140. //得到按钮的大小
  141. m_wndToolBar.GetItemRect(0, &rectToolBar);
  142. //设置按钮的大小
  143. m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(26,26));
  144. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  145. //允许停靠
  146. EnableDocking(CBRS_ALIGN_ANY);
  147. //漂浮停靠
  148. CPoint pt(GetSystemMetrics(SM_CXSCREEN)/2+100,GetSystemMetrics(SM_CYSCREEN)/3+100);
  149. FloatControlBar(&m_wndToolBar,pt);
  150. return TRUE;
  151. }
  152. //选中目的地
  153. void CBoxman_EditerWnd::OnMenuMapBall() 
  154. {
  155. m_now_Select = MAP_BALL;
  156. }
  157. //选中通道
  158. void CBoxman_EditerWnd::OnMenuMapBluewall() 
  159. {
  160. m_now_Select = MAP_BLUEWALL;
  161. }
  162. //选中人
  163. void CBoxman_EditerWnd::OnMenuMapManWallBall() 
  164. {
  165. m_now_Select = MAP_MANWALL;
  166. }
  167. //选中墙
  168. void CBoxman_EditerWnd::OnMenuMapWhitewall() 
  169. {
  170. m_now_Select = MAP_WHITEWALL;
  171. }
  172. //选中箱子
  173. void CBoxman_EditerWnd::OnMenuMapYellowbox() 
  174. {
  175. m_now_Select = MAP_YELLOWBOX;
  176. }
  177. //选中背景
  178. void CBoxman_EditerWnd::OnMenuMapBkground() 
  179. {
  180. m_now_Select = MAP_BACKGROUP;
  181. }
  182. void CBoxman_EditerWnd::OnMouseMove(UINT nFlags, CPoint point) 
  183. {
  184. //记录当前的鼠标位置,以便鼠标跟随效果的实现
  185. m_mousePoint = point;
  186. if( m_bMouseDown )
  187. {
  188. int x, y;
  189. x = point.x / MAP_SMALL_SQUARE_SIZE;
  190. y = point.y / MAP_SMALL_SQUARE_SIZE;
  191. m_boxManEdit.ChangeMap(x,y,m_now_Select);
  192. }
  193. Invalidate(FALSE);
  194. CFrameWnd::OnMouseMove(nFlags, point);
  195. }
  196. void CBoxman_EditerWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  197. {
  198. int x,y;
  199. //标识鼠标被按下
  200. m_bMouseDown = TRUE;
  201. //获取鼠标的位置并计算出在地图相应的方块位置
  202. m_mousePoint = point;
  203. x = point.x / MAP_SMALL_SQUARE_SIZE;
  204. y = point.y / MAP_SMALL_SQUARE_SIZE;
  205. //修改地图相应位置的状态
  206. m_boxManEdit.ChangeMap(x,y,m_now_Select);
  207. //通知窗口重绘
  208. Invalidate(FALSE);
  209. CFrameWnd::OnLButtonDown(nFlags, point);
  210. }
  211. void CBoxman_EditerWnd::OnPaint() 
  212. {
  213. CPaintDC dc(this);    // 用以屏幕显示的设备
  214. CDC dcMemory;  // 内存设备
  215. CBitmap bitmap;
  216. CRect m_rcClient;
  217. GetClientRect(&m_rcClient);
  218. if (!dc.IsPrinting()) 
  219. {
  220. // 与dc设备兼容
  221. if (dcMemory.CreateCompatibleDC(&dc))
  222. {
  223. // 使得bitmap与实际显示的设备兼容
  224. if (bitmap.CreateCompatibleBitmap(&dc, m_rcClient.right, m_rcClient.bottom))
  225. {
  226. // 内存设备选择物件-位图
  227. dcMemory.SelectObject(&bitmap);
  228. //绘制地图
  229. m_boxManEdit.DrawMap(&dcMemory);
  230. //绘制鼠标跟随图标
  231. int x = m_mousePoint.x-MAP_SMALL_SQUARE_SIZE/2;
  232. int y = m_mousePoint.y-MAP_SMALL_SQUARE_SIZE/2;
  233. m_boxManEdit.DrawMouseCursor(x,y,m_now_Select,&dcMemory);
  234. // 将内存设备的内容拷贝到实际屏幕显示的设备
  235. dc.BitBlt(m_rcClient.left, m_rcClient.top, m_rcClient.right, m_rcClient.bottom, &dcMemory, 0, 0, SRCCOPY);
  236. bitmap.DeleteObject();
  237. }
  238. }
  239. }
  240. }
  241. void CBoxman_EditerWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  242. {
  243. //记录鼠标状态为释放状态
  244. m_bMouseDown = FALSE;
  245. CFrameWnd::OnLButtonUp(nFlags, point);
  246. }
  247. void CBoxman_EditerWnd::OnMenuSaveMap() 
  248. {
  249. m_boxManEdit.SaveMap();
  250. }
  251. void CBoxman_EditerWnd::OnMenuNewMap() 
  252. {
  253. m_boxManEdit.ClearMap();
  254. }
  255. void CBoxman_EditerWnd::OnMenuLoadMap() 
  256. {
  257. CLoadMapDlg loadMapDlg;
  258. //假若按了确认提交成功后
  259. if(loadMapDlg.DoModal() == IDOK)
  260. {
  261. //提取与编辑框关联的整形变量数值
  262. int iMissionNum = loadMapDlg.m_loadMapNum;
  263. //载入相关地图
  264. m_boxManEdit.LoadMap(iMissionNum);
  265. }
  266. }