#include "StdAfx.h" #include "Resource.h" #include "CardControl.h" ////////////////////////////////////////////////////////////////////////// //宏定义 //公共定义 #define POS_SHOOT 5 //弹起象素 #define POS_SPACE 8 //分隔间隔 #define ITEM_COUNT 28 //子项数目 #define INVALID_ITEM 0xFFFF //无效索引 //扑克大小 #define CARD_WIDTH 45 //扑克宽度 #define CARD_HEIGHT 72 //扑克高度 ////////////////////////////////////////////////////////////////////////// //构造函数 CCardListImage::CCardListImage() { //位置变量 m_nItemWidth=0; m_nItemHeight=0; m_nViewWidth=0; m_nViewHeight=0; return; } //析构函数 CCardListImage::~CCardListImage() { } //加载资源 bool CCardListImage::LoadResource(LPCTSTR uResourceID, int nViewWidth, int nViewHeight) { //加载资源 //m_CardListImage.LoadFromResource(AfxGetInstanceHandle(),uResourceID); m_CardListImage.LoadImage(AfxGetInstanceHandle(),uResourceID); //设置变量 m_nViewWidth=nViewWidth; m_nViewHeight=nViewHeight; m_nItemHeight=m_CardListImage.GetHeight(); m_nItemWidth=m_CardListImage.GetWidth()/ITEM_COUNT; return true; } //释放资源 bool CCardListImage::DestroyResource() { //设置变量 m_nItemWidth=0; m_nItemHeight=0; //释放资源 //m_CardListImage.Destroy(); return true; } //获取位置 int CCardListImage::GetImageIndex(BYTE cbCardData) { //背景判断 if (cbCardData==0) return 0; //计算位置 BYTE cbValue=cbCardData&MASK_VALUE; BYTE cbColor=(cbCardData&MASK_COLOR)>>4; return (cbColor>=0x03)?(cbValue+27):(cbColor*9+cbValue); } //绘画扑克 bool CCardListImage::DrawCardItem(CDC * pDestDC, BYTE cbCardData, int xDest, int yDest) { //效验状态 ASSERT(m_CardListImage.IsNull()==false); ASSERT((m_nItemWidth!=0)&&(m_nItemHeight!=0)); //绘画子项 if(cbCardData<=0x37) { int nImageXPos=GetImageIndex(cbCardData)*m_nItemWidth; //m_CardListImage.AlphaDrawImage(pDestDC,xDest,yDest,m_nItemWidth,m_nItemHeight,nImageXPos,0,RGB(255,0,255)); m_CardListImage.DrawImage(pDestDC, xDest, //X坐标 yDest, //Y坐标 m_CardListImage.GetWidth()/28, //宽 m_CardListImage.GetHeight(), //高 nImageXPos,//起始位置X 0); } return true; } ////////////////////////////////////////////////////////////////////////// //构造函数 CCardResource::CCardResource() { } //析构函数 CCardResource::~CCardResource() { } //加载资源 bool CCardResource::LoadResource() { //变量定义 HINSTANCE hInstance=AfxGetInstanceHandle(); //用户扑克 m_ImageUserTop.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_USER_TOP")); m_ImageUserBottom.LoadResource(TEXT("CARD_USER_BOTTOM"),CARD_WIDTH,CARD_HEIGHT); m_ImageUserLeft.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_USER_LEFT")); m_ImageUserRight.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_USER_RIGHT")); //桌子扑克 m_ImageTableTop.LoadResource(TEXT("CARD_TABLE_TOP"),31,64); m_ImageTableLeft.LoadResource(TEXT("CARD_TABLE_LEFT"),53,35); m_ImageTableRight.LoadResource(TEXT("CARD_TABLE_RIGHT"),53,35); m_ImageTableBottom.LoadResource(TEXT("CARD_TABLE_BOTTOM"),34,70); //左边 m_ImageHeapDoubleLV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_LV")); m_ImageHeapSingleLV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_LV")); //右边 m_ImageHeapDoubleRV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_RV")); m_ImageHeapSingleRV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_RV")); //上面的 m_ImageHeapDoubleTV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_TV")); m_ImageHeapSingleTV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_TV")); //下面的 m_ImageHeapDoubleBV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_DOUBLE_BV")); m_ImageHeapSingleBV.LoadImage(AfxGetInstanceHandle(),TEXT("CARD_HEAP_SINGLE_BV")); //m_ImageArrow.LoadImage(AfxGetInstanceHandle(),TEXT("ARROW")); return true; } //消耗资源 bool CCardResource::DestroyResource() { //用户扑克 m_ImageUserBottom.DestroyResource(); //桌子扑克 m_ImageTableTop.DestroyResource(); m_ImageTableLeft.DestroyResource(); m_ImageTableRight.DestroyResource(); m_ImageTableBottom.DestroyResource(); return true; } ////////////////////////////////////////////////////////////////////////// //构造函数 CHeapCard::CHeapCard() { //控制变量 m_ControlPoint.SetPoint(0,0); m_CardDirection=Direction_East; //扑克变量 m_wFullCount=0; m_wMinusHeadCount=0; m_wMinusLastCount=0; return; } //析构函数 CHeapCard::~CHeapCard() { } //绘画扑克 void CHeapCard::DrawCardControl(CDC * pDC) { int nOffset=3; //偏移量 switch (m_CardDirection) { case Direction_East: //东向 右 右 { //绘画扑克 if ((m_wFullCount-m_wMinusHeadCount-m_wMinusLastCount)>0) { //变量定义 int nXPos=0,nYPos=0; WORD wHeapIndex=m_wMinusHeadCount/2; WORD wDoubleHeap=(m_wMinusHeadCount+1)/2; WORD wDoubleLast=(m_wFullCount-m_wMinusLastCount)/2; WORD wFinallyIndex=(m_wFullCount-m_wMinusLastCount)/2; //头部扑克 if (m_wMinusHeadCount%2!=0) { nXPos=m_ControlPoint.x + wHeapIndex*nOffset; nYPos=m_ControlPoint.y+wHeapIndex*16+13; g_CardResource.m_ImageHeapSingleRV.DrawImage(pDC, nXPos, //X坐标 nYPos, //Y坐标 g_CardResource.m_ImageHeapSingleRV.GetWidth(), //宽 g_CardResource.m_ImageHeapSingleRV.GetHeight(), //高 0,//起始位置X 0); } //中间扑克 for (WORD i=wDoubleHeap;i0) { //变量定义 int nXPos=0,nYPos=0; WORD wHeapIndex=m_wMinusLastCount/2; WORD wDoubleHeap=(m_wMinusLastCount+1)/2; WORD wDoubleLast=(m_wFullCount-m_wMinusHeadCount)/2; WORD wFinallyIndex=(m_wFullCount-m_wMinusHeadCount)/2; //尾部扑克 if (m_wMinusLastCount%2!=0) { nYPos=m_ControlPoint.y+16; nXPos=m_ControlPoint.x+wHeapIndex*34; //42 g_CardResource.m_ImageHeapSingleBV.DrawImage(pDC, nXPos, //X坐标 nYPos, //Y坐标 g_CardResource.m_ImageHeapSingleBV.GetWidth(), //宽 g_CardResource.m_ImageHeapSingleBV.GetHeight(), //高 0,//起始位置X 0); } //中间扑克 for (WORD i=wDoubleHeap;i0) { //变量定义 int nXPos=0,nYPos=0; WORD wHeapIndex=m_wMinusLastCount/2; WORD wDoubleHeap=(m_wMinusLastCount+1)/2; WORD wDoubleLast=(m_wFullCount-m_wMinusHeadCount)/2; WORD wFinallyIndex=(m_wFullCount-m_wMinusHeadCount)/2; //尾部扑克 if (m_wMinusLastCount%2!=0) { nXPos=m_ControlPoint.x - wHeapIndex*nOffset; nYPos=m_ControlPoint.y+wHeapIndex*16+13; g_CardResource.m_ImageHeapSingleLV.DrawImage(pDC, nXPos, //X坐标 nYPos, //Y坐标 g_CardResource.m_ImageHeapSingleLV.GetWidth(), //宽 g_CardResource.m_ImageHeapSingleLV.GetHeight(), //高 0,//起始位置X 0); } //中间扑克 for (WORD i=wDoubleHeap;i0) { //变量定义 int nXPos=0,nYPos=0; WORD wHeapIndex=m_wMinusHeadCount/2; WORD wDoubleHeap=(m_wMinusHeadCount+1)/2; WORD wDoubleLast=(m_wFullCount-m_wMinusLastCount)/2; WORD wFinallyIndex=(m_wFullCount-m_wMinusLastCount)/2; //头部扑克 if (m_wMinusHeadCount%2!=0) { nYPos=m_ControlPoint.y+15; nXPos=m_ControlPoint.x+wHeapIndex*31; g_CardResource.m_ImageHeapSingleTV.DrawImage(pDC, nXPos, //X坐标 nYPos, //Y坐标 g_CardResource.m_ImageHeapSingleTV.GetWidth(), //宽 g_CardResource.m_ImageHeapSingleTV.GetHeight(), //高 0,//起始位置X 0); } //中间扑克 for (WORD i=wDoubleHeap;iCountArray(m_cbCardData)) return false; //设置扑克 m_wCardCount=wCardCount; CopyMemory(m_cbCardData,cbCardData,sizeof(BYTE)*wCardCount); return true; } //获取扑克 BYTE CWeaveCard::GetCardData(WORD wIndex) { ASSERT(wIndex0) { int nXPos=0,nYPos=0; for (WORD i=0;i0) { int nXPos=0,nYPos=0; for (WORD i=0;i0) { int nXPos=0,nYPos=0; for (WORD i=0;i=8) continue; int nXPos=m_ControlPoint.x+(i/8)*50 + (i%8)*nOffset; int nYPos=m_ControlPoint.y+(i%8)*18; g_CardResource.m_ImageTableRight.DrawCardItem(pDC,m_cbCardData[i],nXPos,nYPos); } for (WORD i=0;i=8) continue; int nXPos=m_ControlPoint.x-((m_wCardCount-1-i)/8)*50 + ((m_wCardCount-1-i)%8)*nOffset; int nYPos=m_ControlPoint.y-((m_wCardCount-1-i)%8)*18; g_CardResource.m_ImageTableLeft.DrawCardItem(pDC,m_cbCardData[m_wCardCount-i-1],nXPos,nYPos); } for (WORD i=0;i=CountArray(m_cbCardData)) { m_wCardCount--; MoveMemory(m_cbCardData,m_cbCardData+1,CountArray(m_cbCardData)-1); } //设置扑克 m_cbCardData[m_wCardCount++]=cbCardData; return true; } //设置扑克 bool CDiscardCard::SetCardData(const BYTE cbCardData[], WORD wCardCount) { //效验大小 ASSERT(wCardCount<=CountArray(m_cbCardData)); if (wCardCount>CountArray(m_cbCardData)) return false; //设置扑克 m_wCardCount=wCardCount; CopyMemory(m_cbCardData,cbCardData,sizeof(m_cbCardData[0])*wCardCount); return true; } //获取位置 CPoint CDiscardCard::GetLastCardPosition() { switch (m_CardDirection) { case Direction_East: //东向 右 { //变量定义 int nCellWidth=g_CardResource.m_ImageTableRight.GetViewWidth(); int nCellHeight=g_CardResource.m_ImageTableRight.GetViewHeight(); int nXPos=m_ControlPoint.x+((m_wCardCount-1)/8)*50+18 + ((m_wCardCount-1)%8)*2 ; int nYPos=m_ControlPoint.y+((m_wCardCount-1)%8)*18+11; return CPoint(nXPos,nYPos); } case Direction_South: //南向 下 { //变量定义 int nCellWidth=g_CardResource.m_ImageTableBottom.GetViewWidth(); int nCellHeight=g_CardResource.m_ImageTableBottom.GetViewHeight(); int nXPos=m_ControlPoint.x-((m_wCardCount-1)%8)*34+14 + 2; int nYPos=m_ControlPoint.y+((m_wCardCount-1)/8)*35+16; return CPoint(nXPos,nYPos); } case Direction_West: //西向 左 { //变量定义 int nCellWidth=g_CardResource.m_ImageTableLeft.GetViewWidth(); int nCellHeight=g_CardResource.m_ImageTableLeft.GetViewHeight(); int nXPos=m_ControlPoint.x-((m_wCardCount-1)/8)*50+17 + ((m_wCardCount-1)%8)*2 + 20; int nYPos=m_ControlPoint.y-((m_wCardCount-1)%8)*18+10; return CPoint(nXPos,nYPos); } case Direction_North: //北向 上 { //变量定义 int nCellWidth=g_CardResource.m_ImageTableTop.GetViewWidth(); int nCellHeight=g_CardResource.m_ImageTableTop.GetViewHeight(); int nXPos=m_ControlPoint.x+((m_wCardCount-1)%8)*30+14; int nYPos=m_ControlPoint.y+((-m_wCardCount+1)/8)*35+17 - 10; return CPoint(nXPos,nYPos); } } return CPoint(0,0); } ////////////////////////////////////////////////////////////////////////// //构造函数 CTableCard::CTableCard() { //扑克数据 m_wCardCount=0; ZeroMemory(m_cbCardData,sizeof(m_cbCardData)); //控制变量 m_ControlPoint.SetPoint(0,0); m_CardDirection=Direction_East; return; } //析构函数 CTableCard::~CTableCard() { } //绘画扑克 void CTableCard::DrawCardControl(CDC * pDC) { int nOffset=3; //偏移量 //绘画控制 switch (m_CardDirection) { case Direction_East: //东向 右 { //绘画扑克 for (WORD i=0;iCountArray(m_cbCardData)) return false; //设置扑克 m_wCardCount=wCardCount; CopyMemory(m_cbCardData,cbCardData,sizeof(m_cbCardData[0])*wCardCount); return true; } ////////////////////////////////////////////////////////////////////////// //构造函数 CCardControl::CCardControl() { //状态变量 m_bPositively=false; m_bDisplayItem=false; //位置变量 m_XCollocateMode=enXCenter; m_YCollocateMode=enYCenter; m_BenchmarkPos.SetPoint(0,0); //扑克数据 m_wCardCount=0; m_wHoverItem=INVALID_ITEM; ZeroMemory(&m_CurrentCard,sizeof(m_CurrentCard)); ZeroMemory(&m_CardItemArray,sizeof(m_CardItemArray)); //加载设置 m_ControlPoint.SetPoint(0,0); m_ControlSize.cy=CARD_HEIGHT+POS_SHOOT; m_ControlSize.cx=(CountArray(m_CardItemArray)+1)*CARD_WIDTH+POS_SPACE; return; } //析构函数 CCardControl::~CCardControl() { } //基准位置 void CCardControl::SetBenchmarkPos(int nXPos, int nYPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode) { //设置变量 m_BenchmarkPos.x=nXPos; m_BenchmarkPos.y=nYPos; m_XCollocateMode=XCollocateMode; m_YCollocateMode=YCollocateMode; //横向位置 switch (m_XCollocateMode) { case enXLeft: { m_ControlPoint.x=m_BenchmarkPos.x; break; } case enXCenter: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx/2; break; } case enXRight: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx; break; } } //竖向位置 switch (m_YCollocateMode) { case enYTop: { m_ControlPoint.y=m_BenchmarkPos.y; break; } case enYCenter: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy/2; break; } case enYBottom: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy; break; } } return; } //基准位置 void CCardControl::SetBenchmarkPos(const CPoint & BenchmarkPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode) { //设置变量 m_BenchmarkPos=BenchmarkPos; m_XCollocateMode=XCollocateMode; m_YCollocateMode=YCollocateMode; //横向位置 switch (m_XCollocateMode) { case enXLeft: { m_ControlPoint.x=m_BenchmarkPos.x; break; } case enXCenter: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx/2; break; } case enXRight: { m_ControlPoint.x=m_BenchmarkPos.x-m_ControlSize.cx; break; } } //竖向位置 switch (m_YCollocateMode) { case enYTop: { m_ControlPoint.y=m_BenchmarkPos.y; break; } case enYCenter: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy/2; break; } case enYBottom: { m_ControlPoint.y=m_BenchmarkPos.y-m_ControlSize.cy; break; } } return; } //获取扑克 BYTE CCardControl::GetHoverCard() { //获取扑克 if (m_wHoverItem!=INVALID_ITEM) { if (m_wHoverItem==CountArray(m_CardItemArray)) return m_CurrentCard.cbCardData; return m_CardItemArray[m_wHoverItem].cbCardData; } return 0; } //设置扑克 bool CCardControl::SetCurrentCard(BYTE cbCardData) { //设置变量 m_CurrentCard.bShoot=false; m_CurrentCard.cbCardData=cbCardData; return true; } //设置扑克 bool CCardControl::SetCurrentCard(tagCardItem CardItem) { //设置变量 m_CurrentCard.bShoot=CardItem.bShoot; m_CurrentCard.cbCardData=CardItem.cbCardData; return true; } //设置扑克 bool CCardControl::SetCardData(const BYTE cbCardData[], WORD wCardCount, BYTE cbCurrentCard) { //效验大小 ASSERT(wCardCount<=CountArray(m_CardItemArray)); if (wCardCount>CountArray(m_CardItemArray)) return false; //当前扑克 m_CurrentCard.bShoot=false; m_CurrentCard.cbCardData=cbCurrentCard; //设置扑克 m_wCardCount=wCardCount; for (WORD i=0;iCountArray(m_CardItemArray)) return false; //设置扑克 m_wCardCount=wCardCount; for (WORD i=0;im_ControlSize.cx)) return INVALID_ITEM; if ((nYPosm_ControlSize.cy)) return INVALID_ITEM; //牌列子项 if (nXPos=CountArray(m_CardItemArray)) return wViewIndex-CountArray(m_CardItemArray); return INVALID_ITEM; } //当前子项 if ((m_CurrentCard.cbCardData!=0)&&(nXPos>=(m_ControlSize.cx-CARD_WIDTH))) return CountArray(m_CardItemArray); return INVALID_ITEM; } //光标消息 bool CCardControl::OnEventSetCursor(CPoint Point, bool & bRePaint) { //获取索引 WORD wHoverItem=SwitchCardPoint(Point); //响应判断 if ((m_bPositively==false)&&(m_wHoverItem!=INVALID_ITEM)) { bRePaint=true; m_wHoverItem=INVALID_ITEM; } //更新判断 if ((wHoverItem!=m_wHoverItem)&&(m_bPositively==true)) { bRePaint=true; m_wHoverItem=wHoverItem; SetCursor(LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CARD_CUR))); } return (wHoverItem!=INVALID_ITEM); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //变量声明 CCardResource g_CardResource; //扑克资源 //////////////////////////////////////////////////////////////////////////