📄 programview.cpp
字号:
// ProgramView.cpp : implementation of the CProgramView class
//
#include "stdafx.h"
#include "Program.h"
#include "ProgramDoc.h"
#include "ProgramView.h"
#include "NetControl.h"
#include "Managers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern Managers manager;
/////////////////////////////////////////////////////////////////////////////
// CProgramView
IMPLEMENT_DYNCREATE(CProgramView, CView)
BEGIN_MESSAGE_MAP(CProgramView, CView)
//{{AFX_MSG_MAP(CProgramView)
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
//}}AFX_MSG_MAP
//
//将按钮点击事件同响应函数联系起来
ON_BN_CLICKED(ID_OK, OnOK)//让ID_OK所指的对象响应单击(ON_BN_CLICKED)事件,事件
//的处理函数是OnOK
ON_BN_CLICKED(ID_CANCEL,OnCancel)
ON_BN_CLICKED(ID_SENDCARD,OnSendCard)
ON_BN_CLICKED(ID_PASS,OnPass)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProgramView construction/destruction
CProgramView::CProgramView()
{
// TODO: add construction code here
pControl= new NetControl(this);//创建一个指向NetControl的指针
isgoon = true;
srand(time(NULL));
}
CProgramView::~CProgramView()
{
if(!pControl->m_Isserver)
pControl->SendMsg(pControl->m_pSocket,"退出游戏");
else
pControl->Broadcast("退出游戏");
delete pControl;
}
BOOL CProgramView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
//加载位图
m_background.LoadBitmap(IDB_BACKGROUND);
m_card.LoadBitmap(IDB_CARD);
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CProgramView drawing
void CProgramView::OnDraw(CDC* pDC)
{
CProgramDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//初始化CDC
static bool st=TRUE;
if(st)
{ Background.CreateCompatibleDC(pDC);
Background.SelectObject(m_background);
Mcard.CreateCompatibleDC(pDC);
Mcard.SelectObject(m_card);
st=FALSE;
}
PrintAll();
}
/////////////////////////////////////////////////////////////////////////////
// CProgramView diagnostics
#ifdef _DEBUG
void CProgramView::AssertValid() const
{
CView::AssertValid();
}
void CProgramView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CProgramDoc* CProgramView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CProgramDoc)));
return (CProgramDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CProgramView message handlers
int CProgramView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
///////////////////////////////////////////////////////////////////////
/*
*函数名称:CBUTTON.Creat(_T("确定"),//按钮的caption属性,按钮的显示
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, // 按钮也是一种窗体,同样有不同
//风格,通过对常量或运算进行组合,达到一定的效果,这些常量的含义可以参考MSDN
CRect(660,410,765,450), //这个参数指出按钮在视图中左上角和右下角坐标,在
//确定了按钮位置的同时也确定了其大小
this,//这个指针指向按钮这个窗体的父窗体
ID_OK);//这是刚才为按钮定义的常量,按钮的控制ID
*函数介绍:创建按钮
*输入参数:见上
*输出参数:无
*返回值 :无
*/
//创建按钮OK
m_ok.Create(_T("确定"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(660,420,765,460), this, ID_OK);
//创建按钮CANCEL
m_cancel.Create(_T("退出"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(660,502,765,542), this, ID_CANCEL);
//出牌
m_sendcard.Create(_T("出牌"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(532,387,637,427), this, ID_SENDCARD);
//过牌
m_pass.Create(_T("过牌"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(533,460,638,500),this,ID_PASS);
//////////////////////////////////////////////////////////////////////////
/*
*函数名称:CBUTTON.ShowWindow(SW_SHOW)
*函数介绍:按钮的显示控制
*输入参数:当输入参数为SW_SHOW表示显示按钮,当为SW_HIDE表示隐藏按钮
*输出参数:无
*返回值 :无
*/
//显示按钮
m_ok.ShowWindow(SW_SHOW);
m_cancel.ShowWindow(SW_SHOW);
m_sendcard.ShowWindow(SW_SHOW);
m_pass.ShowWindow(SW_SHOW);
//在游戏界面开始前强制输入用户名称,如果用户点的是确定,则将用户名存入PlayerName[manager.PlayAc]中
//点取消的话则用户名为默认用户名。
CName dlg3;
if(dlg3.DoModal()==IDOK)
{
PlayerName[1]=dlg3.m_name;
}
else
PlayerName[1]="路人甲";
//选择时候为主机/客户机
pControl->OnSorc();
return 0;
}
void CProgramView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//跟踪光标坐标
int mx=point.x;
int my=point.y;
CString st;
CDC *pdc=GetDC();
st.Format("%d ,%d ",point.x,point.y);
// pdc->SetBkMode(TRANSPARENT);
// pDC->SetTextColor(RGB(255,255,255));
pdc->TextOut(400,5,st);
ReleaseDC(pdc);
CView::OnMouseMove(nFlags, point);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:OnOk()
函数介绍:响应确定按钮的点击
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::OnOK()
{
// MessageBox("你点击了确定按钮");//改变
if(manager.Game_State>=0 && manager.Game_State<3)
return;
if(manager.Game_State>=3 )
{
manager.Game_State=-2;
isgoon=true;
}
if(isgoon)
{
OutCards[0][0].Num=16;
OutCards[1][0].Num=16;
OutCards[2][0].Num=16;
PrintAll();
if(!pControl->m_Isserver)
{
pControl->SendGetReady();
}
else
{
pControl->m_ready[1]=true;
if(pControl->m_ready[0] && pControl->m_ready[1] && pControl->m_ready[2])
{
pControl->m_ready[0]=false;
pControl->m_ready[1]=false;
pControl->m_ready[2]=false;
manager.GameStart();
pControl->StartCards();
PlayerPos();
PrintAll(1);
}
}
CDC *pdc=GetDC();
pdc->SetBkMode(TRANSPARENT);
pdc->TextOut(545,435,"准备");
ReleaseDC(pdc);
}
}
////////////////////////////////////////////////////////////////////
/*
函数名称:OnCancel()
函数介绍:响应取消按钮的点击
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::OnCancel()
{
// MessageBox("你点击了取消按钮");
if(!pControl->m_Isserver)
pControl->SendMsg(pControl->m_pSocket,"退出游戏");
else
pControl->Broadcast("退出游戏");
exit(0);
}
///////////////////////////////////////////////////////////////////////
/*
函数名称:PrintAll(CDC *pdc)
函数介绍:用来整体重画
输入参数:绘图用CDC
输出参数:无
返回值 :无
*/
void CProgramView::PrintAll()
{
CDC *pdc=GetDC();
pdc->BitBlt(0,0,800,600,&Background,0,0,SRCCOPY);
if(manager.Game_State==-2)
CardReady();
if(manager.Game_State==-1)
{
pdc->SetBkMode(TRANSPARENT);
pdc->TextOut(600,435,"准备");
pdc->TextOut(630,435,"准备");
}
DrawLeft();
DrawCardOut(3);
DrawMyCard();
DrawOtherCard();
PrintState();
ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:CardReady()
函数介绍:画发牌前牌的摆放
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::CardReady()
{
CDC *pdc=GetDC();
for(int i=0;i<54;i++)
pdc->BitBlt(300+i*2,220,72,97,&Mcard,142,384,SRCCOPY);
ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawMyCard()
函数介绍:画出当前玩家手中的牌
输入参数:无
输出参数:无
返回值 :无
*/
void CProgramView::DrawMyCard()
{
CDC *pdc=GetDC();
int i;
for(i=0;i<20&&manager.PlayCards[manager.PlayerAc][i].Num<=15;i++)
{
if(manager.PlayCards[manager.PlayerAc][i].Num<14)
{ if(manager.PlayCards[manager.PlayerAc][i].Click)
pdc->BitBlt(100+i*15,480-40,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-1)*71,manager.PlayCards[manager.PlayerAc][i].Type*96,SRCCOPY);
else
pdc->BitBlt(100+i*15,480,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-1)*71,manager.PlayCards[manager.PlayerAc][i].Type*96,SRCCOPY);
}
else if(manager.PlayCards[manager.PlayerAc][i].Num<=15)
{ if(manager.PlayCards[manager.PlayerAc][i].Click)
pdc->BitBlt(100+i*15,480-40,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-14)*71,384,SRCCOPY);
else
pdc->BitBlt(100+i*15,480,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-14)*71,384,SRCCOPY);
}
}
ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawOtherCard
函数介绍:画出其他玩家的牌(包括其还剩下多少张牌及当前出的牌)
输入参数:Card *card 为传入的对方出的牌即OutCards
输出参数:无
返回值 :无
*/
void CProgramView::DrawOtherCard()
{
CDC *pdc=GetDC();
int i;
if(manager.Game_State==-2)
return;
//画其他玩家剩下的牌/反面
for(i=0;i<20&&cardleft[i].Num<=15;i++)
{
pdc->BitBlt(55,55+i*10,97,75,&Mcard,214,408,SRCCOPY);
}
for(i=0;i<20&&cardright[i].Num<=15;i++)
{
pdc->BitBlt(630,55+i*10,97,75,&Mcard,214,408,SRCCOPY);
}
ReleaseDC(pdc);
}
void CProgramView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int mx=point.x;
int my=point.y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -