诸暨麻将添加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.
 
 
 
 
 
 

1537 regels
40 KiB

  1. #include "StdAfx.h"
  2. #include "Resource.h"
  3. #include "CardControl.h"
  4. //////////////////////////////////////////////////////////////////////////
  5. //宏定义
  6. //公共定义
  7. #define POS_SHOOT 5 //弹起象素
  8. #define POS_SPACE 8 //分隔间隔
  9. #define ITEM_COUNT 28 //子项数目
  10. #define INVALID_ITEM 0xFFFF //无效索引
  11. //扑克大小
  12. #define CARD_WIDTH 45 //扑克宽度
  13. #define CARD_HEIGHT 72 //扑克高度
  14. //////////////////////////////////////////////////////////////////////////
  15. //构造函数
  16. CCardListImage::CCardListImage()
  17. {
  18. //位置变量
  19. m_nItemWidth=0;
  20. m_nItemHeight=0;
  21. m_nViewWidth=0;
  22. m_nViewHeight=0;
  23. return;
  24. }
  25. //析构函数
  26. CCardListImage::~CCardListImage()
  27. {
  28. }
  29. //加载资源
  30. bool CCardListImage::LoadResource(LPCTSTR uResourceID, int nViewWidth, int nViewHeight)
  31. {
  32. //加载资源
  33. //m_CardListImage.LoadFromResource(AfxGetInstanceHandle(),uResourceID);
  34. m_CardListImage.LoadImage(AfxGetInstanceHandle(),uResourceID);
  35. //设置变量
  36. m_nViewWidth=nViewWidth;
  37. m_nViewHeight=nViewHeight;
  38. m_nItemHeight=m_CardListImage.GetHeight();
  39. m_nItemWidth=m_CardListImage.GetWidth()/ITEM_COUNT;
  40. return true;
  41. }
  42. //释放资源
  43. bool CCardListImage::DestroyResource()
  44. {
  45. //设置变量
  46. m_nItemWidth=0;
  47. m_nItemHeight=0;
  48. //释放资源
  49. //m_CardListImage.Destroy();
  50. return true;
  51. }
  52. //获取位置
  53. int CCardListImage::GetImageIndex(BYTE cbCardData)
  54. {
  55. //背景判断
  56. if (cbCardData==0)
  57. return 0;
  58. //计算位置
  59. BYTE cbValue=cbCardData&MASK_VALUE;
  60. BYTE cbColor=(cbCardData&MASK_COLOR)>>4;
  61. return (cbColor>=0x03)?(cbValue+27):(cbColor*9+cbValue);
  62. }
  63. //绘画扑克
  64. bool CCardListImage::DrawCardItem(CDC * pDestDC, BYTE cbCardData, int xDest, int yDest)
  65. {
  66. //效验状态
  67. ASSERT(m_CardListImage.IsNull()==false);
  68. ASSERT((m_nItemWidth!=0)&&(m_nItemHeight!=0));
  69. //绘画子项
  70. if(cbCardData<=0x37)
  71. {
  72. int nImageXPos=GetImageIndex(cbCardData)*m_nItemWidth;
  73. //m_CardListImage.AlphaDrawImage(pDestDC,xDest,yDest,m_nItemWidth,m_nItemHeight,nImageXPos,0,RGB(255,0,255));
  74. m_CardListImage.DrawImage(pDestDC,
  75. xDest, //X坐标
  76. yDest, //Y坐标
  77. m_CardListImage.GetWidth()/28, //宽
  78. m_CardListImage.GetHeight(), //高
  79. nImageXPos,//起始位置X
  80. 0);
  81. }
  82. return true;
  83. }
  84. //////////////////////////////////////////////////////////////////////////
  85. //构造函数
  86. CCardResource::CCardResource()
  87. {
  88. }
  89. //析构函数
  90. CCardResource::~CCardResource()
  91. {
  92. }
  93. //加载资源
  94. bool CCardResource::LoadResource()
  95. {
  96. //变量定义
  97. HINSTANCE hInstance=AfxGetInstanceHandle();
  98. //用户扑克
  99. m_ImageUserTop.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_USER_TOP"));
  100. m_ImageUserBottom.LoadResource(TEXT("CARD_USER_BOTTOM"),CARD_WIDTH,CARD_HEIGHT);
  101. m_ImageUserLeft.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_USER_LEFT"));
  102. m_ImageUserRight.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_USER_RIGHT"));
  103. //桌子扑克
  104. m_ImageTableTop.LoadResource(TEXT("CARD_TABLE_TOP"),31,64);
  105. m_ImageTableLeft.LoadResource(TEXT("CARD_TABLE_LEFT"),53,35);
  106. m_ImageTableRight.LoadResource(TEXT("CARD_TABLE_RIGHT"),53,35);
  107. m_ImageTableBottom.LoadResource(TEXT("CARD_TABLE_BOTTOM"),34,70);
  108. //左边
  109. m_ImageHeapDoubleLV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_LV"));
  110. m_ImageHeapSingleLV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_LV"));
  111. //右边
  112. m_ImageHeapDoubleRV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_RV"));
  113. m_ImageHeapSingleRV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_RV"));
  114. //上面的
  115. m_ImageHeapDoubleTV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_TV"));
  116. m_ImageHeapSingleTV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_TV"));
  117. //下面的
  118. m_ImageHeapDoubleBV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_BV"));
  119. m_ImageHeapSingleBV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_BV"));
  120. //m_ImageArrow.LoadImage(AfxGetInstanceHandle(),TEXT("ARROW"));
  121. return true;
  122. }
  123. //消耗资源
  124. bool CCardResource::DestroyResource()
  125. {
  126. //用户扑克
  127. m_ImageUserBottom.DestroyResource();
  128. //桌子扑克
  129. m_ImageTableTop.DestroyResource();
  130. m_ImageTableLeft.DestroyResource();
  131. m_ImageTableRight.DestroyResource();
  132. m_ImageTableBottom.DestroyResource();
  133. return true;
  134. }
  135. //////////////////////////////////////////////////////////////////////////
  136. //构造函数
  137. CHeapCard::CHeapCard()
  138. {
  139. //控制变量
  140. m_ControlPoint.SetPoint(0,0);
  141. m_CardDirection=Direction_East;
  142. //扑克变量
  143. m_wFullCount=0;
  144. m_wMinusHeadCount=0;
  145. m_wMinusLastCount=0;
  146. return;
  147. }
  148. //析构函数
  149. CHeapCard::~CHeapCard()
  150. {
  151. }
  152. //绘画扑克
  153. void CHeapCard::DrawCardControl(CDC * pDC)
  154. {
  155. int nOffset=3; //偏移量
  156. switch (m_CardDirection)
  157. {
  158. case Direction_East: //东向 右 右
  159. {
  160. //绘画扑克
  161. if ((m_wFullCount-m_wMinusHeadCount-m_wMinusLastCount)>0)
  162. {
  163. //变量定义
  164. int nXPos=0,nYPos=0;
  165. WORD wHeapIndex=m_wMinusHeadCount/2;
  166. WORD wDoubleHeap=(m_wMinusHeadCount+1)/2;
  167. WORD wDoubleLast=(m_wFullCount-m_wMinusLastCount)/2;
  168. WORD wFinallyIndex=(m_wFullCount-m_wMinusLastCount)/2;
  169. //头部扑克
  170. if (m_wMinusHeadCount%2!=0)
  171. {
  172. nXPos=m_ControlPoint.x + wHeapIndex*nOffset;
  173. nYPos=m_ControlPoint.y+wHeapIndex*16+13;
  174. g_CardResource.m_ImageHeapSingleRV.DrawImage(pDC,
  175. nXPos, //X坐标
  176. nYPos, //Y坐标
  177. g_CardResource.m_ImageHeapSingleRV.GetWidth(), //宽
  178. g_CardResource.m_ImageHeapSingleRV.GetHeight(), //高
  179. 0,//起始位置X
  180. 0);
  181. }
  182. //中间扑克
  183. for (WORD i=wDoubleHeap;i<wFinallyIndex;i++)
  184. {
  185. nXPos=m_ControlPoint.x + i*nOffset;
  186. nYPos=m_ControlPoint.y+i*16;
  187. g_CardResource.m_ImageHeapDoubleRV.DrawImage(pDC,
  188. nXPos, //X坐标
  189. nYPos, //Y坐标
  190. g_CardResource.m_ImageHeapDoubleRV.GetWidth(), //宽
  191. g_CardResource.m_ImageHeapDoubleRV.GetHeight(), //高
  192. 0,//起始位置X
  193. 0);
  194. }
  195. //尾部扑克
  196. if (m_wMinusLastCount%2!=0)
  197. {
  198. nXPos=m_ControlPoint.x + wFinallyIndex*nOffset;
  199. nYPos=m_ControlPoint.y+wFinallyIndex*16+13;
  200. g_CardResource.m_ImageHeapSingleRV.DrawImage(pDC,
  201. nXPos, //X坐标
  202. nYPos, //Y坐标
  203. g_CardResource.m_ImageHeapSingleRV.GetWidth(), //宽
  204. g_CardResource.m_ImageHeapSingleRV.GetHeight(), //高
  205. 0,//起始位置X
  206. 0);
  207. }
  208. }
  209. break;
  210. }
  211. case Direction_South: //南向 下
  212. {
  213. //绘画扑克
  214. if ((m_wFullCount-m_wMinusHeadCount-m_wMinusLastCount)>0)
  215. {
  216. //变量定义
  217. int nXPos=0,nYPos=0;
  218. WORD wHeapIndex=m_wMinusLastCount/2;
  219. WORD wDoubleHeap=(m_wMinusLastCount+1)/2;
  220. WORD wDoubleLast=(m_wFullCount-m_wMinusHeadCount)/2;
  221. WORD wFinallyIndex=(m_wFullCount-m_wMinusHeadCount)/2;
  222. //尾部扑克
  223. if (m_wMinusLastCount%2!=0)
  224. {
  225. nYPos=m_ControlPoint.y+16;
  226. nXPos=m_ControlPoint.x+wHeapIndex*34; //42
  227. g_CardResource.m_ImageHeapSingleBV.DrawImage(pDC,
  228. nXPos, //X坐标
  229. nYPos, //Y坐标
  230. g_CardResource.m_ImageHeapSingleBV.GetWidth(), //宽
  231. g_CardResource.m_ImageHeapSingleBV.GetHeight(), //高
  232. 0,//起始位置X
  233. 0);
  234. }
  235. //中间扑克
  236. for (WORD i=wDoubleHeap;i<wFinallyIndex;i++)
  237. {
  238. nYPos=m_ControlPoint.y;
  239. nXPos=m_ControlPoint.x+i*34;
  240. g_CardResource.m_ImageHeapDoubleBV.DrawImage(pDC,
  241. nXPos, //X坐标
  242. nYPos, //Y坐标
  243. g_CardResource.m_ImageHeapDoubleBV.GetWidth(), //宽
  244. g_CardResource.m_ImageHeapDoubleBV.GetHeight(), //高
  245. 0,//起始位置X
  246. 0);
  247. }
  248. //头部扑克
  249. if (m_wMinusHeadCount%2!=0)
  250. {
  251. nYPos=m_ControlPoint.y+16;
  252. nXPos=m_ControlPoint.x+wFinallyIndex*34;
  253. g_CardResource.m_ImageHeapSingleBV.DrawImage(pDC,
  254. nXPos, //X坐标
  255. nYPos, //Y坐标
  256. g_CardResource.m_ImageHeapSingleBV.GetWidth(), //宽
  257. g_CardResource.m_ImageHeapSingleBV.GetHeight(), //高
  258. 0,//起始位置X
  259. 0);
  260. }
  261. }
  262. break;
  263. }
  264. case Direction_West: //西向 左
  265. {
  266. //绘画扑克
  267. if ((m_wFullCount-m_wMinusHeadCount-m_wMinusLastCount)>0)
  268. {
  269. //变量定义
  270. int nXPos=0,nYPos=0;
  271. WORD wHeapIndex=m_wMinusLastCount/2;
  272. WORD wDoubleHeap=(m_wMinusLastCount+1)/2;
  273. WORD wDoubleLast=(m_wFullCount-m_wMinusHeadCount)/2;
  274. WORD wFinallyIndex=(m_wFullCount-m_wMinusHeadCount)/2;
  275. //尾部扑克
  276. if (m_wMinusLastCount%2!=0)
  277. {
  278. nXPos=m_ControlPoint.x - wHeapIndex*nOffset;
  279. nYPos=m_ControlPoint.y+wHeapIndex*16+13;
  280. g_CardResource.m_ImageHeapSingleLV.DrawImage(pDC,
  281. nXPos, //X坐标
  282. nYPos, //Y坐标
  283. g_CardResource.m_ImageHeapSingleLV.GetWidth(), //宽
  284. g_CardResource.m_ImageHeapSingleLV.GetHeight(), //高
  285. 0,//起始位置X
  286. 0);
  287. }
  288. //中间扑克
  289. for (WORD i=wDoubleHeap;i<wFinallyIndex;i++)
  290. {
  291. nXPos=m_ControlPoint.x - i*nOffset;
  292. nYPos=m_ControlPoint.y+i*16;
  293. g_CardResource.m_ImageHeapDoubleLV.DrawImage(pDC,
  294. nXPos, //X坐标
  295. nYPos, //Y坐标
  296. g_CardResource.m_ImageHeapDoubleLV.GetWidth(), //宽
  297. g_CardResource.m_ImageHeapDoubleLV.GetHeight(), //高
  298. 0,//起始位置X
  299. 0);
  300. }
  301. //头部扑克
  302. if (m_wMinusHeadCount%2!=0)
  303. {
  304. nXPos=m_ControlPoint.x - wFinallyIndex*nOffset;
  305. nYPos=m_ControlPoint.y+wFinallyIndex*16+13;
  306. g_CardResource.m_ImageHeapSingleLV.DrawImage(pDC,
  307. nXPos, //X坐标
  308. nYPos, //Y坐标
  309. g_CardResource.m_ImageHeapSingleLV.GetWidth(), //宽
  310. g_CardResource.m_ImageHeapSingleLV.GetHeight(), //高
  311. 0,//起始位置X
  312. 0);
  313. }
  314. }
  315. break;
  316. }
  317. case Direction_North: //北向 上
  318. {
  319. //绘画扑克
  320. if ((m_wFullCount-m_wMinusHeadCount-m_wMinusLastCount)>0)
  321. {
  322. //变量定义
  323. int nXPos=0,nYPos=0;
  324. WORD wHeapIndex=m_wMinusHeadCount/2;
  325. WORD wDoubleHeap=(m_wMinusHeadCount+1)/2;
  326. WORD wDoubleLast=(m_wFullCount-m_wMinusLastCount)/2;
  327. WORD wFinallyIndex=(m_wFullCount-m_wMinusLastCount)/2;
  328. //头部扑克
  329. if (m_wMinusHeadCount%2!=0)
  330. {
  331. nYPos=m_ControlPoint.y+15;
  332. nXPos=m_ControlPoint.x+wHeapIndex*31;
  333. g_CardResource.m_ImageHeapSingleTV.DrawImage(pDC,
  334. nXPos, //X坐标
  335. nYPos, //Y坐标
  336. g_CardResource.m_ImageHeapSingleTV.GetWidth(), //宽
  337. g_CardResource.m_ImageHeapSingleTV.GetHeight(), //高
  338. 0,//起始位置X
  339. 0);
  340. }
  341. //中间扑克
  342. for (WORD i=wDoubleHeap;i<wFinallyIndex;i++)
  343. {
  344. nYPos=m_ControlPoint.y;
  345. nXPos=m_ControlPoint.x+i*31;
  346. g_CardResource.m_ImageHeapDoubleTV.DrawImage(pDC,
  347. nXPos, //X坐标
  348. nYPos, //Y坐标
  349. g_CardResource.m_ImageHeapDoubleTV.GetWidth(), //宽
  350. g_CardResource.m_ImageHeapDoubleTV.GetHeight(), //高
  351. 0,//起始位置X
  352. 0);
  353. }
  354. //尾部扑克
  355. if (m_wMinusLastCount%2!=0)
  356. {
  357. nYPos=m_ControlPoint.y+15;
  358. nXPos=m_ControlPoint.x+wFinallyIndex*31;
  359. g_CardResource.m_ImageHeapSingleTV.DrawImage(pDC,
  360. nXPos, //X坐标
  361. nYPos, //Y坐标
  362. g_CardResource.m_ImageHeapSingleTV.GetWidth(), //宽
  363. g_CardResource.m_ImageHeapSingleTV.GetHeight(), //高
  364. 0,//起始位置X
  365. 0);
  366. }
  367. }
  368. break;
  369. }
  370. }
  371. return;
  372. }
  373. //设置扑克
  374. bool CHeapCard::SetCardData(WORD wMinusHeadCount, WORD wMinusLastCount, WORD wFullCount)
  375. {
  376. //设置变量
  377. m_wFullCount=wFullCount;
  378. m_wMinusHeadCount=wMinusHeadCount;
  379. m_wMinusLastCount=wMinusLastCount;
  380. return true;
  381. }
  382. //////////////////////////////////////////////////////////////////////////
  383. //构造函数
  384. CWeaveCard::CWeaveCard()
  385. {
  386. //状态变量
  387. m_bDisplayItem=false;
  388. m_ControlPoint.SetPoint(0,0);
  389. m_CardDirection=Direction_South;
  390. m_cbDirectionCardPos = 1;
  391. m_bGameEnd = false;
  392. //扑克数据
  393. m_wCardCount=0;
  394. ZeroMemory(&m_cbCardData,sizeof(m_cbCardData));
  395. return;
  396. }
  397. //析构函数
  398. CWeaveCard::~CWeaveCard()
  399. {
  400. }
  401. //绘画扑克
  402. void CWeaveCard::DrawCardControl(CDC * pDC)
  403. {
  404. //显示判断
  405. if (m_wCardCount==0)
  406. return;
  407. //变量定义
  408. int nXScreenPos=0,nYScreenPos=0;
  409. int nItemWidth=0,nItemHeight=0,nItemWidthEx=0,nItemHeightEx=0;
  410. //绘画扑克
  411. switch (m_CardDirection)
  412. {
  413. case Direction_East: //东向 右
  414. {
  415. //变量定义
  416. nItemWidth=g_CardResource.m_ImageTableRight.GetViewWidth();
  417. nItemHeight=g_CardResource.m_ImageTableRight.GetViewHeight()-18;
  418. nItemWidthEx=g_CardResource.m_ImageTableTop.GetViewWidth();
  419. nItemHeightEx=g_CardResource.m_ImageTableTop.GetViewHeight()-10;
  420. nYScreenPos = m_ControlPoint.y;
  421. //if(m_cbDirectionCardPos == 2)
  422. //{
  423. // nXScreenPos=m_ControlPoint.x+nItemWidthEx;
  424. // g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  425. // nYScreenPos += nItemHeightEx;
  426. //}
  427. //else
  428. {
  429. nXScreenPos=m_ControlPoint.x+nItemWidthEx*2-nItemWidth;
  430. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  431. nYScreenPos += nItemHeight;
  432. }
  433. //第二扑克
  434. nXScreenPos=m_ControlPoint.x+nItemWidthEx*2-nItemWidth + 3;
  435. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(1),nXScreenPos,nYScreenPos);
  436. //第四扑克
  437. if (m_wCardCount==4)
  438. {
  439. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos-17);
  440. }
  441. nYScreenPos += nItemHeight;
  442. //第一扑克
  443. //if(m_cbDirectionCardPos == 0)
  444. //{
  445. // nXScreenPos=m_ControlPoint.x+nItemWidthEx + 6;
  446. // g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  447. //}
  448. //else
  449. {
  450. nXScreenPos=m_ControlPoint.x+nItemWidthEx*2-nItemWidth +6;
  451. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  452. }
  453. break;
  454. }
  455. case Direction_South: //南向 下
  456. {
  457. //变量定义
  458. nItemWidth=g_CardResource.m_ImageTableBottom.GetViewWidth();
  459. nItemHeight=g_CardResource.m_ImageTableBottom.GetViewHeight();
  460. nItemWidthEx=g_CardResource.m_ImageTableRight.GetViewWidth();
  461. nItemHeightEx=g_CardResource.m_ImageTableRight.GetViewHeight();
  462. //第三扑克
  463. nXScreenPos = m_ControlPoint.x;
  464. //if(m_cbDirectionCardPos == 2)
  465. //{
  466. // nXScreenPos -= nItemWidthEx;
  467. // nYScreenPos=m_ControlPoint.y+nItemHeightEx;
  468. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  469. //}
  470. //else
  471. {
  472. nXScreenPos -= nItemWidth;
  473. nYScreenPos=m_ControlPoint.y+nItemHeightEx*2-nItemHeight;
  474. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  475. }
  476. //第二扑克
  477. nXScreenPos -= nItemWidth;
  478. nYScreenPos=m_ControlPoint.y+nItemHeightEx*2-nItemHeight;
  479. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(1),nXScreenPos,nYScreenPos);
  480. //第四扑克
  481. if (m_wCardCount==4)
  482. {
  483. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos-18);
  484. }
  485. //第一扑克
  486. //if(m_cbDirectionCardPos == 0)
  487. //{
  488. // nXScreenPos -= nItemWidthEx;
  489. // nYScreenPos=m_ControlPoint.y+nItemHeightEx;
  490. // g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  491. //}
  492. //else
  493. {
  494. nXScreenPos -= nItemWidth;
  495. nYScreenPos=m_ControlPoint.y+nItemHeightEx*2-nItemHeight;
  496. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  497. }
  498. break;
  499. }
  500. case Direction_West: //西向 左
  501. {
  502. //变量定义
  503. nItemWidth=g_CardResource.m_ImageTableLeft.GetViewWidth();
  504. nItemHeight=g_CardResource.m_ImageTableLeft.GetViewHeight()-18;
  505. nItemWidthEx=g_CardResource.m_ImageTableBottom.GetViewWidth();
  506. nItemHeightEx=g_CardResource.m_ImageTableBottom.GetViewHeight()-10;
  507. //if(m_cbDirectionCardPos != 1)
  508. {
  509. //第一扑克
  510. nYScreenPos=m_ControlPoint.y-nItemHeightEx-nItemHeight*2;
  511. //if(m_cbDirectionCardPos == 0)
  512. //{
  513. // nXScreenPos=m_ControlPoint.x-nItemWidthEx*2;
  514. // g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  515. // nYScreenPos += nItemHeightEx;
  516. //}
  517. //else
  518. {
  519. nXScreenPos=m_ControlPoint.x-nItemWidthEx*2;
  520. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  521. nYScreenPos += nItemHeight;
  522. }
  523. //第二扑克
  524. nXScreenPos=m_ControlPoint.x-nItemWidthEx*2 - 3;
  525. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(1),nXScreenPos,nYScreenPos);
  526. //第四扑克
  527. if (m_wCardCount==4)
  528. {
  529. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos-17);
  530. }
  531. nYScreenPos += nItemHeight;
  532. //第三扑克
  533. //if(m_cbDirectionCardPos == 2)
  534. //{
  535. // nXScreenPos=m_ControlPoint.x-nItemWidthEx*2 - 6;
  536. // g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  537. //}
  538. //else
  539. {
  540. nXScreenPos=m_ControlPoint.x-nItemWidthEx*2 - 6;
  541. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  542. }
  543. }
  544. //else
  545. //{
  546. // //第一扑克
  547. // nYScreenPos = m_ControlPoint.y-nItemHeight*3;
  548. // //nXScreenPos=m_ControlPoint.x-nItemWidth;
  549. // nXScreenPos=m_ControlPoint.x-nItemWidthEx*2;
  550. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  551. // //第二扑克
  552. // nYScreenPos += nItemHeight;
  553. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(1),nXScreenPos,nYScreenPos);
  554. // //第四扑克
  555. // if (m_wCardCount==4)
  556. // {
  557. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos-12);
  558. // }
  559. // //第三扑克
  560. // nYScreenPos += nItemHeight;
  561. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  562. //}
  563. break;
  564. }
  565. case Direction_North: //北向 上。
  566. {
  567. //变量定义
  568. nItemWidth=g_CardResource.m_ImageTableTop.GetViewWidth();
  569. nItemHeight=g_CardResource.m_ImageTableTop.GetViewHeight();
  570. nItemWidthEx=g_CardResource.m_ImageTableLeft.GetViewWidth();
  571. nItemHeightEx=g_CardResource.m_ImageTableLeft.GetViewHeight();
  572. //第三扑克
  573. nXScreenPos = m_ControlPoint.x;
  574. //if(m_cbDirectionCardPos == 2)
  575. //{
  576. // nYScreenPos = m_ControlPoint.y-nItemHeight;
  577. // g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  578. // nXScreenPos += nItemWidthEx;
  579. //}
  580. //else
  581. {
  582. nYScreenPos = m_ControlPoint.y-nItemHeight;
  583. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(2),nXScreenPos,nYScreenPos);
  584. nXScreenPos += nItemWidth;
  585. }
  586. //第二扑克
  587. nYScreenPos = m_ControlPoint.y-nItemHeight;
  588. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(1),nXScreenPos,nYScreenPos);
  589. //第四扑克
  590. if (m_wCardCount==4)
  591. {
  592. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos-17);
  593. }
  594. nXScreenPos += nItemWidth;
  595. //第一扑克
  596. //if(m_cbDirectionCardPos == 0)
  597. //{
  598. // nYScreenPos=m_ControlPoint.y-nItemHeight;
  599. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  600. //}
  601. //else
  602. {
  603. nYScreenPos=m_ControlPoint.y-nItemHeight;
  604. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(0),nXScreenPos,nYScreenPos);
  605. }
  606. break;
  607. }
  608. }
  609. return;
  610. }
  611. //设置扑克
  612. bool CWeaveCard::SetCardData(const BYTE cbCardData[], WORD wCardCount)
  613. {
  614. //效验大小
  615. ASSERT(wCardCount<=CountArray(m_cbCardData));
  616. if (wCardCount>CountArray(m_cbCardData)) return false;
  617. //设置扑克
  618. m_wCardCount=wCardCount;
  619. CopyMemory(m_cbCardData,cbCardData,sizeof(BYTE)*wCardCount);
  620. return true;
  621. }
  622. //获取扑克
  623. BYTE CWeaveCard::GetCardData(WORD wIndex)
  624. {
  625. ASSERT(wIndex<CountArray(m_cbCardData));
  626. return ((m_bDisplayItem==true)||(wIndex==3&&m_bGameEnd))?m_cbCardData[wIndex]:0;
  627. }
  628. //绘画扑克
  629. void CWeaveCard::DrawCardControl(CDC * pDC, int nXPos, int nYPos)
  630. {
  631. //设置位置
  632. SetControlPoint(nXPos,nYPos);
  633. //显示判断
  634. if (m_wCardCount==0)
  635. return;
  636. //变量定义
  637. int nXScreenPos=0,nYScreenPos=0;
  638. int nItemWidth=0,nItemHeight=0,nItemWidthEx=0,nItemHeightEx=0;
  639. //绘画扑克
  640. switch (m_CardDirection)
  641. {
  642. case Direction_East: //东向 右
  643. {
  644. //绘画扑克
  645. for (WORD i=0;i<3;i++)
  646. {
  647. int nXScreenPos=m_ControlPoint.x-g_CardResource.m_ImageTableRight.GetViewWidth();
  648. int nYScreenPos=m_ControlPoint.y+i*g_CardResource.m_ImageTableRight.GetViewHeight();
  649. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(2-i),nXScreenPos,nYScreenPos);
  650. }
  651. //第四扑克
  652. if (m_wCardCount==4)
  653. {
  654. int nXScreenPos=m_ControlPoint.x-g_CardResource.m_ImageTableRight.GetViewWidth();
  655. int nYScreenPos=m_ControlPoint.y-5+g_CardResource.m_ImageTableRight.GetViewHeight();
  656. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos);
  657. }
  658. break;
  659. }
  660. case Direction_South: //南向
  661. {
  662. //绘画扑克
  663. for (WORD i=0;i<3;i++)
  664. {
  665. int nXScreenPos=m_ControlPoint.x+i*g_CardResource.m_ImageTableBottom.GetViewWidth();
  666. int nYScreenPos=m_ControlPoint.y-g_CardResource.m_ImageTableBottom.GetViewHeight()-5;
  667. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(i),nXScreenPos,nYScreenPos);
  668. }
  669. //第四扑克
  670. if (m_wCardCount==4)
  671. {
  672. int nXScreenPos=m_ControlPoint.x+g_CardResource.m_ImageTableBottom.GetViewWidth();
  673. int nYScreenPos=m_ControlPoint.y-g_CardResource.m_ImageTableBottom.GetViewHeight()-5*2;
  674. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos);
  675. }
  676. break;
  677. }
  678. case Direction_West: //西向
  679. {
  680. //绘画扑克
  681. for (WORD i=0;i<3;i++)
  682. {
  683. int nXScreenPos=m_ControlPoint.x;
  684. int nYScreenPos=m_ControlPoint.y+i*g_CardResource.m_ImageTableLeft.GetViewHeight();
  685. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(i),nXScreenPos,nYScreenPos);
  686. }
  687. //第四扑克
  688. if (m_wCardCount==4)
  689. {
  690. int nXScreenPos=m_ControlPoint.x;
  691. int nYScreenPos=m_ControlPoint.y+g_CardResource.m_ImageTableLeft.GetViewHeight()-5;
  692. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos);
  693. }
  694. break;
  695. }
  696. case Direction_North: //北向
  697. {
  698. //绘画扑克
  699. for (WORD i=0;i<3;i++)
  700. {
  701. int nYScreenPos=m_ControlPoint.y;
  702. int nXScreenPos=m_ControlPoint.x-(i+1)*g_CardResource.m_ImageTableTop.GetViewWidth();
  703. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(2-i),nXScreenPos,nYScreenPos);
  704. }
  705. //第四扑克
  706. if (m_wCardCount==4)
  707. {
  708. int nYScreenPos=m_ControlPoint.y-5;
  709. int nXScreenPos=m_ControlPoint.x-2*g_CardResource.m_ImageTableTop.GetViewWidth();
  710. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,GetCardData(3),nXScreenPos,nYScreenPos);
  711. }
  712. break;
  713. }
  714. }
  715. return;
  716. }
  717. //////////////////////////////////////////////////////////////////////////
  718. //构造函数
  719. CUserCard::CUserCard()
  720. {
  721. //扑克数据
  722. m_wCardCount=0;
  723. m_bCurrentCard=false;
  724. //控制变量
  725. m_ControlPoint.SetPoint(0,0);
  726. m_CardDirection=Direction_East;
  727. return;
  728. }
  729. //析构函数
  730. CUserCard::~CUserCard()
  731. {
  732. }
  733. //绘画扑克
  734. void CUserCard::DrawCardControl(CDC * pDC)
  735. {
  736. int nOffset=3; //偏移量
  737. switch (m_CardDirection)
  738. {
  739. case Direction_East: //东向 右 右边
  740. {
  741. //当前扑克
  742. if (m_bCurrentCard==true)
  743. {
  744. int nXPos=m_ControlPoint.x - 5;
  745. int nYPos=m_ControlPoint.y + 15;
  746. //g_CardResource.m_ImageUserRight.AlphaDrawImage(pDC,nXPos,nYPos,RGB(255,0,255));
  747. g_CardResource.m_ImageUserRight.DrawImage(pDC,
  748. nXPos, //X坐标
  749. nYPos, //Y坐标
  750. g_CardResource.m_ImageUserRight.GetWidth(), //宽
  751. g_CardResource.m_ImageUserRight.GetHeight(), //高
  752. 0,//起始位置X
  753. 0);
  754. }
  755. //正常扑克
  756. if (m_wCardCount>0)
  757. {
  758. int nXPos=0,nYPos=0;
  759. for (WORD i=0;i<m_wCardCount;i++)
  760. {
  761. nXPos=m_ControlPoint.x + i*nOffset;
  762. nYPos=m_ControlPoint.y+i*16+40;
  763. //g_CardResource.m_ImageUserRight.AlphaDrawImage(pDC,nXPos,nYPos,RGB(255,0,255));
  764. g_CardResource.m_ImageUserRight.DrawImage(pDC,
  765. nXPos, //X坐标
  766. nYPos, //Y坐标
  767. g_CardResource.m_ImageUserRight.GetWidth(), //宽
  768. g_CardResource.m_ImageUserRight.GetHeight(), //高
  769. 0,//起始位置X
  770. 0);
  771. }
  772. }
  773. break;
  774. }
  775. case Direction_West: //西向 左
  776. {
  777. //正常扑克
  778. if (m_wCardCount>0)
  779. {
  780. int nXPos=0,nYPos=0;
  781. for (WORD i=0;i<m_wCardCount;i++)
  782. {
  783. nXPos=m_ControlPoint.x + (m_wCardCount-i-1)*nOffset;
  784. nYPos=m_ControlPoint.y-(m_wCardCount-i-1)*16-92;
  785. //g_CardResource.m_ImageUserLeft.AlphaDrawImage(pDC,nXPos,nYPos,RGB(255,0,255));
  786. g_CardResource.m_ImageUserLeft.DrawImage(pDC,
  787. nXPos, //X坐标
  788. nYPos, //Y坐标
  789. g_CardResource.m_ImageUserLeft.GetWidth(), //宽
  790. g_CardResource.m_ImageUserLeft.GetHeight(), //高
  791. 0,//起始位置X
  792. 0);
  793. }
  794. }
  795. //当前扑克
  796. if (m_bCurrentCard==true)
  797. {
  798. int nXPos=m_ControlPoint.x - 5;
  799. int nYPos=m_ControlPoint.y-49 - 18;
  800. //g_CardResource.m_ImageUserLeft.AlphaDrawImage(pDC,nXPos,nYPos,RGB(255,0,255));
  801. g_CardResource.m_ImageUserLeft.DrawImage(pDC,
  802. nXPos, //X坐标
  803. nYPos, //Y坐标
  804. g_CardResource.m_ImageUserLeft.GetWidth(), //宽
  805. g_CardResource.m_ImageUserLeft.GetHeight(), //高
  806. 0,//起始位置X
  807. 0);
  808. }
  809. break;
  810. }
  811. case Direction_North: //北向
  812. {
  813. //当前扑克
  814. if (m_bCurrentCard==true)
  815. {
  816. int nXPos=m_ControlPoint.x;
  817. int nYPos=m_ControlPoint.y;
  818. g_CardResource.m_ImageUserTop.DrawImage(pDC,nXPos,nYPos);
  819. }
  820. //正常扑克
  821. if (m_wCardCount>0)
  822. {
  823. int nXPos=0,nYPos=0;
  824. for (WORD i=0;i<m_wCardCount;i++)
  825. {
  826. nYPos=m_ControlPoint.y;
  827. nXPos=m_ControlPoint.x+i*31+40;
  828. g_CardResource.m_ImageUserTop.DrawImage(pDC,nXPos,nYPos);
  829. }
  830. }
  831. break;
  832. }
  833. }
  834. return;
  835. }
  836. //设置扑克
  837. bool CUserCard::SetCurrentCard(bool bCurrentCard)
  838. {
  839. //设置变量
  840. m_bCurrentCard=bCurrentCard;
  841. return true;
  842. }
  843. //设置扑克
  844. bool CUserCard::SetCardData(WORD wCardCount, bool bCurrentCard)
  845. {
  846. //设置变量
  847. m_wCardCount=wCardCount;
  848. m_bCurrentCard=bCurrentCard;
  849. return true;
  850. }
  851. //////////////////////////////////////////////////////////////////////////
  852. //构造函数
  853. CDiscardCard::CDiscardCard()
  854. {
  855. //扑克数据
  856. m_wCardCount=0;
  857. ZeroMemory(m_cbCardData,sizeof(m_cbCardData));
  858. //控制变量
  859. m_ControlPoint.SetPoint(0,0);
  860. m_CardDirection=Direction_East;
  861. return;
  862. }
  863. //析构函数
  864. CDiscardCard::~CDiscardCard()
  865. {
  866. }
  867. //绘画扑克
  868. void CDiscardCard::DrawCardControl(CDC * pDC)
  869. {
  870. int nOffset=3; //偏移量
  871. //绘画控制
  872. switch (m_CardDirection)
  873. {
  874. case Direction_East: //东向 右
  875. {
  876. //绘画扑克
  877. for (WORD i=0;i<m_wCardCount;i++)
  878. {
  879. if (i>=8) continue;
  880. int nXPos=m_ControlPoint.x+(i/8)*50 + (i%8)*nOffset;
  881. int nYPos=m_ControlPoint.y+(i%8)*18;
  882. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,m_cbCardData[i],nXPos,nYPos);
  883. }
  884. for (WORD i=0;i<m_wCardCount;i++)
  885. {
  886. if (i<8) continue;
  887. int nXPos=m_ControlPoint.x+(i/8)*50 + (i%8)*nOffset;
  888. int nYPos=m_ControlPoint.y+(i%8)*18;
  889. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,m_cbCardData[i],nXPos,nYPos);
  890. }
  891. break;
  892. }
  893. case Direction_South: //南向 下
  894. {
  895. //绘画扑克
  896. for (WORD i=0;i<m_wCardCount;i++)
  897. {
  898. int nXPos=m_ControlPoint.x-(i%8)*34;
  899. int nYPos=m_ControlPoint.y+(i/8)*35;
  900. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,m_cbCardData[i],nXPos,nYPos);
  901. }
  902. break;
  903. }
  904. case Direction_West: //西向 左
  905. {
  906. //绘画扑克
  907. for (WORD i=0;i<m_wCardCount;i++)
  908. {
  909. if ((m_wCardCount-i-1)>=8) continue;
  910. int nXPos=m_ControlPoint.x-((m_wCardCount-1-i)/8)*50 + ((m_wCardCount-1-i)%8)*nOffset;
  911. int nYPos=m_ControlPoint.y-((m_wCardCount-1-i)%8)*18;
  912. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos);
  913. }
  914. for (WORD i=0;i<m_wCardCount;i++)
  915. {
  916. if ((m_wCardCount-i-1)<8) continue;
  917. int nXPos=m_ControlPoint.x-((m_wCardCount-1-i)/8)*50 + ((m_wCardCount-1-i)%8)*nOffset;
  918. int nYPos=m_ControlPoint.y-((m_wCardCount-1-i)%8)*18;
  919. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos);
  920. }
  921. //for (WORD i=0;i<m_wCardCount;i++)
  922. //{
  923. // int nXPos=m_ControlPoint.x-((m_wCardCount-1-i)/8)*50 + ((m_wCardCount-1-i)%8)*nOffset;
  924. // int nYPos=m_ControlPoint.y-((m_wCardCount-1-i)%8)*20;
  925. // g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos);
  926. //}
  927. break;
  928. }
  929. case Direction_North: //北向 上
  930. {
  931. //绘画扑克
  932. for (WORD i=0;i<m_wCardCount;i++)
  933. {
  934. int nXPos=m_ControlPoint.x+((m_wCardCount-1-i)%8)*30;
  935. int nYPos=m_ControlPoint.y-((m_wCardCount-1-i)/8)*35-14;
  936. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos);
  937. }
  938. break;
  939. }
  940. }
  941. return;
  942. }
  943. //增加扑克
  944. bool CDiscardCard::AddCardItem(BYTE cbCardData)
  945. {
  946. //清理扑克
  947. if (m_wCardCount>=CountArray(m_cbCardData))
  948. {
  949. m_wCardCount--;
  950. MoveMemory(m_cbCardData,m_cbCardData+1,CountArray(m_cbCardData)-1);
  951. }
  952. //设置扑克
  953. m_cbCardData[m_wCardCount++]=cbCardData;
  954. return true;
  955. }
  956. //设置扑克
  957. bool CDiscardCard::SetCardData(const BYTE cbCardData[], WORD wCardCount)
  958. {
  959. //效验大小
  960. ASSERT(wCardCount<=CountArray(m_cbCardData));
  961. if (wCardCount>CountArray(m_cbCardData))
  962. return false;
  963. //设置扑克
  964. m_wCardCount=wCardCount;
  965. CopyMemory(m_cbCardData,cbCardData,sizeof(m_cbCardData[0])*wCardCount);
  966. return true;
  967. }
  968. //获取位置
  969. CPoint CDiscardCard::GetLastCardPosition()
  970. {
  971. switch (m_CardDirection)
  972. {
  973. case Direction_East: //东向 右
  974. {
  975. //变量定义
  976. int nCellWidth=g_CardResource.m_ImageTableRight.GetViewWidth();
  977. int nCellHeight=g_CardResource.m_ImageTableRight.GetViewHeight();
  978. int nXPos=m_ControlPoint.x+((m_wCardCount-1)/8)*50+18 + ((m_wCardCount-1)%8)*2 ;
  979. int nYPos=m_ControlPoint.y+((m_wCardCount-1)%8)*18+11;
  980. return CPoint(nXPos,nYPos);
  981. }
  982. case Direction_South: //南向 下
  983. {
  984. //变量定义
  985. int nCellWidth=g_CardResource.m_ImageTableBottom.GetViewWidth();
  986. int nCellHeight=g_CardResource.m_ImageTableBottom.GetViewHeight();
  987. int nXPos=m_ControlPoint.x-((m_wCardCount-1)%8)*34+14 + 2;
  988. int nYPos=m_ControlPoint.y+((m_wCardCount-1)/8)*35+16;
  989. return CPoint(nXPos,nYPos);
  990. }
  991. case Direction_West: //西向 左
  992. {
  993. //变量定义
  994. int nCellWidth=g_CardResource.m_ImageTableLeft.GetViewWidth();
  995. int nCellHeight=g_CardResource.m_ImageTableLeft.GetViewHeight();
  996. int nXPos=m_ControlPoint.x-((m_wCardCount-1)/8)*50+17 + ((m_wCardCount-1)%8)*2 + 20;
  997. int nYPos=m_ControlPoint.y-((m_wCardCount-1)%8)*18+10;
  998. return CPoint(nXPos,nYPos);
  999. }
  1000. case Direction_North: //北向 上
  1001. {
  1002. //变量定义
  1003. int nCellWidth=g_CardResource.m_ImageTableTop.GetViewWidth();
  1004. int nCellHeight=g_CardResource.m_ImageTableTop.GetViewHeight();
  1005. int nXPos=m_ControlPoint.x+((m_wCardCount-1)%8)*30+14;
  1006. int nYPos=m_ControlPoint.y+((-m_wCardCount+1)/8)*35+17 - 10;
  1007. return CPoint(nXPos,nYPos);
  1008. }
  1009. }
  1010. return CPoint(0,0);
  1011. }
  1012. //////////////////////////////////////////////////////////////////////////
  1013. //构造函数
  1014. CTableCard::CTableCard()
  1015. {
  1016. //扑克数据
  1017. m_wCardCount=0;
  1018. ZeroMemory(m_cbCardData,sizeof(m_cbCardData));
  1019. //控制变量
  1020. m_ControlPoint.SetPoint(0,0);
  1021. m_CardDirection=Direction_East;
  1022. return;
  1023. }
  1024. //析构函数
  1025. CTableCard::~CTableCard()
  1026. {
  1027. }
  1028. //绘画扑克
  1029. void CTableCard::DrawCardControl(CDC * pDC)
  1030. {
  1031. int nOffset=3; //偏移量
  1032. //绘画控制
  1033. switch (m_CardDirection)
  1034. {
  1035. case Direction_East: //东向 右
  1036. {
  1037. //绘画扑克
  1038. for (WORD i=0;i<m_wCardCount;i++)
  1039. {
  1040. int nXPos=m_ControlPoint.x-33 + i*nOffset;
  1041. int nYPos=m_ControlPoint.y+i*17;
  1042. g_CardResource.m_ImageTableRight.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos);
  1043. }
  1044. break;
  1045. }
  1046. case Direction_South: //南向 下
  1047. {
  1048. //绘画扑克
  1049. for (WORD i=0;i<m_wCardCount;i++)
  1050. {
  1051. int nYPos=m_ControlPoint.y-36;
  1052. int nXPos=m_ControlPoint.x-(m_wCardCount-i)*34;
  1053. g_CardResource.m_ImageTableBottom.DrawCardItem(pDC,m_cbCardData[i],nXPos,nYPos);
  1054. }
  1055. break;
  1056. }
  1057. case Direction_West: //西向 左
  1058. {
  1059. //绘画扑克
  1060. for (WORD i=0;i<m_wCardCount;i++)
  1061. {
  1062. int nXPos=m_ControlPoint.x + (m_wCardCount-i)*nOffset;
  1063. int nYPos=m_ControlPoint.y-(m_wCardCount-i)*17;
  1064. g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,m_cbCardData[i],nXPos,nYPos);
  1065. }
  1066. break;
  1067. }
  1068. case Direction_North: //北向 上
  1069. {
  1070. //绘画扑克
  1071. for (WORD i=0;i<m_wCardCount;i++)
  1072. {
  1073. int nYPos=m_ControlPoint.y;
  1074. int nXPos=m_ControlPoint.x+i*31;
  1075. g_CardResource.m_ImageTableTop.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos);
  1076. }
  1077. break;
  1078. }
  1079. }
  1080. return;
  1081. }
  1082. //设置扑克
  1083. bool CTableCard::SetCardData(const BYTE cbCardData[], WORD wCardCount)
  1084. {
  1085. //效验大小
  1086. ASSERT(wCardCount<=CountArray(m_cbCardData));
  1087. if (wCardCount>CountArray(m_cbCardData))
  1088. return false;
  1089. //设置扑克
  1090. m_wCardCount=wCardCount;
  1091. CopyMemory(m_cbCardData,cbCardData,sizeof(m_cbCardData[0])*wCardCount);
  1092. return true;
  1093. }
  1094. //////////////////////////////////////////////////////////////////////////
  1095. //构造函数
  1096. CCardControl::CCardControl()
  1097. {
  1098. //状态变量
  1099. m_bPositively=false;
  1100. m_bDisplayItem=false;
  1101. //位置变量
  1102. m_XCollocateMode=enXCenter;
  1103. m_YCollocateMode=enYCenter;
  1104. m_BenchmarkPos.SetPoint(0,0);
  1105. //扑克数据
  1106. m_wCardCount=0;
  1107. m_wHoverItem=INVALID_ITEM;
  1108. ZeroMemory(&m_CurrentCard,sizeof(m_CurrentCard));
  1109. ZeroMemory(&m_CardItemArray,sizeof(m_CardItemArray));
  1110. //加载设置
  1111. m_ControlPoint.SetPoint(0,0);
  1112. m_ControlSize.cy=CARD_HEIGHT+POS_SHOOT;
  1113. m_ControlSize.cx=(CountArray(m_CardItemArray)+1)*CARD_WIDTH+POS_SPACE;
  1114. return;
  1115. }
  1116. //析构函数
  1117. CCardControl::~CCardControl()
  1118. {
  1119. }
  1120. //基准位置
  1121. void CCardControl::SetBenchmarkPos(int nXPos, int nYPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode)
  1122. {
  1123. //设置变量
  1124. m_BenchmarkPos.x=nXPos;
  1125. m_BenchmarkPos.y=nYPos;
  1126. m_XCollocateMode=XCollocateMode;
  1127. m_YCollocateMode=YCollocateMode;
  1128. //横向位置
  1129. switch (m_XCollocateMode)
  1130. {
  1131. case enXLeft: { m_ControlPoint.x=m_BenchmarkPos.x; break; }
  1132. case enXCenter: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx/2; break; }
  1133. case enXRight: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx; break; }
  1134. }
  1135. //竖向位置
  1136. switch (m_YCollocateMode)
  1137. {
  1138. case enYTop: { m_ControlPoint.y=m_BenchmarkPos.y; break; }
  1139. case enYCenter: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy/2; break; }
  1140. case enYBottom: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy; break; }
  1141. }
  1142. return;
  1143. }
  1144. //基准位置
  1145. void CCardControl::SetBenchmarkPos(const CPoint & BenchmarkPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode)
  1146. {
  1147. //设置变量
  1148. m_BenchmarkPos=BenchmarkPos;
  1149. m_XCollocateMode=XCollocateMode;
  1150. m_YCollocateMode=YCollocateMode;
  1151. //横向位置
  1152. switch (m_XCollocateMode)
  1153. {
  1154. case enXLeft: { m_ControlPoint.x=m_BenchmarkPos.x; break; }
  1155. case enXCenter: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx/2; break; }
  1156. case enXRight: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx; break; }
  1157. }
  1158. //竖向位置
  1159. switch (m_YCollocateMode)
  1160. {
  1161. case enYTop: { m_ControlPoint.y=m_BenchmarkPos.y; break; }
  1162. case enYCenter: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy/2; break; }
  1163. case enYBottom: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy; break; }
  1164. }
  1165. return;
  1166. }
  1167. //获取扑克
  1168. BYTE CCardControl::GetHoverCard()
  1169. {
  1170. //获取扑克
  1171. if (m_wHoverItem!=INVALID_ITEM)
  1172. {
  1173. if (m_wHoverItem==CountArray(m_CardItemArray))
  1174. return m_CurrentCard.cbCardData;
  1175. return m_CardItemArray[m_wHoverItem].cbCardData;
  1176. }
  1177. return 0;
  1178. }
  1179. //设置扑克
  1180. bool CCardControl::SetCurrentCard(BYTE cbCardData)
  1181. {
  1182. //设置变量
  1183. m_CurrentCard.bShoot=false;
  1184. m_CurrentCard.cbCardData=cbCardData;
  1185. return true;
  1186. }
  1187. //设置扑克
  1188. bool CCardControl::SetCurrentCard(tagCardItem CardItem)
  1189. {
  1190. //设置变量
  1191. m_CurrentCard.bShoot=CardItem.bShoot;
  1192. m_CurrentCard.cbCardData=CardItem.cbCardData;
  1193. return true;
  1194. }
  1195. //设置扑克
  1196. bool CCardControl::SetCardData(const BYTE cbCardData[], WORD wCardCount, BYTE cbCurrentCard)
  1197. {
  1198. //效验大小
  1199. ASSERT(wCardCount<=CountArray(m_CardItemArray));
  1200. if (wCardCount>CountArray(m_CardItemArray))
  1201. return false;
  1202. //当前扑克
  1203. m_CurrentCard.bShoot=false;
  1204. m_CurrentCard.cbCardData=cbCurrentCard;
  1205. //设置扑克
  1206. m_wCardCount=wCardCount;
  1207. for (WORD i=0;i<m_wCardCount;i++)
  1208. {
  1209. m_CardItemArray[i].bShoot=false;
  1210. m_CardItemArray[i].cbCardData=cbCardData[i];
  1211. }
  1212. return true;
  1213. }
  1214. //设置扑克
  1215. bool CCardControl::SetCardItem(const tagCardItem CardItemArray[], WORD wCardCount)
  1216. {
  1217. //效验大小
  1218. ASSERT(wCardCount<=CountArray(m_CardItemArray));
  1219. if (wCardCount>CountArray(m_CardItemArray))
  1220. return false;
  1221. //设置扑克
  1222. m_wCardCount=wCardCount;
  1223. for (WORD i=0;i<m_wCardCount;i++)
  1224. {
  1225. m_CardItemArray[i].bShoot=CardItemArray[i].bShoot;
  1226. m_CardItemArray[i].cbCardData=CardItemArray[i].cbCardData;
  1227. }
  1228. return true;
  1229. }
  1230. //绘画扑克
  1231. void CCardControl::DrawCardControl(CDC * pDC)
  1232. {
  1233. //绘画准备
  1234. int nXExcursion=m_ControlPoint.x+(CountArray(m_CardItemArray)-m_wCardCount)*CARD_WIDTH;
  1235. //绘画扑克
  1236. for (WORD i=0;i<m_wCardCount;i++)
  1237. {
  1238. //计算位置
  1239. int nXScreenPos=nXExcursion+CARD_WIDTH*i;
  1240. int nYScreenPos=m_ControlPoint.y+(((m_CardItemArray[i].bShoot==false)&&(m_wHoverItem!=i))?POS_SHOOT:0);
  1241. //绘画扑克
  1242. BYTE cbCardData=(m_bDisplayItem==true)?m_CardItemArray[i].cbCardData:0;
  1243. g_CardResource.m_ImageUserBottom.DrawCardItem(pDC,cbCardData,nXScreenPos,nYScreenPos);
  1244. }
  1245. //当前扑克
  1246. if (m_CurrentCard.cbCardData!=0)
  1247. {
  1248. //计算位置
  1249. int nXScreenPos=m_ControlPoint.x+m_ControlSize.cx-CARD_WIDTH;
  1250. int nYScreenPos=m_ControlPoint.y+(((m_CurrentCard.bShoot==false)&&(m_wHoverItem!=CountArray(m_CardItemArray)))?POS_SHOOT:0);
  1251. //绘画扑克
  1252. BYTE cbCardData=(m_bDisplayItem==true)?m_CurrentCard.cbCardData:0;
  1253. g_CardResource.m_ImageUserBottom.DrawCardItem(pDC,cbCardData,nXScreenPos,nYScreenPos);
  1254. }
  1255. return;
  1256. }
  1257. //索引切换
  1258. WORD CCardControl::SwitchCardPoint(CPoint & MousePoint)
  1259. {
  1260. //基准位置
  1261. int nXPos=MousePoint.x-m_ControlPoint.x;
  1262. int nYPos=MousePoint.y-m_ControlPoint.y;
  1263. //范围判断
  1264. if ((nXPos<0)||(nXPos>m_ControlSize.cx))
  1265. return INVALID_ITEM;
  1266. if ((nYPos<POS_SHOOT)||(nYPos>m_ControlSize.cy))
  1267. return INVALID_ITEM;
  1268. //牌列子项
  1269. if (nXPos<CARD_WIDTH*CountArray(m_CardItemArray))
  1270. {
  1271. WORD wViewIndex=(WORD)(nXPos/CARD_WIDTH)+m_wCardCount;
  1272. if (wViewIndex>=CountArray(m_CardItemArray))
  1273. return wViewIndex-CountArray(m_CardItemArray);
  1274. return INVALID_ITEM;
  1275. }
  1276. //当前子项
  1277. if ((m_CurrentCard.cbCardData!=0)&&(nXPos>=(m_ControlSize.cx-CARD_WIDTH)))
  1278. return CountArray(m_CardItemArray);
  1279. return INVALID_ITEM;
  1280. }
  1281. //光标消息
  1282. bool CCardControl::OnEventSetCursor(CPoint Point, bool & bRePaint)
  1283. {
  1284. //获取索引
  1285. WORD wHoverItem=SwitchCardPoint(Point);
  1286. //响应判断
  1287. if ((m_bPositively==false)&&(m_wHoverItem!=INVALID_ITEM))
  1288. {
  1289. bRePaint=true;
  1290. m_wHoverItem=INVALID_ITEM;
  1291. }
  1292. //更新判断
  1293. if ((wHoverItem!=m_wHoverItem)&&(m_bPositively==true))
  1294. {
  1295. bRePaint=true;
  1296. m_wHoverItem=wHoverItem;
  1297. SetCursor(LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CARD_CUR)));
  1298. }
  1299. return (wHoverItem!=INVALID_ITEM);
  1300. }
  1301. //////////////////////////////////////////////////////////////////////////
  1302. //////////////////////////////////////////////////////////////////////////
  1303. //变量声明
  1304. CCardResource g_CardResource; //扑克资源
  1305. //////////////////////////////////////////////////////////////////////////