?? cardcontrol.cpp
字號:
#include "StdAfx.h"
#include "GameClient.h"
#include "CardControl.h"
//////////////////////////////////////////////////////////////////////////
//宏定義
#define INVALID_ITEM 0xFFFF //無效子項
//////////////////////////////////////////////////////////////////////////
//構造函數
CCardControl::CCardControl()
{
//狀態變量
m_bPositively=false;
m_bDisplayHead=false;
m_nXOrgDistance=DEF_X_DISTANCE;
m_nXDistance = DEF_X_DISTANCE;
//
m_bMoving = false;
m_nYStep = 0;
m_nYMove = 0;
m_cbShowIndex = 0xff;
//撲克數據
m_wCardCount=0;
ZeroMemory(m_CardItem,sizeof(m_CardItem));
//位置變量
m_YCollocateMode=enYTop;
m_XCollocateMode=enXLeft;
m_BenchmarkPos.SetPoint(0,0);
//加載資源
m_ImageCard.SetLoadInfo(IDB_CARD,AfxGetInstanceHandle());
//獲取大小
CImageHandle HandleImage(&m_ImageCard);
m_CardSize.SetSize(m_ImageCard.GetWidth()/13,m_ImageCard.GetHeight()/5);
return;
}
//析構函數
CCardControl::~CCardControl()
{
}
//獲取撲克
WORD CCardControl::GetCardData(BYTE cbCardData[], WORD wBufferCount)
{
//效驗參數
WORD wCardCount = __min(wBufferCount,m_wCardCount);
//拷貝撲克
for( WORD i = 0; i < wCardCount; i++ )
cbCardData[i] = m_CardItem[i].cbCardData;
return m_wCardCount;
}
//設置撲克
bool CCardControl::SetCardData(const BYTE cbCardData[], WORD wCardCount)
{
//效驗參數
ASSERT(wCardCount<=CountArray(m_CardItem));
if (wCardCount>CountArray(m_CardItem)) return false;
//設置變量
m_wCardCount=wCardCount;
for( WORD i = 0; i < wCardCount; i++ )
{
m_CardItem[i].cbCardData = cbCardData[i];
m_CardItem[i].bDisplay = (i==0)?m_bDisplayHead:true;
}
m_bMoving = false;
m_nXDistance = m_nXOrgDistance;
m_cbShowIndex = 0xff;
return true;
}
//基準位置
VOID CCardControl::SetBasicStation(const CPoint & BenchmarkPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode)
{
//設置變量
m_BenchmarkPos=BenchmarkPos;
m_XCollocateMode=XCollocateMode;
m_YCollocateMode=YCollocateMode;
m_bMoving = false;
m_nXDistance = m_nXOrgDistance;
m_cbShowIndex = 0xff;
return;
}
//繪畫撲克
VOID CCardControl::DrawCardControl(CDC * pDC)
{
//加載位圖
CImageHandle HandleCard(&m_ImageCard);
//獲取位置
CPoint OriginPoint;
GetOriginPoint(OriginPoint);
//繪畫撲克
INT nXImagePos=0,nYImagePos=0;
BYTE cbCardData = 0;
if( !m_bMoving || m_nXDistance > 0 )
{
for (WORD i=0;i<m_wCardCount;i++)
{
//變量定義
cbCardData=m_CardItem[i].cbCardData;
//圖片位置
if ( m_CardItem[i].bDisplay && cbCardData != 0 && cbCardData != 0xFF )
{
nXImagePos=((cbCardData&CARD_MASK_VALUE)-1)*m_CardSize.cx;
nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy;
}
else
{
nXImagePos=m_CardSize.cx*2;
nYImagePos=m_CardSize.cy*4;
}
//繪畫撲克
m_ImageCard.AlphaDrawImage(pDC,OriginPoint.x+m_nXDistance*i,OriginPoint.y,m_CardSize.cx,m_CardSize.cy,nXImagePos,nYImagePos,RGB(255,0,255));
}
}
else
{
ASSERT( m_bMoving && m_cbShowIndex < m_wCardCount );
cbCardData = m_CardItem[m_cbShowIndex].cbCardData;
ASSERT( cbCardData != 0 );
nXImagePos=((cbCardData&CARD_MASK_VALUE)-1)*m_CardSize.cx;
nYImagePos=((cbCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy;
INT nYMove = __min(m_nYMove,33);
m_ImageCard.AlphaDrawImage( pDC,OriginPoint.x,OriginPoint.y-nYMove,m_CardSize.cx,m_CardSize.cy,nXImagePos,nYImagePos,RGB(255,0,255) );
nXImagePos=m_CardSize.cx*2;
nYImagePos=m_CardSize.cy*4;
m_ImageCard.AlphaDrawImage( pDC,OriginPoint.x,OriginPoint.y,m_CardSize.cx,m_CardSize.cy,nXImagePos,nYImagePos,RGB(255,0,255) );
}
return;
}
//光標消息
bool CCardControl::OnEventSetCursor(CPoint Point)
{
//光標處理
if (m_bPositively==true&&!m_bMoving)
{
//獲取索引
WORD wHoverItem=SwitchCardPoint(Point);
//更新判斷
if (wHoverItem!=INVALID_ITEM&&!m_CardItem[wHoverItem].bDisplay)
{
SetCursor(LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CARD_CUR)));
return true;
}
}
return false;
}
//鼠標消息
bool CCardControl::OnEventLeftMouseDown(CPoint Point)
{
//光標處理
if ((m_bPositively==true)&&!m_bMoving)
{
//獲取索引
WORD wHoverItem=SwitchCardPoint(Point);
if( wHoverItem != INVALID_ITEM && !m_CardItem[wHoverItem].bDisplay )
{
m_cbShowIndex = (BYTE)wHoverItem;
return true;
}
}
return false;
}
//
bool CCardControl::OnEventLeftMouseUp(CPoint Point)
{
//光標處理
if ((m_bPositively==true)&&!m_bMoving)
{
//獲取索引
WORD wHoverItem=SwitchCardPoint(Point);
if( wHoverItem != INVALID_ITEM )
{
m_cbShowIndex = (BYTE)wHoverItem;
return true;
}
}
return false;
}
//獲取大小
VOID CCardControl::GetControlSize(CSize & ControlSize)
{
//獲取大小
ControlSize.cy=m_CardSize.cy;
ControlSize.cx=(m_wCardCount>0)?(m_CardSize.cx+(m_wCardCount-1)*m_nXDistance):0;
return;
}
//索引切換
WORD CCardControl::SwitchCardPoint(CPoint & MousePoint)
{
if( m_bMoving ) return INVALID_ITEM;
//獲取位置
CSize ControlSize;
CPoint OriginPoint;
GetControlSize(ControlSize);
GetOriginPoint(OriginPoint);
//基準位置
INT nXPos=MousePoint.x-OriginPoint.x;
INT nYPos=MousePoint.y-OriginPoint.y;
//越界判斷
if ((nXPos<=0)||(nXPos>=ControlSize.cx)) return INVALID_ITEM;
if ((nYPos<=0)||(nYPos>=ControlSize.cy)) return INVALID_ITEM;
//計算索引
WORD wCardIndex=nXPos/m_nXDistance;
if (wCardIndex>=m_wCardCount) wCardIndex=(m_wCardCount-1);
return wCardIndex;
}
//獲取原點
VOID CCardControl::GetOriginPoint(CPoint & OriginPoint)
{
//獲取位置
CSize ControlSize;
GetControlSize(ControlSize);
//橫向位置
switch (m_XCollocateMode)
{
case enXLeft: { OriginPoint.x=m_BenchmarkPos.x; break; }
case enXCenter: { OriginPoint.x=m_BenchmarkPos.x-ControlSize.cx/2; break; }
case enXRight: { OriginPoint.x=m_BenchmarkPos.x-ControlSize.cx; break; }
}
//豎向位置
switch (m_YCollocateMode)
{
case enYTop: { OriginPoint.y=m_BenchmarkPos.y; break; }
case enYCenter: { OriginPoint.y=m_BenchmarkPos.y-ControlSize.cy/2; break; }
case enYBottom: { OriginPoint.y=m_BenchmarkPos.y-ControlSize.cy; break; }
}
return;
}
//獲取牌尾位置
CPoint CCardControl::GetTailPos()
{
CPoint ptTail;
//計算大小
INT nSpaceWidth = m_wCardCount*m_nXDistance;
CSize ControlSize;
GetControlSize(ControlSize);
//橫向位置
switch (m_XCollocateMode)
{
case enXLeft: { ptTail.x=m_BenchmarkPos.x+nSpaceWidth; break; }
case enXCenter: { ptTail.x=m_BenchmarkPos.x-ControlSize.cx/2+nSpaceWidth; break; }
case enXRight: { ptTail.x=m_BenchmarkPos.x-ControlSize.cx+nSpaceWidth; break; }
}
//豎向位置
switch (m_YCollocateMode)
{
case enYTop: { ptTail.y=m_BenchmarkPos.y; break; }
case enYCenter: { ptTail.y=m_BenchmarkPos.y-ControlSize.cy/2; break; }
case enYBottom: { ptTail.y=m_BenchmarkPos.y-ControlSize.cy; break; }
}
return ptTail;
}
//
bool CCardControl::BeginMoveCard()
{
if( m_bMoving ) return false;
ASSERT( m_cbShowIndex < m_wCardCount );
if( m_cbShowIndex >= m_wCardCount ) return false;
m_bMoving = true;
m_nYStep = MOVE_STEP_Y;
m_nYMove = 0;
return true;
}
//
bool CCardControl::PlayMoveCard()
{
if( !m_bMoving ) return false;
if( m_nXDistance > 0 )
m_nXDistance = __max(m_nXDistance-MOVE_STEP_X,0);
else
{
if( m_nYMove >= MAX_MOVE_Y ) m_nYStep = -m_nYStep;
m_nYMove += m_nYStep;
if( m_nYMove <= 0 )
{
m_bMoving = false;
m_nXDistance = m_nXOrgDistance;
m_cbShowIndex = 0xff;
}
}
return true;
}
//
VOID CCardControl::SetXDistance( UINT nXDistance )
{
m_nXOrgDistance = nXDistance;
}
//
VOID CCardControl::AllowPositively( bool bPositively )
{
m_bPositively = bPositively;
m_bMoving = false;
m_nXDistance = m_nXOrgDistance;
m_cbShowIndex = 0xff;
}
//
VOID CCardControl::ShowFirstCard( bool bDisplayHead )
{
m_bDisplayHead = bDisplayHead;
if( m_wCardCount > 0 )
m_CardItem[0].bDisplay = bDisplayHead;
m_bMoving = false;
m_nXDistance = m_nXOrgDistance;
m_cbShowIndex = 0xff;
}
//
void CCardControl::SetDispalyCard( WORD wCardIndex,bool bDisplay )
{
ASSERT( wCardIndex < m_wCardCount );
if( wCardIndex >= m_wCardCount ) return;
m_CardItem[wCardIndex].bDisplay = bDisplay;
}
//////////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -