通比牛牛(鬼做万能牌的)【源码】

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-6-13 11:50:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

#include "StdAfx.h"
#include "Resource.h"
#include "CardControl.h"


//////////////////////////////////////////////////////////////////////////
//静态变量

bool                    CCardControl::m_bLoad=false;                    //加载标志
CSize                    CCardControl::m_CardSize;                        //扑克大小
CSkinImage                CCardControl::m_ImageCard;                        //图片资源

//////////////////////////////////////////////////////////////////////////

BEGIN_MESSAGE_MAP(CCardControl, CWnd)
    ON_WM_PAINT()
    ON_WM_CREATE()
    ON_WM_SETCURSOR()
    ON_WM_LBUTTONUP()
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////

//构造函数
CCardControl::CCardControl()
{
    //金牛银牛
    m_bGoldSilver = false;

    //配置变量
    m_bDisplay=false;
    m_bHorizontal=true;
    m_bPositively=false;
    m_bKey=false;
    m_bOX=false;
    m_dwDrawHeight=0;
    //m_bScot=false;

    //间隔变量
    m_dwCardHSpace=20;
    m_dwCardVSpace=18;
    m_dwShootAltitude=20;

    //位置变量
    m_XCollocateMode=enXCenter;
    m_YCollocateMode=enYCenter;
    m_BenchmarkPos.SetPoint(0,0);

    //运行变量
    m_dwCurrentIndex=0xFFFFFFFF;

    //内部数据
    m_pSinkWindow=NULL;

    //资源变量
    //资源变量
    if (m_bLoad==false)
    {
        //加载资源
        m_bLoad=true;
        m_ImageCard.SetLoadInfo("Ox\\image\\CARD.bmp");

        //获取大小
        CImageHandle CardImageHandle(&m_ImageCard);
        m_CardSize.cx=m_ImageCard.GetWidth()/13;
        m_CardSize.cy=m_ImageCard.GetHeight()/5;

    }

    return;
}

//析构函数
CCardControl::~CCardControl()
{
}

//设置窗口
void CCardControl::SetSinkWindow(CWnd * pSinkWindow)
{
    //设置变量
    m_pSinkWindow=pSinkWindow;

    return;
}

//设置方向
void CCardControl::SetDirection(bool bHorizontal)
{
    //状态判断
    if (m_bHorizontal==bHorizontal) return;

    //设置变量
    m_bHorizontal=bHorizontal;

    //调整控件
    if (m_hWnd!=NULL) RectifyControl();

    return;
}

//绘画设置
void CCardControl::SetDrawHeight(DWORD dwDrawHeight)
{
    m_dwDrawHeight=dwDrawHeight;

    return;
}

//设置牛牛
void CCardControl::SetOX(bool bOX)
{
    m_bOX=bOX;

    return;
}

//设置快捷键
void CCardControl::SetKey(bool bKey)
{
    m_bKey=bKey;

    return;
}

//弹起扑克
void CCardControl::ShootAllCard(bool bShoot)
{
    //变量定义
    bool bRectify=false;
    tagCardItem * pCardItem=NULL;
    DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();

    //设置扑克
    for (DWORD i=0;i<dwCardCount;i++)
    {
        //获取扑克
        pCardItem=&m_CardDataItem;

        //扑克分析
        if (pCardItem->bShoot!=bShoot)
        {
            bRectify=true;
            pCardItem->bShoot=bShoot;
        }
    }

    //调整控件
    if (bRectify==true) RectifyControl();

    return;
}

//设置显示
void CCardControl::SetDisplayFlag(bool bDisplay)
{
    //状态判断
    if (m_bDisplay==bDisplay) return;

    //设置变量
    m_bDisplay=bDisplay;

    //重画控件
    if (m_hWnd!=NULL) Invalidate(FALSE);

    return;
}

//设置响应
void CCardControl::SetPositively(bool bPositively)
{
    //设置变量
    m_bPositively=bPositively;

    return;
}

//设置间距
void CCardControl::SetCardSpace(DWORD dwCardHSpace, DWORD dwCardVSpace, DWORD dwShootAltitude)
{
    //设置变量
    m_dwCardHSpace=dwCardHSpace;
    m_dwCardVSpace=dwCardVSpace;
    m_dwShootAltitude=dwShootAltitude;

    //调整控件
    if (m_hWnd!=NULL) RectifyControl();

    return;
}

//基准位置
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;

    //调整控件
    if (m_hWnd!=NULL) RectifyControl();

    return;
}

//基准位置
void CCardControl::SetBenchmarkPos(const CPoint & BenchmarkPos, enXCollocateMode XCollocateMode, enYCollocateMode YCollocateMode)
{
    //设置变量
    m_BenchmarkPos=BenchmarkPos;
    m_XCollocateMode=XCollocateMode;
    m_YCollocateMode=YCollocateMode;

    //调整控件
    if (m_hWnd!=NULL) RectifyControl();

    return;
}

//获取数目
DWORD CCardControl::GetCardCount()
{
    return (DWORD)m_CardDataItem.GetCount();
}

//获取弹起扑克数目
DWORD CCardControl::GetShootCount()
{
    //变量定义
    DWORD bShootCount=0L;
    DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();

    //搜索扑克
    tagCardItem * pCardItem=NULL;
    for (DWORD i=0;i<dwCardCount;i++)
    {
        //获取扑克
        pCardItem=&m_CardDataItem;

        //扑克分析
        if (pCardItem->bShoot)
        {
            bShootCount++;
        }
    }

    return bShootCount;
}

//获取扑克
DWORD CCardControl::GetShootCard(BYTE bCardData[],bool bShoot)
{
    //变量定义
    DWORD bShootCount=0L;
    DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();

    //搜索扑克
    tagCardItem * pCardItem=NULL;
    for (DWORD i=0;i<dwCardCount;i++)
    {
        //获取扑克
        pCardItem=&m_CardDataItem;

        //扑克分析
        if (pCardItem->bShoot==bShoot)
        {
            bCardData[bShootCount++]=pCardItem->bCardData;
        }
    }

    return bShootCount;
}

//设置扑克
DWORD CCardControl::SetCardData(const BYTE bCardData[], DWORD dwCardCount)
{
    //设置扑克
    m_CardDataItem.SetSize(dwCardCount);
    for (DWORD i=0;i<dwCardCount;i++)
    {
        m_CardDataItem.bShoot=false;
        m_CardDataItem.bCardData=bCardData;
    }

    //调整控件
    if (m_hWnd!=NULL) RectifyControl();

    return dwCardCount;
}
//获取扑克
DWORD CCardControl::GetCardData(BYTE cbCardData[],DWORD dwMaxCount)
{
    //效验参数
    ASSERT(dwMaxCount>=(DWORD)m_CardDataItem.GetCount());

    //拷贝扑克
    DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();
    for (DWORD i=0;i<dwCardCount;i++)
    {
        cbCardData=m_CardDataItem.GetAt((int)i).bCardData;
    }

    return dwCardCount;
}

//获取位置
CPoint CCardControl::GetCardPos()
{
    //变量定义
    DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();

    //计算大小
    CSize ControlSize;
    ControlSize.cy=m_CardSize.cy;
    ControlSize.cx=(dwCardCount>0)?(m_CardSize.cx+(dwCardCount-1)*m_dwCardHSpace):0;

    //横向位置
    int nXPos=0;
    switch (m_XCollocateMode)
    {
    case enXLeft:    { nXPos=m_BenchmarkPos.x; break; }
    case enXCenter: { nXPos=m_BenchmarkPos.x-ControlSize.cx/2; break; }
    case enXRight:    { nXPos=m_BenchmarkPos.x-ControlSize.cx; break; }
    }

    //竖向位置
    int nYPos=0;
    switch (m_YCollocateMode)
    {
    case enYTop:    { nYPos=m_BenchmarkPos.y; break; }
    case enYCenter: { nYPos=m_BenchmarkPos.y-ControlSize.cy/2; break; }
    case enYBottom: { nYPos=m_BenchmarkPos.y-ControlSize.cy; break; }
    }

    CPoint cpTemp;
    cpTemp.x=nXPos;
    cpTemp.y=nYPos;

    return cpTemp;
}

//设置扑克
DWORD CCardControl::SetCardItem(const tagCardItem CardItemArray[], DWORD dwCardCount)
{
    //设置扑克
    m_CardDataItem.SetSize(dwCardCount);
    CopyMemory(m_CardDataItem.GetData(),CardItemArray,dwCardCount*sizeof(tagCardItem));

    //调整控件
    if (m_hWnd!=NULL) RectifyControl();

    return 0;
}

//设置弹起扑克
DWORD CCardControl::SetShootCard(const BYTE bCardDataIndex[], DWORD dwCardCount)
{
    //变量定义
    bool bChangeStatus=false;

    //收起扑克
    for (WORD i=0;i<m_CardDataItem.GetCount();i++)
    {
        if (m_CardDataItem.bShoot==true)
        {
            bChangeStatus=true;
            m_CardDataItem.bShoot=false;
        }
    }

    //弹起扑克
    for (WORD i=0;i<dwCardCount;i++)
    {
        for (WORD j=0;j<m_CardDataItem.GetCount();j++)
        {
            if ((m_CardDataItem[j].bShoot==false)&&(m_CardDataItem[j].bCardData==bCardDataIndex))
            {
                bChangeStatus=true;
                m_CardDataItem[j].bShoot=true;
                break;
            }
        }
    }

    //调整控件
    RectifyControl();

    return 0;
}

