#include "StdAfx.h" #include ".\matchservice.h" #include "DataBasePacket.h" ////////////////////////////////////////////////////////////////////////// //常量定义 #define IDI_MATCH_TIME_PULSE 200 //服务脉冲 #define IDI_MATCH_GAME_START 201 //比赛开始 #define IDI_MATCH_GAME_OVER 202 //比赛结束 #define IDI_DISTRIBUTE_TIMER 203 //定时分配 BEGIN_MESSAGE_MAP(CDlgAddMatchDate, CDialog) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CDlgAddMatchInfo, CDialog) END_MESSAGE_MAP() //构造函数 CTimeRankingsMatch::CTimeRankingsMatch(WORD wMatchID):m_wMatchID(wMatchID) { m_dwMatchFee=100; m_pIMainServiceFrame=NULL; m_pIKernelDataBaseEngine=NULL; ZeroMemory(&m_MatchInfo,sizeof(m_MatchInfo)); m_cbMatchStatus=MATCH_STATUS_NOT_STARTED; m_cbCurMatch=0xFF; ZeroMemory(m_szMatchName,sizeof(m_szMatchName)); m_pMatchRank=NULL; m_wRankCount=0; m_pParameterDlg=new CMatchParameterDlg(m_MatchInfo,m_uiMatchDate,m_cbMatchTime,m_szMatchName,m_dwMatchFee,m_lInitScore,m_wMatchGameCount,m_wMatchID); } //析构函数 CTimeRankingsMatch::~CTimeRankingsMatch(void) { m_DistributeManage.RemoveAll(); m_ServerUserItemMap.RemoveAll(); for(INT_PTR i=0; iSetTimer(IDI_MATCH_TIME_PULSE,1000,-1,0); m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_TIMER,15000,-1,0); return true; } //停止事件 bool CTimeRankingsMatch::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx) { m_DistributeManage.RemoveAll(); m_ServerUserItemMap.RemoveAll(); for(INT_PTR i=0; iSendRoomMessage(pIServerUserItem,szDescribe,SMT_EJECT); return true; } else if(m_cbMatchStatus==MATCH_STATUS_WAIT_FINISH || m_cbMatchStatus==MATCH_STATUS_FINISH) { if(m_cbCurMatch==m_cbMatchTime-1) _sntprintf( szDescribe,CountArray(szDescribe),TEXT("抱歉,比赛已经全部结束,欢迎下次参加比赛!")); else { FILETIME ftBegin = {}; SYSTEMTIME stBegin = {}; if(m_cbMatchStatus==MATCH_STATUS_WAIT_FINISH) CopyMemory( &ftBegin,&m_uiMatchDate[(m_cbCurMatch+1)*2],sizeof(ftBegin)); else if(m_cbMatchStatus==MATCH_STATUS_FINISH) CopyMemory( &ftBegin,&m_uiMatchDate[(m_cbCurMatch)*2],sizeof(ftBegin)); CTime tStart(ftBegin); tStart.GetAsSystemTime(stBegin); _sntprintf( szDescribe,CountArray(szDescribe),TEXT("本场比赛即将结束,下场比赛开始时间为%s, 请耐心等待!"),GetTimeString(stBegin)); } m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,szDescribe,SMT_CHAT); return true; } if(m_wMatchGameCount>0) { tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo(); if(pUserInfo->dwWinCount+pUserInfo->dwLostCount+pUserInfo->dwDrawCount+pUserInfo->dwFleeCount>=m_wMatchGameCount) { TCHAR szMess[128]=TEXT("\0"); _sntprintf(szMess, CountArray(szMess), TEXT("恭喜您已经完成比赛规定局数%d局,等待其他玩家继续游戏后将公布比赛成绩,敬请关注!"),m_wMatchGameCount); m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem, szMess,SMT_EJECT); return true; } } if(!CUserRight::IsGameMatchUser(pIServerUserItem->GetUserRight()) && m_dwMatchFee>0) { ASSERT(m_pIMainServiceFrame!=NULL); if(m_pIMainServiceFrame==NULL) return false; m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_FEE,&m_dwMatchFee, sizeof(DWORD)); return false; } else { if(pIServerUserItem->GetTableID()==INVALID_TABLE) m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("恭喜,报名成功,请等待系统为您安排座位!"),SMT_EJECT); InsertDistribute(pIServerUserItem); } return true; } //用户退赛 bool CTimeRankingsMatch::OnUserQuitMatch(IServerUserItem * pIServerUserItem) { //参数效验 ASSERT(pIServerUserItem!=NULL); if(pIServerUserItem==NULL) return false; if(pIServerUserItem->GetUserStatus()>=US_PLAYING) return true; m_DistributeManage.RemoveDistributeNode(pIServerUserItem); m_ServerUserItemMap.RemoveKey(pIServerUserItem->GetUserID()); CMD_GR_Match_Num MatchNum; MatchNum.dwWaitting=m_DistributeManage.GetCount(); MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount(); m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum)); return true; } //用户准备 bool CTimeRankingsMatch::OnUserReay(IServerUserItem * pIServerUserItem,WORD wTableID,WORD wChairID) { if(m_cbMatchStatus!=MATCH_STATUS_MATCHING) { m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,TEXT("抱歉,比赛即将结束,请耐心等待下场比赛!"),SMT_EJECT|SMT_CLOSE_GAME); } return true; } //设置接口 bool CTimeRankingsMatch::InitMatchService(IMainServiceFrame *pIMainServiceFrame, IDataBaseEngine *pIKernelDataBaseEngine,ITimerEngine *pITimerEngine, tagGameServiceAttrib *pGameServiceAttrib,tagGameServiceOption *pGameServiceOption,CTableFrameArray &TableFrameArray) { //参数效验 ASSERT(pIMainServiceFrame!=NULL && pIKernelDataBaseEngine!=NULL && pGameServiceOption!=NULL && pGameServiceAttrib!=NULL && pITimerEngine!=NULL); if(pIMainServiceFrame==NULL || pIKernelDataBaseEngine==NULL || pGameServiceOption==NULL || pGameServiceAttrib==NULL || pITimerEngine==NULL) return false; m_pIMainServiceFrame=pIMainServiceFrame; m_pIKernelDataBaseEngine=pIKernelDataBaseEngine; m_pGameServiceOption=pGameServiceOption; m_pGameServiceAttrib=pGameServiceAttrib; m_TableFrameArray.Append(TableFrameArray); for(INT_PTR i=0; iSetMatchInterface((IUnknownEx*)QueryInterface(IID_IMatchTableFrameNotify,VER_IMatchTableFrameNotify)); m_pITimerEngine=pITimerEngine; return true; } //命令消息 bool CTimeRankingsMatch::OnEventSocketMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_GR_MATCH_FEE: //比赛费用 { //参数效验 ASSERT(wDataSize==sizeof(DWORD)); if(wDataSize!=sizeof(DWORD)) return false; DWORD dwMatchFee=*(DWORD*)pData; if(dwMatchFee!=m_dwMatchFee)return false; DBR_GR_MatchFee MatchFee; MatchFee.dwUserID=pIServerUserItem->GetUserID(); MatchFee.dwMatchFee=m_dwMatchFee; MatchFee.dwInoutIndex=pIServerUserItem->GetInoutIndex(); MatchFee.dwClientAddr=pIServerUserItem->GetClientAddr(); lstrcpyn(MatchFee.szMachineID,pIServerUserItem->GetMachineID(),CountArray(MatchFee.szMachineID)); //投递数据 m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GR_MATCH_FEE,dwSocketID,&MatchFee,sizeof(MatchFee)); return true; } case SUB_GR_LEAVE_MATCH: //退出比赛 { //参数效验 ASSERT(pIServerUserItem!=NULL); if(pIServerUserItem==NULL) return false; if(pIServerUserItem->GetUserStatus()>=US_PLAYING) return true; m_DistributeManage.RemoveDistributeNode(pIServerUserItem); m_ServerUserItemMap.RemoveKey(pIServerUserItem->GetUserID()); CMD_GR_Match_Num MatchNum; MatchNum.dwWaitting=m_DistributeManage.GetCount(); MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount(); m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum)); return true; } } return true; } //插入分配 bool CTimeRankingsMatch::InsertDistribute(IServerUserItem * pIServerUserItem) { //效验参数 ASSERT(pIServerUserItem!=NULL); if (pIServerUserItem==NULL) return false; //状态判断 ASSERT(pIServerUserItem->GetUserStatus()GetUserStatus()>=US_PLAYING) return false; //变量定义 tagDistributeInfo DistributeInfo; ZeroMemory(&DistributeInfo,sizeof(DistributeInfo)); //设置变量 DistributeInfo.pIServerUserItem=pIServerUserItem; DistributeInfo.wLastTableID=pIServerUserItem->GetTableID(); DistributeInfo.dwClientAddr=pIServerUserItem->GetClientAddr(); DistributeInfo.pPertainNode=NULL; //加入数组 m_DistributeManage.InsertDistributeNode(DistributeInfo); m_ServerUserItemMap[pIServerUserItem->GetUserID()]=pIServerUserItem; //用户起立 if (pIServerUserItem->GetTableID()!=INVALID_TABLE) { WORD wTableID=pIServerUserItem->GetTableID(); //m_TableFrameArray[wTableID]->PerformStandUpAction(pIServerUserItem); } //分配判断 // bool bDistribute=false; // if (m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_IMMEDIATE) bDistribute=true; // if ((m_pGameServiceOption->wMaxDistributeUser!=0)&&(m_DistributeManage.GetCount()>=m_pGameServiceOption->wMaxDistributeUser)) bDistribute=true; // // //执行分组 // if (bDistribute==true) // { // PerformDistribute(); // } CMD_GR_Match_Num MatchNum; MatchNum.dwWaitting=m_DistributeManage.GetCount(); MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount(); m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum)); return true; } //分配用户 bool CTimeRankingsMatch::PerformDistribute() { //人数校验 // if(m_DistributeManage.GetCount()wMinDistributeUser) return false; //分配用户 while(true) { //人数校验 //ASSERT(m_DistributeManage.GetCount()>=m_pGameServiceOption->wMinGameUser); //if(m_DistributeManage.GetCount()wMinGameUser) return false; if(m_DistributeManage.GetRealCount()==0) return false; //变量定义 CDistributeInfoArray DistributeInfoArray; //获取用户 //WORD wRandCount = __max(m_pGameServiceOption->wMaxGameUser-m_pGameServiceOption->wMinGameUser+1,1); //WORD wChairCount = m_pGameServiceOption->wMinGameUser+rand()%wRandCount; WORD wDistributeCount = m_DistributeManage.PerformDistribute(DistributeInfoArray,m_pGameServiceAttrib->wChairCount); if(wDistributeCount < m_pGameServiceAttrib->wChairCount) break; //寻找位置 CTableFrame * pCurrTableFrame=NULL; for (WORD i=0;iGetSitUserCount()==0) { pCurrTableFrame=pTableFrame; break; } } //桌子判断 if(pCurrTableFrame==NULL) break; //玩家坐下 bool bSitSuccess=true; INT_PTR nSitFailedIndex=INVALID_CHAIR; for(INT_PTR nIndex=0;nIndexGetNullChairID(); //分配用户 if (wChairID!=INVALID_CHAIR) { //获取用户 IServerUserItem * pIServerUserItem=DistributeInfoArray[nIndex].pIServerUserItem; //用户起立 if(pIServerUserItem->GetTableID()!=INVALID_TABLE) { WORD wTableID=pIServerUserItem->GetTableID(); m_TableFrameArray[wTableID]->PerformStandUpAction(pIServerUserItem); } //用户坐下 if(pCurrTableFrame->PerformSitDownAction(wChairID,pIServerUserItem)==false) { bSitSuccess=false; nSitFailedIndex=nIndex; break; } } } //坐下处理 if(bSitSuccess) { //移除结点 while(DistributeInfoArray.GetCount()>0) { m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[0].pPertainNode); DistributeInfoArray.RemoveAt(0); } } else { for(INT_PTR nIndex=0;nIndexGetTableID()!=INVALID_TABLE) { WORD wTableID=DistributeInfoArray[nIndex].pIServerUserItem->GetTableID(); m_TableFrameArray[wTableID]->PerformStandUpAction(DistributeInfoArray[nIndex].pIServerUserItem); } } } } } for(WORD i=0; iwTableCount; i++) { //获取对象 CTableFrame * pTableFrame=m_TableFrameArray[i]; if(pTableFrame==NULL)continue; //状态判断 WORD wSitUserCount=pTableFrame->GetSitUserCount(); if(pTableFrame->IsGameStarted() || wSitUserCount==m_pGameServiceAttrib->wChairCount || wSitUserCount==0) continue; if(m_pGameServiceAttrib->wChairCount-wSitUserCount>m_pGameServiceAttrib->wChairCount/2) { // for(WORD j=0; j) } } return true; } //赛事信息 bool CTimeRankingsMatch::SendMatchInfo(IServerUserItem * pIServerUserItem) { CMD_GR_Match_Num MatchNum; MatchNum.dwWaitting=m_DistributeManage.GetCount(); MatchNum.dwTotal=(DWORD)m_ServerUserItemMap.GetCount(); m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_NUM,&MatchNum, sizeof(MatchNum)); if(m_MatchInfo.GetCount()>0) { CMD_GR_Match_Info *pMatchInfo=new CMD_GR_Match_Info[m_MatchInfo.GetCount()]; for(INT_PTR i=0; iSendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_INFO,pMatchInfo,(WORD)(sizeof(CMD_GR_Match_Info)*m_MatchInfo.GetCount())); delete [] pMatchInfo; } return true; } //数据库事件 bool CTimeRankingsMatch::OnEventDataBase(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { switch (wRequestID) { case DBO_GR_MATCH_FEE_RESULT: //报名结果 { //参数效验 if(pIServerUserItem==NULL) return true; if(wDataSize!=sizeof(LONG)) return false; //变量定义 LONG lReturnValue=*(LONG*)pData; if(lReturnValue==0) { pIServerUserItem->ModifyUserRight(UR_GAME_MATCH_USER,0); InsertDistribute(pIServerUserItem); m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("恭喜,报名成功,请等待系统为您安排座位!"),SMT_EJECT); } else if(lReturnValue==1) { TCHAR szDescribe[128]=TEXT(""); _sntprintf(szDescribe,CountArray(szDescribe),TEXT("您游戏币不够,不能加入比赛!")); m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,szDescribe,SMT_EJECT); } break; } case DBO_GR_MATCH_RANK: //比赛名次 { //参数效验 ASSERT(wDataSize%sizeof(DBO_GR_MatchRank)==0); if(wDataSize%sizeof(DBO_GR_MatchRank)!=0) return false; DBO_GR_MatchRank *pMatchRank=(DBO_GR_MatchRank *)pData; m_wRankCount=wDataSize/sizeof(DBO_GR_MatchRank); m_pMatchRank=new CMD_GR_MatchRank[m_wRankCount]; for(WORD i=0; iSendData(BG_COMPUTER, MDM_GR_MATCH, SUB_GR_MATCH_RANK, m_pMatchRank,sizeof(CMD_GR_MatchRank)*m_wRankCount); } break; } return true; } //设置参数 bool CTimeRankingsMatch::ModifyMatchParameter() { m_pParameterDlg->DoModal(); return true; } //时间事件 bool CTimeRankingsMatch::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter) { if(dwTimerID==IDI_MATCH_TIME_PULSE) { if(m_cbCurMatch==0xFF || m_cbMatchStatus== MATCH_STATUS_FINISH) return true; CTime CurTime=CTime::GetCurrentTime(); if(m_cbMatchStatus==MATCH_STATUS_NOT_STARTED) { if((m_TimeMatchStart==CurTime)) { m_cbMatchStatus=MATCH_STATUS_MATCHING; CString strMsg; strMsg.Format(TEXT("%s 比赛第[ %d ]场开始了!"),m_szMatchName,m_cbCurMatch+1); m_pIMainServiceFrame->SendRoomMessage(strMsg,SMT_CHAT); CTraceService::TraceString(strMsg,TraceLevel_Normal); //通知调试 if(m_pIMainServiceFrame!=NULL) m_pIMainServiceFrame->OnEventMatchStart(m_lInitScore); //构造数据 DBR_GR_MatchStart MatchStart; MatchStart.wMatchID=m_wMatchID; MatchStart.wMatchNo=(WORD)m_cbCurMatch; MatchStart.wMatchCount=(WORD)m_cbMatchTime; MatchStart.lInitScore=m_lInitScore; m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GR_MATCH_START,0,&MatchStart,sizeof(MatchStart)); } } else if(m_cbMatchStatus==MATCH_STATUS_MATCHING) { CTimeSpan span=m_TimeMatchOver-CurTime; if(span.GetTotalMinutes()<=5) { TCHAR szMess[128] = {}; _sntprintf(szMess,CountArray(szMess),TEXT("各位玩家注意,第 [ %ld ] 场比赛5分钟内即将结束,请大家加紧时间!"),m_cbCurMatch+1); m_pIMainServiceFrame->SendGameMessage(szMess,SMT_CHAT); m_pIMainServiceFrame->SendRoomMessage(szMess,SMT_CHAT); m_cbMatchStatus=MATCH_STATUS_WAIT_FINISH; CTraceService::TraceString(szMess,TraceLevel_Normal); } } else if(m_cbMatchStatus==MATCH_STATUS_WAIT_FINISH) { CTimeSpan span=m_TimeMatchOver-CurTime; if(span.GetTotalSeconds()<=30) { for(INT_PTR i=0; iIsGameStarted()) m_TableFrameArray.GetAt(i)->DismissGame(); } } for(INT_PTR i=0; iIsGameStarted()) return true; } m_DistributeManage.RemoveAll(); POSITION pos=m_ServerUserItemMap.GetStartPosition(); DWORD dwUserID; IServerUserItem *pIServerUserItem=NULL; while(pos!=NULL) { m_ServerUserItemMap.GetNextAssoc(pos,dwUserID, pIServerUserItem); if(pIServerUserItem!=NULL) m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,TEXT(""),SMT_CLOSE_GAME); } m_ServerUserItemMap.RemoveAll(); if(abs((int)span.GetTotalSeconds())<=1) { TCHAR szMess[128] = {}; _sntprintf(szMess,CountArray(szMess),TEXT("第 [ %ld ] 场比赛结束"),m_cbCurMatch+1); CTraceService::TraceString(szMess,TraceLevel_Normal); m_cbMatchStatus=MATCH_STATUS_FINISH; DBR_GR_MatchOver MatchOver; MatchOver.wMatchID=m_wMatchID; MatchOver.wMatchNo=(WORD)m_cbCurMatch; MatchOver.wMatchCount=(WORD)m_cbMatchTime; m_pIKernelDataBaseEngine->PostDataBaseRequest(DBR_GR_MATCH_OVER,0,&MatchOver,sizeof(MatchOver)); if(m_cbCurMatch CurTime) { m_TimeMatchStart = TimeBegin; m_TimeMatchOver = TimeEnd; m_cbCurMatch=i; m_cbMatchStatus=MATCH_STATUS_MATCHING; CTimeSpan span; span=TimeEnd-CurTime; if(span.GetTotalMinutes()<=5) m_cbMatchStatus=MATCH_STATUS_WAIT_FINISH; break; } } //设置变量 if(i==m_cbMatchTime) { m_cbMatchStatus=MATCH_STATUS_FINISH; m_cbCurMatch=m_cbMatchTime-1; } if( m_cbMatchStatus==MATCH_STATUS_NOT_STARTED || m_cbMatchStatus==MATCH_STATUS_MATCHING) { //提示消息 TCHAR szMess[256] = TEXT(""); TCHAR szStart[32] = TEXT(""); TCHAR szOver[32] = TEXT(""); SYSTEMTIME stBegin = {}; m_TimeMatchStart.GetAsSystemTime(stBegin); SYSTEMTIME stEnd = {}; m_TimeMatchOver.GetAsSystemTime(stEnd); lstrcpyn( szStart,GetTimeString(stBegin),CountArray(szStart) ); lstrcpyn( szOver,GetTimeString(stEnd),CountArray(szOver) ); _sntprintf( szMess,CountArray(szMess),TEXT("%s 第 [ %ld ] 场比赛将于 %s 到 %s 进行。"),m_szMatchName,m_cbCurMatch+1,szStart,szOver ); m_pIMainServiceFrame->SendRoomMessage(szMess,SMT_CHAT); CTraceService::TraceString(szMess,TraceLevel_Normal); } else if(m_cbMatchStatus==MATCH_STATUS_FINISH) { //提示消息 CTraceService::TraceString(TEXT("比赛全部结束。"),TraceLevel_Normal); } return; } //游戏结束 bool CTimeRankingsMatch::OnEventGameEnd(WORD wTableID) { if(m_wMatchGameCount>0) { //参数效验 if(wTableID>=m_TableFrameArray.GetCount()) return false; //变量定义 CTableFrame * pTableFrame=m_TableFrameArray[wTableID]; if(pTableFrame==NULL) return false; for(WORD i=0; iwChairCount; i++) { IServerUserItem *pIServerUserItem=pTableFrame->GetTableUserItem(i); if(pIServerUserItem==NULL) continue; //变量定义 tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo(); DWORD dwGameCount=pUserInfo->dwWinCount+pUserInfo->dwLostCount+pUserInfo->dwDrawCount+pUserInfo->dwFleeCount; if(dwGameCount>=m_wMatchGameCount) { TCHAR szMess[128]=TEXT("\0"); _sntprintf(szMess, CountArray(szMess), TEXT("恭喜您已经完成比较规定局数%d局,等待其他玩家继续游戏后将公布比赛成绩,敬请关注!"),m_wMatchGameCount); m_pIMainServiceFrame->SendGameMessage(pIServerUserItem, szMess,SMT_EJECT|SMT_CLOSE_GAME); } else { TCHAR szMess[128] = TEXT(""); _sntprintf( szMess,CountArray(szMess),TEXT("您已经完成%d局,共%d局。"),dwGameCount,m_wMatchGameCount); m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,szMess,SMT_CHAT); } } } if(m_cbMatchStatus!=MATCH_STATUS_WAIT_FINISH) return true; for(INT_PTR i=0; iIsGameStarted()) return true; } return true; } //获取时间字符串 LPCTSTR CTimeRankingsMatch::GetTimeString( SYSTEMTIME &st ) { //变量定义 static TCHAR szTime[32] = TEXT(""); _sntprintf(szTime,CountArray(szTime),TEXT("%4d年%02d月%02d日 %02d时%02d分%02d秒"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); return szTime; } ////////////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CMatchParameterDlg, CDialog) ON_BN_CLICKED(IDC_BT_ADD, OnBnClickedAdd) ON_BN_CLICKED(IDC_BT_MODIFY, OnBnClickedModify) ON_BN_CLICKED(IDC_BT_DELETE, OnBnClickedDelete) ON_BN_CLICKED(IDC_BT_ADD_INFO, OnBnClickedAddInfo) ON_BN_CLICKED(IDC_BT_MODIFY_INFO, OnBnClickedModifyInfo) ON_BN_CLICKED(IDC_BT_DELETE_INFO, OnBnClickedDeleteInfo) END_MESSAGE_MAP() CMatchParameterDlg::CMatchParameterDlg(CMatchInfoArray &MatchInfo,ULARGE_INTEGER *puiMatchDate,BYTE &cbMatchTime, TCHAR *pszMatchRoom,DWORD &dwMatchFee,\ LONG &lInitScore, WORD &wMatchGameCount,WORD wMatchID): CDialog(IDD),m_MatchInfo(MatchInfo),m_puiMatchDate(puiMatchDate),m_cbMatchTime(cbMatchTime),m_pszMatchRoom(pszMatchRoom),m_dwMatchFee(dwMatchFee), m_lInitScore(lInitScore),m_wMatchGameCount(wMatchGameCount), m_wMatchID(wMatchID) { //设置变量 m_cbMatchTime = 0; ZeroMemory( m_puiMatchDate,sizeof(m_puiMatchDate) ); //获取目录 TCHAR szPath[MAX_PATH]=TEXT(""); GetCurrentDirectory(sizeof(szPath),szPath); //读取配置 TCHAR szFileName[MAX_PATH]=TEXT(""); _sntprintf(szFileName,sizeof(szFileName),TEXT("%s\\MatchOption.ini"),szPath); //信息条数 CString strTemp,strAppName,strValue; strAppName.Format(TEXT("%dTimeRankings"),m_wMatchID); UINT uItemCount=GetPrivateProfileInt(strAppName,TEXT("InfoItemCount"),0,szFileName); //读取场次 m_cbMatchTime=(BYTE)GetPrivateProfileInt(strAppName,TEXT("MatchCount"),0,szFileName); ASSERT(m_cbMatchTime=MAX_MATCH_COUNT)return ; //读取费用 m_dwMatchFee=(UINT)GetPrivateProfileInt(strAppName,TEXT("MatchFee"),0,szFileName); //读取名称 GetPrivateProfileString(strAppName,TEXT("MatchRoom"),TEXT(""), m_pszMatchRoom,32,szFileName); //初始积分 m_lInitScore=(LONG)GetPrivateProfileInt(strAppName,TEXT("InitScore"),0,szFileName); //比赛局数 m_wMatchGameCount=(WORD)GetPrivateProfileInt(strAppName,TEXT("MatchGameCount"),0,szFileName); //读取信息 for(UINT i=0; iszTitle,CountArray(pMatchInfo->szTitle),szFileName); GetPrivateProfileString(strAppName,TEXT("InfoDescribe"),TEXT(""),pMatchInfo->szDescribe,CountArray(pMatchInfo->szDescribe),szFileName); strValue.Format(TEXT("%d"),pMatchInfo->wTitleLen); pMatchInfo->wTitleLen=(WORD)GetPrivateProfileInt(strAppName,TEXT("InfoTitleLen"),0,szFileName); pMatchInfo->wDescribeLen=(WORD)GetPrivateProfileInt(strAppName,TEXT("InfoDescribeLen"),0,szFileName); m_MatchInfo.Add(pMatchInfo); } //场次信息 TCHAR szValue[32]=TEXT(""); for(BYTE i=0; iszTitle,AddMatchInfo.m_strInfoTitle,CountArray(pMatchInfo->szTitle)); lstrcpyn(pMatchInfo->szDescribe,AddMatchInfo.m_strInfoDesc,CountArray(pMatchInfo->szDescribe)); pMatchInfo->wDescribeLen=(WORD)AddMatchInfo.m_nInfoDescLen; pMatchInfo->wTitleLen=(WORD)AddMatchInfo.m_nInfoTitleLen; m_MatchInfo.Add(pMatchInfo); } return; } //修改时间 VOID CMatchParameterDlg::OnBnClickedModifyInfo() { POSITION pos = m_ListMatchInfo.GetFirstSelectedItemPosition(); if( pos == NULL ) { AfxMessageBox( TEXT("请选择要修改的信息"),MB_ICONINFORMATION ); return; } //获取选中项 int nItem = m_ListMatchInfo.GetNextSelectedItem(pos); //获取索引 DWORD_PTR dwMatchIndex = m_ListMatchInfo.GetItemData(nItem); //构造对话框 CDlgAddMatchInfo Dlg; CMD_GR_Match_Info *pMatchInfo=m_MatchInfo.GetAt(nItem); Dlg.m_strInfoTitle=pMatchInfo->szTitle; Dlg.m_strInfoDesc=pMatchInfo->szDescribe; Dlg.m_nInfoDescLen=(int)pMatchInfo->wDescribeLen; Dlg.m_nInfoTitleLen=(int)pMatchInfo->wTitleLen; //显示对话框 if( IDOK == Dlg.DoModal() ) { lstrcpyn(pMatchInfo->szDescribe,(LPCTSTR)Dlg.m_strInfoDesc.GetBuffer(), CountArray(pMatchInfo->szDescribe)); lstrcpyn(pMatchInfo->szTitle, (LPCTSTR)Dlg.m_strInfoTitle.GetBuffer(), CountArray(pMatchInfo->szTitle)); pMatchInfo->wDescribeLen=(WORD)Dlg.m_nInfoDescLen; pMatchInfo->wTitleLen=(WORD)Dlg.m_nInfoTitleLen; UpdateMatchInfoList(); } return; } //删除时间 VOID CMatchParameterDlg::OnBnClickedDeleteInfo() { POSITION pos = m_ListMatchInfo.GetFirstSelectedItemPosition(); if( pos == NULL ) { AfxMessageBox( TEXT("请选择要删除的场次"),MB_ICONINFORMATION ); return; } //遍历选中项 while( pos ) { int nItem = m_ListMatchInfo.GetNextSelectedItem(pos); DWORD_PTR dwMatchIndex = m_ListMatchInfo.GetItemData(nItem); m_MatchInfo.RemoveAt(nItem); } //更新列表 UpdateMatchInfoList(); return; } //更新控件 VOID CMatchParameterDlg::UpdateMatchList() { //清空列表 m_ListMatch.DeleteAllItems(); for( BYTE i = 0; i < m_cbMatchTime; i++ ) { FILETIME ftBegin = {}, ftLocalBegin = {}; FILETIME ftEnd = {}, ftLocalEnd = {}; CopyMemory( &ftBegin,&m_puiMatchDate[i*2],sizeof(ftBegin) ); CopyMemory( &ftEnd,&m_puiMatchDate[i*2+1],sizeof(ftEnd) ); FileTimeToLocalFileTime(&ftBegin,&ftLocalBegin); FileTimeToLocalFileTime(&ftEnd,&ftLocalEnd); SYSTEMTIME stBegin = {}, stEnd = {}; FileTimeToSystemTime(&ftLocalBegin,&stBegin); FileTimeToSystemTime(&ftLocalEnd,&stEnd); //添加到列表 int nItem = m_ListMatch.GetItemCount(); CString str; str.Format( TEXT("第%ld场"),nItem+1 ); m_ListMatch.InsertItem( nItem,str ); //开始时间 m_ListMatch.SetItem( nItem,1,LVIF_TEXT,GetTimeString(stBegin),0,0,0,0,0 ); //结束时间 m_ListMatch.SetItem( nItem,2,LVIF_TEXT,GetTimeString(stEnd),0,0,0,0,0 ); m_ListMatch.SetItemData(nItem,i); } } //更新控件 VOID CMatchParameterDlg::UpdateMatchInfoList() { //清空列表 m_ListMatchInfo.DeleteAllItems(); for(INT_PTR i = 0; iszTitle); strDesc.Format(TEXT("%d"),pMatchInfo->wTitleLen); m_ListMatchInfo.SetItem(nItem,1,LVIF_TEXT,strDesc,0,0,0,0,0); m_ListMatchInfo.SetItem(nItem,2,LVIF_TEXT,pMatchInfo->szDescribe,0,0,0,0,0); strDesc.Format(TEXT("%d"),pMatchInfo->wDescribeLen); m_ListMatchInfo.SetItem(nItem,3,LVIF_TEXT,strDesc,0,0,0,0,0); } } //获取时间字符串 LPCTSTR CMatchParameterDlg::GetTimeString( SYSTEMTIME &st ) { //变量定义 static TCHAR szTime[32] = TEXT(""); _sntprintf(szTime,CountArray(szTime),TEXT("%4d年%02d月%02d日 %02d时%02d分%02d秒"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); return szTime; } //数据交换 void CMatchParameterDlg::DoDataExchange(CDataExchange* pDX) { __super::DoDataExchange(pDX); DDX_Control( pDX,IDC_LIST_MATCH,m_ListMatch ); DDX_Control( pDX,IDC_LIST_MATCH_INFO,m_ListMatchInfo); } //初始化函数 BOOL CMatchParameterDlg::OnInitDialog() { __super::OnInitDialog(); //初始化列表 m_ListMatch.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_ListMatch.InsertColumn( 0,TEXT("场次"),LVCFMT_LEFT,62 ); m_ListMatch.InsertColumn( 1,TEXT("开始时间"),LVCFMT_LEFT,200 ); m_ListMatch.InsertColumn( 2,TEXT("结束时间"),LVCFMT_LEFT,200 ); m_ListMatchInfo.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_ListMatchInfo.InsertColumn( 0,TEXT("信息标题"),LVCFMT_LEFT,60 ); m_ListMatchInfo.InsertColumn( 1,TEXT("标题长度"),LVCFMT_LEFT,60 ); m_ListMatchInfo.InsertColumn( 2,TEXT("信息内容"),LVCFMT_LEFT,200 ); m_ListMatchInfo.InsertColumn( 3,TEXT("内容长度"),LVCFMT_LEFT,60 ); //更新数据 UpdateMatchInfoList(); UpdateMatchList(); //设置数据 CString strTemp; GetDlgItem(IDC_EDIT_MATCH_NAME)->SetWindowText(m_pszMatchRoom); strTemp.Format(TEXT("%d"),m_dwMatchFee); GetDlgItem(IDC_EDIT_FEE)->SetWindowText(strTemp); strTemp.Format(TEXT("%d"),m_lInitScore); GetDlgItem(IDC_EDIT_INIT_SCORE)->SetWindowText(strTemp); strTemp.Format(TEXT("%d"),m_wMatchGameCount); GetDlgItem(IDC_EDIT_MATCH_GAME_COUNT)->SetWindowText(strTemp); return FALSE; } void CMatchParameterDlg::OnOK() { //获取目录 TCHAR szPath[MAX_PATH]=TEXT(""); GetCurrentDirectory(sizeof(szPath),szPath); //读取配置 TCHAR szFileName[MAX_PATH]=TEXT(""); _sntprintf(szFileName,sizeof(szFileName),TEXT("%s\\MatchOption.ini"),szPath); //变量定义 CString strTemp,strAppName,strValue; //写入配置 strAppName.Format(TEXT("%dTimeRankings"),m_wMatchID); strTemp.Format(TEXT("%d"),m_MatchInfo.GetCount()); WritePrivateProfileString(strAppName,TEXT("InfoItemCount"),strTemp,szFileName); //写入场次 strTemp.Format(TEXT("%d"),m_cbMatchTime); WritePrivateProfileString(strAppName,TEXT("MatchCount"),strTemp,szFileName); //写入费用 GetDlgItem(IDC_EDIT_FEE)->GetWindowText(strTemp); CT2CA strNum(strTemp); m_dwMatchFee=atoi(strNum); WritePrivateProfileString(strAppName,TEXT("MatchFee"),strTemp,szFileName); //写入名称 GetDlgItem(IDC_EDIT_MATCH_NAME)->GetWindowText(strTemp); lstrcpyn(m_pszMatchRoom, strTemp, 32); WritePrivateProfileString(strAppName,TEXT("MatchRoom"), m_pszMatchRoom,szFileName); //初始积分 GetDlgItem(IDC_EDIT_INIT_SCORE)->GetWindowText(strTemp); CT2CA strScore(strTemp); m_lInitScore=atoi(strScore); WritePrivateProfileString(strAppName,TEXT("InitScore"), strTemp,szFileName); //比赛局数 GetDlgItem(IDC_EDIT_MATCH_GAME_COUNT)->GetWindowText(strTemp); CT2CA strGameCount(strTemp); m_wMatchGameCount=atoi(strGameCount); WritePrivateProfileString(strAppName,TEXT("MatchGameCount"), strTemp,szFileName); //写入信息 for(INT_PTR i=0; iszTitle,szFileName); WritePrivateProfileString(strAppName,TEXT("InfoDescribe"),pMatchInfo->szDescribe,szFileName); strValue.Format(TEXT("%d"),pMatchInfo->wTitleLen); WritePrivateProfileString(strAppName,TEXT("InfoTitleLen"),strValue,szFileName); strValue.Format(TEXT("%d"),pMatchInfo->wDescribeLen); WritePrivateProfileString(strAppName,TEXT("InfoDescribeLen"),strValue,szFileName); } //写入时间 for(BYTE i=0; i= m_TimeEnd ) { AfxMessageBox( TEXT("结束时间必须大于开始时间,请重新输入"),MB_ICONERROR ); return; } __super::OnOK(); } ////////////////////////////////////////////////////////////////////////////////// //构造函数 CDlgAddMatchInfo::CDlgAddMatchInfo(): CDialog(IDD) , m_strInfoTitle(_T("")) , m_strInfoDesc(_T("")) , m_nInfoTitleLen(0) , m_nInfoDescLen(0) { } //析构函数 CDlgAddMatchInfo::~CDlgAddMatchInfo() { } //数据交换 void CDlgAddMatchInfo::DoDataExchange(CDataExchange* pDX) { __super::DoDataExchange(pDX); } //初始化 BOOL CDlgAddMatchInfo::OnInitDialog() { __super::OnInitDialog(); GetDlgItem(IDC_EDIT_DESC)->SetWindowText(m_strInfoDesc); GetDlgItem(IDC_EDIT_TITLE)->SetWindowText(m_strInfoTitle); CString strTemp; strTemp.Format(TEXT("%d"),m_nInfoDescLen); GetDlgItem(IDC_EDIT_DESC_LEN)->SetWindowText(strTemp); strTemp.Format(TEXT("%d"),m_nInfoTitleLen); GetDlgItem(IDC_EDIT_TITLE_LEN)->SetWindowText(strTemp); return TRUE; } //确定函数 VOID CDlgAddMatchInfo::OnOK() { GetDlgItem(IDC_EDIT_DESC)->GetWindowText(m_strInfoDesc); GetDlgItem(IDC_EDIT_TITLE)->GetWindowText(m_strInfoTitle); CString strTemp; GetDlgItem(IDC_EDIT_DESC_LEN)->GetWindowText(strTemp); CT2CA strNum(strTemp); m_nInfoDescLen=atoi(strNum); GetDlgItem(IDC_EDIT_TITLE_LEN)->GetWindowText(strTemp); CT2CA strNum1(strTemp); m_nInfoTitleLen=atoi(strNum1); __super::OnOK(); } //////////////////////////////////////////////////////////////////////////////////