诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

360 lines
8.7 KiB

  1. #include "StdAfx.h"
  2. #include "GameLogic.h"
  3. #include "ControlWnd.h"
  4. #include "CardControl.h"
  5. //////////////////////////////////////////////////////////////////////////
  6. //按钮标识
  7. #define IDC_CHIHU 100 //吃胡按钮
  8. #define IDC_LISTEN 101 //听牌按钮
  9. #define IDC_GIVEUP 102 //放弃按钮
  10. //位置标识
  11. #define ITEM_WIDTH 90 //子项宽度
  12. #define ITEM_HEIGHT 55 //子项高度
  13. #define CONTROL_WIDTH 173 //控制宽度
  14. #define CONTROL_HEIGHT 41 //控制高度
  15. //////////////////////////////////////////////////////////////////////////
  16. BEGIN_MESSAGE_MAP(CControlWnd, CWnd)
  17. ON_WM_PAINT()
  18. ON_WM_CREATE()
  19. ON_WM_SETCURSOR()
  20. ON_WM_LBUTTONDOWN()
  21. ON_BN_CLICKED(IDC_CHIHU, OnChiHu)
  22. ON_BN_CLICKED(IDC_LISTEN, OnListen)
  23. ON_BN_CLICKED(IDC_GIVEUP, OnGiveUp)
  24. END_MESSAGE_MAP()
  25. //////////////////////////////////////////////////////////////////////////
  26. //构造函数
  27. CControlWnd::CControlWnd()
  28. {
  29. //配置变量
  30. m_cbActionMask=0;
  31. m_cbCenterCard=0;
  32. m_PointBenchmark.SetPoint(0,0);
  33. ZeroMemory(m_cbGangCard,sizeof(m_cbGangCard));
  34. //状态变量
  35. m_cbItemCount=0;
  36. m_cbCurrentItem=0xFF;
  37. //加载资源
  38. HINSTANCE hInstance=AfxGetInstanceHandle();
  39. m_ImageControlTop.LoadFromResource(hInstance, IDB_CONTROL_TOP);
  40. m_ImageControlMid.LoadFromResource(hInstance, IDB_CONTROL_MID);
  41. m_ImageControlButtom.LoadFromResource(hInstance, IDB_CONTROL_BOTTOM);
  42. m_ImageActionExplain.LoadFromResource(hInstance, IDB_ACTION_EXPLAIN);
  43. return;
  44. }
  45. //析构函数
  46. CControlWnd::~CControlWnd()
  47. {
  48. }
  49. //基准位置
  50. void CControlWnd::SetBenchmarkPos(int nXPos, int nYPos)
  51. {
  52. //位置变量
  53. m_PointBenchmark.SetPoint(nXPos,nYPos);
  54. //调整控件
  55. RectifyControl();
  56. return;
  57. }
  58. //设置扑克
  59. void CControlWnd::SetControlInfo(BYTE cbCenterCard, BYTE cbActionMask, tagGangCardResult & GangCardResult)
  60. {
  61. //设置变量
  62. m_cbItemCount=0;
  63. m_cbCurrentItem=0xFF;
  64. m_cbActionMask=cbActionMask;
  65. m_cbCenterCard=cbCenterCard;
  66. //杠牌信息
  67. ZeroMemory(m_cbGangCard,sizeof(m_cbGangCard));
  68. for (BYTE i=0;i<GangCardResult.cbCardCount;i++)
  69. {
  70. m_cbItemCount++;
  71. m_cbGangCard[i]=GangCardResult.cbCardData[i];
  72. }
  73. //计算数目
  74. BYTE cbItemKind[4]={WIK_LEFT,WIK_CENTER,WIK_RIGHT,WIK_PENG};
  75. for (BYTE i=0;i<CountArray(cbItemKind);i++)
  76. if ((m_cbActionMask&cbItemKind[i])!=0)
  77. m_cbItemCount++;
  78. //按钮控制
  79. m_btChiHu.EnableWindow(cbActionMask&WIK_CHI_HU);
  80. //m_btListen.EnableWindow(cbActionMask&WIK_LISTEN);
  81. //调整控件
  82. RectifyControl();
  83. //显示窗口
  84. ShowWindow(SW_SHOW);
  85. return;
  86. }
  87. //调整控件
  88. void CControlWnd::RectifyControl()
  89. {
  90. //设置位置
  91. CRect rcRect;
  92. rcRect.right=m_PointBenchmark.x;
  93. rcRect.bottom=m_PointBenchmark.y;
  94. rcRect.left=m_PointBenchmark.x-CONTROL_WIDTH;
  95. rcRect.top=m_PointBenchmark.y-ITEM_HEIGHT*m_cbItemCount-CONTROL_HEIGHT;
  96. if (m_cbItemCount>0)
  97. rcRect.top-=5;
  98. //移动窗口
  99. MoveWindow(&rcRect);
  100. //调整按钮
  101. CRect rcButton;
  102. m_btChiHu.GetWindowRect(&rcButton);
  103. int nYPos=rcRect.Height()-rcButton.Height()-9;
  104. m_btChiHu.SetWindowPos(NULL,rcRect.Width()-rcButton.Width()*3-14,nYPos,0,0,SWP_NOZORDER|SWP_NOSIZE);
  105. m_btListen.SetWindowPos(NULL,rcRect.Width()-rcButton.Width()*2-11,nYPos,0,0,SWP_NOZORDER|SWP_NOSIZE);
  106. m_btGiveUp.SetWindowPos(NULL,rcRect.Width()-rcButton.Width()-8,nYPos,0,0,SWP_NOZORDER|SWP_NOSIZE);
  107. return;
  108. }
  109. //吃胡按钮
  110. void CControlWnd::OnChiHu()
  111. {
  112. CGameFrameView::GetInstance()->SendEngineMessage(IDM_CARD_OPERATE,WIK_CHI_HU,0);
  113. return;
  114. }
  115. //听牌按钮
  116. void CControlWnd::OnListen()
  117. {
  118. CGameFrameView::GetInstance()->SendEngineMessage(IDM_LISTEN_CARD,0,0);
  119. return;
  120. }
  121. //放弃按钮
  122. void CControlWnd::OnGiveUp()
  123. {
  124. CGameFrameView::GetInstance()->SendEngineMessage(IDM_CARD_OPERATE,WIK_NULL,0);
  125. return;
  126. }
  127. //重画函数
  128. void CControlWnd::OnPaint()
  129. {
  130. CPaintDC dc(this);
  131. //获取位置
  132. CRect rcClient;
  133. GetClientRect(&rcClient);
  134. //创建缓冲
  135. CDC BufferDC;
  136. CBitmap BufferImage;
  137. BufferDC.CreateCompatibleDC(&dc);
  138. BufferImage.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
  139. BufferDC.SelectObject(&BufferImage);
  140. //绘画背景
  141. m_ImageControlTop.BitBlt(BufferDC,0,0);
  142. for (int nImageYPos=m_ImageControlTop.GetHeight();nImageYPos<rcClient.Height();nImageYPos+=m_ImageControlMid.GetHeight())
  143. {
  144. m_ImageControlMid.BitBlt(BufferDC,0,nImageYPos);
  145. }
  146. m_ImageControlButtom.BitBlt(BufferDC,0,rcClient.Height()-m_ImageControlButtom.GetHeight());
  147. //变量定义
  148. int nYPos=5;
  149. BYTE cbCurrentItem=0;
  150. BYTE cbExcursion[3]={0,1,2};
  151. BYTE cbItemKind[4]={WIK_LEFT,WIK_CENTER,WIK_RIGHT,WIK_PENG};
  152. //绘画扑克
  153. for (BYTE i=0;i<CountArray(cbItemKind);i++)
  154. {
  155. if ((m_cbActionMask&cbItemKind[i])!=0)
  156. {
  157. //绘画扑克
  158. for (BYTE j=0;j<3;j++)
  159. {
  160. BYTE cbCardData=m_cbCenterCard;
  161. if (i<CountArray(cbExcursion))
  162. cbCardData=m_cbCenterCard+j-cbExcursion[i];
  163. g_CardResource.m_ImageTableBottom.DrawCardItem(&BufferDC,cbCardData,j*26+12,nYPos+5);
  164. }
  165. //计算位置
  166. int nXImagePos=0;
  167. int nItemWidth=m_ImageActionExplain.GetWidth()/7;
  168. if ((m_cbActionMask&cbItemKind[i])&WIK_PENG)
  169. nXImagePos=nItemWidth;
  170. //绘画标志
  171. int nItemHeight=m_ImageActionExplain.GetHeight();
  172. m_ImageActionExplain.BitBlt(BufferDC,126,nYPos+5,nItemWidth,nItemHeight,nXImagePos,0);
  173. //绘画边框
  174. if (cbCurrentItem==m_cbCurrentItem)
  175. {
  176. BufferDC.Draw3dRect(7,nYPos,rcClient.Width()-14,ITEM_HEIGHT,RGB(255,255,0),RGB(255,255,0));
  177. }
  178. //设置变量
  179. ++cbCurrentItem;
  180. nYPos+=ITEM_HEIGHT;
  181. }
  182. }
  183. //杠牌扑克
  184. for (BYTE i=0;i<CountArray(m_cbGangCard);i++)
  185. {
  186. if (m_cbGangCard[i]!=0)
  187. {
  188. //绘画扑克
  189. for (BYTE j=0;j<4;j++)
  190. {
  191. g_CardResource.m_ImageTableBottom.DrawCardItem(&BufferDC,m_cbGangCard[i],j*26+12,nYPos+5);
  192. }
  193. //绘画边框
  194. if (cbCurrentItem==m_cbCurrentItem)
  195. {
  196. BufferDC.Draw3dRect(7,nYPos,rcClient.Width()-14,ITEM_HEIGHT,RGB(255,255,0),RGB(255,255,0));
  197. }
  198. //绘画标志
  199. int nItemWidth=m_ImageActionExplain.GetWidth()/7;
  200. int nItemHeight=m_ImageActionExplain.GetHeight();
  201. m_ImageActionExplain.BitBlt(BufferDC,126,nYPos+5,nItemWidth,nItemHeight,nItemWidth*3,0);
  202. //设置变量
  203. cbCurrentItem++;
  204. nYPos+=ITEM_HEIGHT;
  205. }
  206. else
  207. break;
  208. }
  209. //绘画界面
  210. dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&BufferDC,0,0,SRCCOPY);
  211. //清理资源
  212. BufferDC.DeleteDC();
  213. BufferImage.DeleteObject();
  214. return;
  215. }
  216. //建立消息
  217. int CControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  218. {
  219. if (__super::OnCreate(lpCreateStruct)==-1) return -1;
  220. //创建按钮
  221. CRect rcCreate(0,0,0,0);
  222. m_btListen.Create(NULL,WS_CHILD|WS_VISIBLE,rcCreate,this,IDC_LISTEN);
  223. m_btGiveUp.Create(NULL,WS_CHILD|WS_VISIBLE,rcCreate,this,IDC_GIVEUP);
  224. m_btChiHu.Create(NULL,WS_CHILD|WS_VISIBLE|WS_DISABLED,rcCreate,this,IDC_CHIHU);
  225. //设置位图
  226. m_btChiHu.SetButtonImage(IDB_BT_CHIHU,AfxGetInstanceHandle(),false,false);
  227. //m_btListen.SetButtonImage(IDB_BT_LISTEN,AfxGetInstanceHandle(),false);
  228. m_btGiveUp.SetButtonImage(IDB_BT_GIVEUP,AfxGetInstanceHandle(),false,false);
  229. return 0;
  230. }
  231. //鼠标消息
  232. void CControlWnd::OnLButtonDown(UINT nFlags, CPoint Point)
  233. {
  234. __super::OnLButtonDown(nFlags, Point);
  235. //索引判断
  236. if (m_cbCurrentItem!=0xFF)
  237. {
  238. //变量定义
  239. BYTE cbIndex=0;
  240. BYTE cbItemKind[4]={WIK_LEFT,WIK_CENTER,WIK_RIGHT,WIK_PENG};
  241. //类型子项
  242. for (BYTE i=0;i<CountArray(cbItemKind);i++)
  243. {
  244. if (((m_cbActionMask&cbItemKind[i])!=0)&&(m_cbCurrentItem==cbIndex++))
  245. {
  246. CGameFrameView::GetInstance()->SendEngineMessage(IDM_CARD_OPERATE,cbItemKind[i],m_cbCenterCard);
  247. return;
  248. }
  249. }
  250. //杠牌子项
  251. for (BYTE i=0;i<CountArray(m_cbGangCard);i++)
  252. {
  253. if ((m_cbGangCard[i]!=0)&&(m_cbCurrentItem==cbIndex++))
  254. {
  255. CGameFrameView::GetInstance()->SendEngineMessage(IDM_CARD_OPERATE,WIK_GANG,m_cbGangCard[i]);
  256. return;
  257. }
  258. }
  259. //错误断言
  260. ASSERT(FALSE);
  261. }
  262. return;
  263. }
  264. //光标消息
  265. BOOL CControlWnd::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT uMessage)
  266. {
  267. //位置测试
  268. if (m_cbItemCount!=0)
  269. {
  270. //获取位置
  271. CRect rcClient;
  272. CPoint MousePoint;
  273. GetClientRect(&rcClient);
  274. GetCursorPos(&MousePoint);
  275. ScreenToClient(&MousePoint);
  276. //计算索引
  277. BYTE bCurrentItem=0xFF;
  278. CRect rcItem(5,5,rcClient.Width()-5,ITEM_HEIGHT*m_cbItemCount+5);
  279. if (rcItem.PtInRect(MousePoint))
  280. bCurrentItem=(BYTE)((MousePoint.y-7)/ITEM_HEIGHT);
  281. //设置索引
  282. if (m_cbCurrentItem!=bCurrentItem)
  283. {
  284. Invalidate(FALSE);
  285. m_cbCurrentItem=bCurrentItem;
  286. }
  287. //设置光标
  288. if (m_cbCurrentItem!=0xFF)
  289. {
  290. SetCursor(LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CARD_CUR)));
  291. return TRUE;
  292. }
  293. }
  294. return __super::OnSetCursor(pWnd,nHitTest,uMessage);
  295. }
  296. //////////////////////////////////////////////////////////////////////////