//调整位置
void CCardControl::RectifyControl()
{
    //变量定义
    DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();

    //计算大小
    CSize ControlSize;
    if (m_bHorizontal==true)
    {
        ControlSize.cy=m_CardSize.cy+m_dwShootAltitude;
        ControlSize.cx=(dwCardCount>0)?(m_CardSize.cx+(dwCardCount-1)*m_dwCardHSpace):0;
    }
    else
    {
        ControlSize.cx=m_CardSize.cx;
        ControlSize.cy=(dwCardCount>0)?(m_CardSize.cy+(dwCardCount-1)*m_dwCardVSpace):0;
    }

    //横向位置
    int nXPos=0;
    switch (m_XCollocateMode)
    {
    case enXLeft:    { nXPos=m_BenchmarkPos.x; break; }
    case enXCenter: { nXPos=m_BenchmarkPos.x-ControlSize.cx/2; break; }
    case enXRight:    { nXPos=m_BenchmarkPos.x-ControlSize.cx; break; }
    }

    //竖向位置
    int nYPos=0;
    switch (m_YCollocateMode)
    {
    case enYTop:    { nYPos=m_BenchmarkPos.y; break; }
    case enYCenter: { nYPos=m_BenchmarkPos.y-ControlSize.cy/2; break; }
    case enYBottom: { nYPos=m_BenchmarkPos.y-ControlSize.cy; break; }
    }

    //移动位置
    SetWindowPos(NULL,nXPos,nYPos,ControlSize.cx,ControlSize.cy,SWP_NOZORDER);

    //变量定义
    CRgn CardRegion,SignedRegion;
    tagCardItem * pCardItem=NULL;

    //设置区域
    CardRegion.CreateRectRgn(0,0,0,0);
    for (DWORD i=0;i<dwCardCount;i++)
    {
        //获取扑克
        pCardItem=&m_CardDataItem;

        //计算位置
        if (m_bHorizontal==true)
        {
            nXPos=m_dwCardHSpace*i;
            nYPos=(pCardItem->bShoot==false)?m_dwShootAltitude:0;
        }
        else
        {
            nXPos=0;
            nYPos=m_dwCardVSpace*i;
        }

        //合并区域
        SignedRegion.CreateRoundRectRgn(nXPos,nYPos,nXPos+m_CardSize.cx+1,nYPos+m_CardSize.cy+1,2,2);
        CardRegion.CombineRgn(&CardRegion,&SignedRegion,RGN_OR);
        SignedRegion.DeleteObject();
    }

    //设置区域
    SetWindowRgn(CardRegion,TRUE);
    m_CardRegion.DeleteObject();
    m_CardRegion.Attach(CardRegion.Detach());

    //重画界面
    Invalidate(TRUE);

    return;
}

//索引切换
DWORD CCardControl::SwitchCardPoint(const CPoint & MousePoint)
{
    if (m_bHorizontal==true)
    {
        //变量定义
        DWORD dwCardCount=(DWORD)m_CardDataItem.GetCount();

        //获取索引
        DWORD dwCardIndex=MousePoint.x/m_dwCardHSpace;
        if (dwCardIndex>=dwCardCount) dwCardIndex=(dwCardCount-1);

        //判断按键
        bool bCurrentCard=true;
        bool bCardShoot=m_CardDataItem[dwCardIndex].bShoot;
        if ((bCardShoot==true)&&(MousePoint.y>m_CardSize.cy)) bCurrentCard=false;
        if ((bCardShoot==false)&&(MousePoint.y<(INT)m_dwShootAltitude)) bCurrentCard=false;

        //向前寻找
        if (bCurrentCard==false)
        {
            while (dwCardIndex>0)
            {
                dwCardIndex--;
                bCardShoot=m_CardDataItem[dwCardIndex].bShoot;
                if ((bCardShoot==false)&&(MousePoint.y>m_CardSize.cx)) break;
                if ((bCardShoot==true)&&(MousePoint.y<(INT)m_dwShootAltitude)) break;
            }
        }

        return dwCardIndex;
    }

    return DWORD(-1);
}

//重画函数
void CCardControl::OnPaint()
{
    CPaintDC dc(this);

    //绘画扑克
    DWORD dwXImagePos,dwYImagePos;
    DWORD dwXScreenPos,dwYScreenPos;

    //加载位图
    CImageHandle HandleCard(&m_ImageCard);

    //获取位置
    CRect rcClient;
    GetClientRect(&rcClient);

    if(m_dwDrawHeight>0)rcClient.bottom=48;

    //创建位图
    CBitmap BufferImage;
    BufferImage.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());

    //创建 DC
    CDC BufferDC;
    BufferDC.CreateCompatibleDC(&dc);
    BufferDC.SelectObject(&BufferImage);

    for (INT i=0;i<m_CardDataItem.GetCount();i++)
    {
        //获取扑克
        tagCardItem * pCardItem=&m_CardDataItem;

        //图片位置
        if ((m_bDisplay==true)&&(pCardItem->bCardData!=0))
        {
            if ((pCardItem->bCardData==0x4E)||(pCardItem->bCardData==0x4F))
            {
                dwXImagePos=((pCardItem->bCardData&CARD_MASK_VALUE)%14)*m_CardSize.cx;
                dwYImagePos=((pCardItem->bCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy;
            }
            else
            {
                dwXImagePos=((pCardItem->bCardData&CARD_MASK_VALUE)-1)*m_CardSize.cx;
                dwYImagePos=((pCardItem->bCardData&CARD_MASK_COLOR)>>4)*m_CardSize.cy;
            }
        }
        else
        {
            dwXImagePos=m_CardSize.cx*2;
            dwYImagePos=m_CardSize.cy*4;
        }

        //屏幕位置
        if (m_bHorizontal==true)
        {
            dwXScreenPos=m_dwCardHSpace*i;
            dwYScreenPos=(pCardItem->bShoot==false)?m_dwShootAltitude:0;
        }
        else
        {
            dwXScreenPos=0;
            dwYScreenPos=m_dwCardVSpace*i;
        }

        //绘画扑克
        m_ImageCard.BitBlt(BufferDC,dwXScreenPos,dwYScreenPos,m_CardSize.cx,m_CardSize.cy,dwXImagePos,dwYImagePos);
    }

    //绘画界面
    dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&BufferDC,0,0,SRCCOPY);

    //清理资源
    BufferDC.DeleteDC();
    BufferImage.DeleteObject();

    return;
}

//建立消息
int CCardControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (__super::OnCreate(lpCreateStruct)==-1) return -1;

    //设置背景
    SetClassLong(m_hWnd,GCL_HBRBACKGROUND,NULL);

    return 0;
}

//鼠标消息
void CCardControl::OnLButtonUp(UINT nFlags, CPoint Point)
{
    __super::OnLButtonUp(nFlags, Point);

    //状态判断
    if (m_dwCurrentIndex==0xFFFFFFFF) return;
    if ((m_bHorizontal==false)||(m_bPositively==false)) return;

    //获取索引
    DWORD dwCurrentIndex=SwitchCardPoint(Point);
    if (dwCurrentIndex!=m_dwCurrentIndex) return;

    //设置控件
    tagCardItem * pCardItem=&m_CardDataItem[dwCurrentIndex];
    pCardItem->bShoot=!pCardItem->bShoot;

    bool bHaveOx = false;
    if (m_bGoldSilver)
    {
        bHaveOx = true;
        AfxGetMainWnd()->PostMessage(IDM_OX_ENABLE,2,0);
    }
    else
    {
        //判断牛牛
        DWORD dwShootCount=GetShootCount();
        if(dwShootCount==2)
        {
            //获取数据
            BYTE bCardData[MAX_COUNT];
            ZeroMemory(bCardData,sizeof(bCardData));
            BYTE bCount=(BYTE)GetShootCard(bCardData,false);
            ASSERT(bCount==3);

            //十的倍数
            if(m_GameLogic.IsIntValue(bCardData,bCount))
            {
                bHaveOx = true;
                AfxGetMainWnd()->PostMessage(IDM_OX_ENABLE,1,0);
            }
        }
        else if(dwShootCount==3)
        {
            //获取数据
            BYTE bCardData[MAX_COUNT];
            ZeroMemory(bCardData,sizeof(bCardData));
            BYTE bCount=(BYTE)GetShootCard(bCardData);
            ASSERT(bCount==3);

            //十的倍数
            if(m_GameLogic.IsIntValue(bCardData,bCount))
            {
                bHaveOx = true;
                AfxGetMainWnd()->PostMessage(IDM_OX_ENABLE,1,1);
            }
        }
    }

    if(!bHaveOx)AfxGetMainWnd()->PostMessage(IDM_OX_ENABLE,0,0);

    //调整控件
    RectifyControl();

    return;
}

//鼠标消息
void CCardControl::OnLButtonDown(UINT nFlags, CPoint Point)
{
    __super::OnLButtonDown(nFlags, Point);

    //状态判断
    if ((m_bHorizontal==false)||(m_bPositively==false)) return;

    //获取索引
    m_dwCurrentIndex=SwitchCardPoint(Point);

    return;
}

//光标消息
BOOL CCardControl::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message)
{
    //设置光标
    if (m_bPositively==true)
    {
        SetCursor(LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CARD_CUR)));
        return TRUE;
    }

    return __super::OnSetCursor(pWnd,nHitTest,message);
}

//////////////////////////////////////////////////////////////////////////

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表