MFC设计局域网对战五子棋游戏(三)构造游戏主对话框

7 篇文章 0 订阅
6 篇文章 0 订阅

游戏对话框的构造函数:

 

CWZQDlg::CWZQDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CWZQDlg::IDD, pParent),
m_gameStart(false),
m_clientLength(554.0f),//初始化游戏区域大小为554px
m_uid(0),//主机id号为0
m_receving(false),//开始接收游戏数据标志
m_appruning(true)//游戏开始标志

{
	ZeroMemory(grid,sizeof(grid));//初始化棋盘信息数组
	blockLength=m_clientLength/15.0F;//每块棋子大小
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	//给自绘的按钮初始化位图资源
	m_challenge.hoverImage = Image::FromFile(L"img\\hoverB.png");
	m_challenge.normalImage = Image::FromFile(L"img\\normalB.png");
	m_challenge.activeImage = Image::FromFile(L"img\\activeB.png");

	m_BangButton.normalImage = Image::FromFile(L"img\\normalC.png");
	m_BangButton.hoverImage = Image::FromFile(L"img\\hoverC.png");
	m_BangButton.activeImage = Image::FromFile(L"img\\activeC.png");

	m_searchButton.normalImage = Image::FromFile(L"img\\normalS.png");
	m_searchButton.hoverImage = Image::FromFile(L"img\\hoverS.png");
	m_searchButton.activeImage = Image::FromFile(L"img\\activeS.png");

	bkImage = Image::FromFile(L"img\\prod.jpg");//游戏区域背景图片,棋盘格已经在图片中可以减少绘图计算量

	nullCur  =  LoadCursor( NULL  , MAKEINTRESOURCE (ID_NULLCUR) ) ;
	arrowCur = LoadCursor(NULL, IDC_UPARROW);
}

 

初始化函数:

 

BOOL CWZQDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	WZQInit();

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CWZQDlg::WZQInit(void)
{
	//调用DWM API中的DwmExtendFrameIntoClientArea函数来设置透明区域
	//在Vista和Win7中,对话框的边框是透明的,MARGINS结构体中的个字段
	//是指把某个边框向内扩展多少像素,如果有一个为-1,则整个对话框为透明
	MARGINS margins;
	margins.cxLeftWidth = 0;
	margins.cxRightWidth = 190;
	margins.cyTopHeight = 0;
	margins.cyBottomHeight = 0;
	DwmExtendFrameIntoClientArea(GetSafeHwnd(), &margins);

	::SetCursor(nullCur);
	m_gameList.AddString("游戏列表");
	//初始化游戏绘制线程的互斥量,保证主线程退出时子线程也退出
	//否则会出现资源访问冲突,子线程调用主线程中的资源必须使用
	//互斥量来调度
	m_paintMutex = ::CreateMutex(NULL,FALSE,NULL);
	m_pieceMutex = ::CreateMutex(NULL,FALSE,NULL);
	AfxBeginThread(PaintThread,this);
	

}


其他消息处理函数:

 

void CWZQDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	//鼠标移地时保存鼠标位置,在棋盘上显示随鼠标移动的棋子
	m_mouse=point;
	CDialogEx::OnMouseMove(nFlags, point);
}


void CWZQDlg::OnClose()
{
	m_appruning = false;
	//给对方发送退出游戏信息
	MsgPack msp;
	msp.type = QUIT_GAME;
	SendSock.Send(&msp,sizeof(MsgPack));
	//等待子线程退出
	::WaitForSingleObject(m_paintMutex,INFINITE);
	CDialogEx::OnClose();
}


BOOL CWZQDlg::OnEraseBkgnd(CDC* pDC)
{
	return true;
}


LRESULT CWZQDlg::OnNcHitTest(CPoint point)
{
	//如果拖动右侧的透明区域也可以移动对话框
	RECT rc;
	GetWindowRect(&rc);
	if(point.x-rc.left>556)
		return HTCAPTION;
	else
		return CDialogEx::OnNcHitTest(point);
}


BOOL CWZQDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	POINT cp;
	RECT rc;
	GetWindowRect(&rc);
	::GetCursorPos(&cp);
	//鼠标在不同的区域使用不同的指针形状
	if(cp.x-rc.left<554&&cp.y-rc.top>26)
		::SetCursor(nullCur);
	else
		::SetCursor(arrowCur);
	return TRUE;
}


void CWZQDlg::OnBnClickedServer()
{
	if(m_receving)
		return;
	m_uid = 1;
	AfxBeginThread(HostThread,this);
	AfxBeginThread(ReceiveThread,this);
}


void CWZQDlg::OnBnClickedChallenge()
{
	if(m_gameStart)
		return;
	SetWindowTextA("尝试与服务器建立连接");
	m_uid = 2;
	AfxBeginThread(ReceiveThread,this);
}



 

源代码下载: http://download.csdn.net/download/jokers_i/4223218

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值