游戏对话框的构造函数:
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);
}