📄 bombplanedlg.cpp
字号:
#include "stdafx.h"
/*
Copyright (c) 2005 william.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
Free Documentation License".
*/
/*
不时地会出现msg发送不成功的情况。
我应该使用timer来确定对方是否收到了关键消息,
来确定是否依然连接....
或者每个消息发送两次。
*/
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CbombplaneDlg::CbombplaneDlg(CWnd* pParent /*=NULL*/)
: CDialog(CbombplaneDlg::IDD, pParent)
,GuessZone(4,true)
,SetZone(3,false)
, ZoneGuide(_T(""))
, GameState(_T(""))
{
sock_c = 0;
sock_s =0;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
This = this;
IsURStart = false;
BombedPlanes = 0;
}
//initialize
CMsg CbombplaneDlg::msg;
CbombplaneDlg* CbombplaneDlg::This= 0;
void CbombplaneDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CREATE, CreateBtn);
DDX_Control(pDX, IDC_CONNECT, ConnetBtn);
DDX_Control(pDX, IDC_DISCONN, diconBtn);
DDX_Control(pDX, IDC_RICHCHAT, chatWnd);
DDX_Text(pDX, IDC_CHATINPUT, chatInput);
DDX_CBString(pDX, IDC_YOURIP, YourIP);
DDV_MaxChars(pDX, YourIP, 15);
DDX_Control(pDX, IDC_YOURIP, ComboIP);
DDX_Control(pDX, IDC_CHATINPUT, ChatInputEdit);
DDX_Control(pDX, IDC_SENDCHAT, SendIt);
DDX_Control(pDX, IDC_BEGIN, GameBeginEnd);
DDX_Control(pDX, IDC_BOMBPLANE, GuessZone);
DDX_Control(pDX, IDC_SETPLANE, SetZone);
DDX_Text(pDX, IDC_GUIDE, ZoneGuide);
DDX_Text(pDX, IDC_STATE, GameState);
}
BEGIN_MESSAGE_MAP(CbombplaneDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SENDCHAT, OnBnClickedSendChat)
ON_BN_CLICKED(IDC_CONNECT, OnBnClickedConnect)
ON_BN_CLICKED(IDC_CREATE, OnBnClickedCreate)
ON_BN_CLICKED(IDC_DISCONN, OnBnClickedDisconn)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_BN_CLICKED(IDC_HELPER, OnBnClickedHelper)
ON_BN_CLICKED(IDC_CLEARUP, OnBnClickedClearup)
ON_WM_RBUTTONUP()
ON_BN_CLICKED(IDC_BEGIN, OnBnClickedStart)
ON_WM_LBUTTONUP()
ON_WM_MBUTTONUP()
END_MESSAGE_MAP()
BOOL CbombplaneDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
GuessZone.OnInit();
SetZone.OnInit();
ReadIpList();
I_Just_Executed_This_App();
//TODO: add my IP str..
return TRUE;
}
//////////////////////////////////////////////////////////
// called by callback function
//收到对方发出的确认位置信息。
//
//
UINT Result[4]={0,IDS_GS_URTURN_N,IDS_GS_URTURN_B,IDS_GS_URTURN_H};
//oponent send the result...
bool CbombplaneDlg::OnRcvHit(CMsg* rcv_msg){
_tag tag = (_tag)rcv_msg->PosX;
UINT x = rcv_msg->PosY>>16;
UINT y = rcv_msg->PosY & 0x0000FFFF;
ASSERT(Hitx==x&&Hity==y);
ASSERT(tag==tagBODY || tag==tagHEAD || tag==tagNONE);
CTagPos pos(x,y);
GuessZone.SetFlag(pos,tag);
SetGameState(Result[tag]);
It_Is_Ur_Turn_Now();
return true;
}
bool CbombplaneDlg::OnRcvLose(CMsg* rcv_msg){
if((rcv_msg->state)>stBACK){
I_Am_Win_U_Abort();
}else{
ASSERT(Hitx==rcv_msg->PosX&&Hity==rcv_msg->PosY);
CTagPos pos(rcv_msg->PosX,rcv_msg->PosY);
GuessZone.SetFlag(pos,tagHEAD);
I_Am_Winner();
}
return true;
}
bool CbombplaneDlg::OnRcvPos(CMsg* rcv_msg){
DUMP(L"pos sig");
CTagPos pos(rcv_msg->PosX,rcv_msg->PosY);
_tag tag = SetZone.IsBombed(pos.x,pos.y);
//I lose...
if(tag == tagHEAD){
++BombedPlanes;
if(BombedPlanes == 3){
I_Am_Loser_3_Bombed();
SetZone.SetFlag(pos,tag);
msg.Set4Lose(pos.x,pos.y);
SendMsg(msg);
return true;
}
}
#ifdef _DEBUG
if(tag == tagHEAD)ASSERT(BombedPlanes<3);
#endif
ASSERT(tag == tagBODY || tag == tagNONE || tag == tagHEAD);
SetZone.SetFlag(pos,tag);
//
msg.Set4Hit(tag,pos.x,pos.y);
SendMsg(msg);
It_Is_My_Turn_Now();
return true;
}
bool CbombplaneDlg::OnRcvChat(CMsg* rcv_msg){
DUMP(L"Chat sig");
InsertChat(rcv_msg->str);
//SendMsg(msg);
return true;
}
bool CbombplaneDlg::OnRcvConn(CMsg* rcv_msg){
if((rcv_msg->state)>stBACK){
//msg from sever
DUMP(L"Conn back sig");
InsertState(IDS_CONNECT);
WriteIpList();
}else{
//Msg from client
DUMP(L"Conn sig");
InsertState(IDS_CONNBACK);
msg.Set4Conn(true);
SendMsg(msg);
}
//client and server connect successful
U_And_Me_Connected();
return true;
}
bool CbombplaneDlg::OnRcvDisc(CMsg* /*rcv_msg*/){
DUMP(L"Disc sig");
CString str;
InsertState(IDS_DISCONN);
msg.Set4Disc();
OnBnClickedDisconn();
return false;
}
bool CbombplaneDlg::OnRcvStart(CMsg* rcv_msg){
if((rcv_msg->state)>stBACK){//back
You_Stated_too_But_I_1st();
}else{
IsURStart = true;
U_Started_Waiting_4_Me();
}
return true;
}
bool CbombplaneDlg::OnRcvNone(CMsg* /*rcv_msg*/){
DUMP(L"none sig");
InsertInfo(IDS_NONESIG);
return true;
}
void CbombplaneDlg::OnErrorDisc(UINT info){
InsertInfo(info);
We_Are_Disconnected();
msg.Set4Disc();
OnBnClickedDisconn();
}
CCntSock* CbombplaneDlg::OnAccept()
{
sock_c = new CCntSock((RcvCallBack)Dispatch,(DisConnBack)DisConnect);
SendIt.EnableWindow();
return sock_c;
}
//////////////////////////////////////////////////
//
// Button event
//
void CbombplaneDlg::OnBnClickedSendChat()
{
UpdateData();
chatInput.Trim(L' ');
if(chatInput.GetLength()>0)
{
chatInput.Append(L"\n");
msg.Set4Chat(chatInput);
if(sock_c)
{
SendMsg(msg);
InsertChat(chatInput);
}
}
chatInput.Empty();
UpdateData(FALSE);
ChatInputEdit.SetFocus();
}
//Greate or connect. otherwise,can do nothing else.
void CbombplaneDlg::OnBnClickedCreate()
{
I_Clicked_Created();
sock_s = new CSvrSock((AcptCallBack)onAccept,(DisConnBack)DisConnect);
InsertInfo(IDS_CREATE_CLK);
sock_s->BeginListen();
}
void CbombplaneDlg::OnBnClickedConnect()
{
I_Clicked_Connect();
sock_c = new CCntSock((RcvCallBack)Dispatch,(DisConnBack)DisConnect);
InsertInfo(IDS_CONN_CLK);
UpdateData();//get your ip
sock_c->BeginConnect(YourIP);
if(!msg.IsDiscSignal())
{
msg.Set4Conn();
SendMsg(msg);
}
//than waiting for server send back...
}
void CbombplaneDlg::OnBnClickedDisconn()
{
We_Are_Disconnected();
InsertInfo(IDS_DISCING);
if(!msg.IsDiscSignal()){
if(sock_c){
msg.Set4Disc();
SendMsg(msg);
}
}
msg.Set4None();
try{
if(sock_c){
delete sock_c;
sock_c=0;
}
if(sock_s){
delete sock_s;
sock_s=0;
}
}catch(CException* e)
{
e->Delete();
sock_c=0;
sock_s=0;
InsertState(IDS_EX_REBOOT);
}
}
void CbombplaneDlg::OnBnClickedCancel()
{
OnBnClickedDisconn();
OnCancel();
}
void CbombplaneDlg::OnBnClickedStart()
{
CString st;
CString tit;
st.LoadString(IDS_BTN_AB);
GameBeginEnd.GetWindowText(tit);
if(tit == st){
I_Am_Loser_Abort();
msg.Set4Lose(0,0,true);
SendMsg(msg);
return;
}
st.LoadString(IDS_BTN_NW);
if(tit == st){
Start_A_New_Turns();
return;
}
//2nd click
if(IsURStart){
I_Am_2nd_Start_Wait_U_Guess();
msg.Set4Start(true);
SendMsg(msg);
//1st click
}else{
I_Am_1st_Started_Plz_Quick();
msg.Set4Start();
SendMsg(msg);
}
}
///////////////////////////////////////////////////
//
//mouse operate for PlayZone
//
bool CbombplaneDlg::IsGuessZone(CPoint& point) const{
CPoint pt(point);
CRect rect;
GuessZone.GetWindowRect(&rect);
ScreenToClient(&rect);
if(rect.PtInRect(pt))
{
ClientToScreen(&pt);
GuessZone.ScreenToClient(&pt);
point = pt;
return true;
}
return false;
}
bool CbombplaneDlg::IsSetZone(CPoint& point)const{
CPoint pt(point);
CRect rect;
SetZone.GetWindowRect(&rect);
ScreenToClient(&rect);
if(rect.PtInRect(pt))
{
ClientToScreen(&pt);
SetZone.ScreenToClient(&pt);
point = pt;
return true;
}
return false;
}
void CbombplaneDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
if(IsGuessZone(point)){
GuessZone.OnGuessRButtonUp(point);
return;
}
//SetZone No need RB
CDialog::OnRButtonUp(nFlags, point);
}
void CbombplaneDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(IsGuessZone(point)){
int x,y;
if(GuessZone.OnGuessLButtonUp(point,x,y))
{
msg.Set4Pos(x,y);
Hitx = x;Hity = y;
SendMsg(msg);
I_Guessed_Wait_Result();
}
return;
}
//SetZone No need LB
CDialog::OnRButtonUp(nFlags, point);
}
void CbombplaneDlg::OnMButtonUp(UINT nFlags, CPoint point)
{
if(IsGuessZone(point)){
MBU st = GuessZone.OnMButtonUp(point);
if(st!=mbNONE)MBU2Guide(st,true);
}
if(IsSetZone(point)){
MBU st = SetZone.OnMButtonUp(point);
if(st!=mbNONE)MBU2Guide(st,false);
}
CDialog::OnMButtonUp(nFlags, point);
}
//mbNONE=0,mbDEL=1,mbMax=2,mbSEL=3,mbCANT=4,mbOKMAX=5,mbNEXT=6,mbCANCEL=7
UINT MbuGuide[2][8]={
{0,IDS_GU_DEL_SET,IDS_GU_MAXNUM_SET,IDS_GU_SELTAIL,IDS_GU_CANNOTSET,
IDS_GU_OK_MAXNUM_SET,IDS_GU_OK_GONO_SET,IDS_GU_CANCEL_SET},
{0,IDS_GU_DEL_GUESS,IDS_GU_MAXNUM_GUESS,IDS_GU_SELTAIL,IDS_GU_CANNOTSET,
IDS_GU_OK_MAXNUM_GUESS,IDS_GU_OK_GONO_GUESS,IDS_GU_CANCEL_GUESS},
};
void CbombplaneDlg::MBU2Guide(MBU mbu,bool isGuess)
{
UINT IDS_id;
if(isGuess){
IDS_id = MbuGuide[1][mbu];
}else{
IDS_id = MbuGuide[0][mbu];
if(mbu==mbDEL)SetZoneNotDone();
if(mbu==mbOKMAX)SetZoneDone();
}
SetGameGuide(IDS_id);
}
const int IPNum = 5;
void CbombplaneDlg::ReadIpList()
{
CWinApp* pApp = AfxGetApp();
CString tGet;
CString entry;
for(int i = 0;i<IPNum;++i){
entry.Format(L"IP%d",i);
tGet = pApp->GetProfileString(L"IpList", entry);
if(tGet.GetLength()>0)
{
IpList.Add(tGet);
ComboIP.AddString(tGet);
}
}
}
void CbombplaneDlg::WriteIpList()
{
if(YourIP.GetLength()<1)return;
CString str;
for(int i = 0;i<IpList.GetCount();++i){
str = IpList.GetAt(i);
if(str == YourIP)return;
}
ComboIP.AddString(YourIP);
if(IpList.GetCount()>4)
IpList.RemoveAt(IpList.GetCount()-1);
IpList.InsertAt(0,YourIP);
CString entry;
CWinApp* pApp = AfxGetApp();
for(int i = 0;i<IpList.GetCount();++i){
entry.Format(L"IP%d",i);
pApp->WriteProfileString(L"IpList", entry,IpList.GetAt(i));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -