// LogonServerDlg.cpp : 实现文件 // #include "stdafx.h" #include "LogonServer.h" #include "LogonServerDlg.h" #include "afxdialogex.h" #include "StatisticalUser.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif #define WM_MYMSG (WM_USER+110) //禁止加入房间与禁止分配 #define WM_MYMSGACK (WM_USER+111) //禁止加入房间与禁止分配的结果回复 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() STARTP CLogonServerDlg::g_StartP; // CLogonServerDlg 对话框 bool CLogonServerDlg::SetShangBao(int Num) { CLogonServerApp* pCLogonServerApp = (CLogonServerApp*)AfxGetApp(); CLogonServerDlg* pCLogonServerDlg = NULL; if (pCLogonServerApp) { pCLogonServerDlg = (CLogonServerDlg* )pCLogonServerApp->m_pMainWnd; CString csTest; csTest.Format(L"%d", Num); pCLogonServerDlg->mShangBao.SetWindowTextW(csTest); } return true; } bool CLogonServerDlg::SetJiQi(CString a) { CLogonServerApp* pCLogonServerApp = (CLogonServerApp*)AfxGetApp(); CLogonServerDlg* pCLogonServerDlg = NULL; if (pCLogonServerApp) { pCLogonServerDlg = (CLogonServerDlg*)pCLogonServerApp->m_pMainWnd; pCLogonServerDlg->mJiQi.SetWindowTextW(a); } return true; } bool CLogonServerDlg::SetUpdata(CString a) { CLogonServerApp* pCLogonServerApp = (CLogonServerApp*)AfxGetApp(); CLogonServerDlg* pCLogonServerDlg = NULL; if (pCLogonServerApp) { pCLogonServerDlg = (CLogonServerDlg*)pCLogonServerApp->m_pMainWnd; pCLogonServerDlg->csUpdata.SetWindowTextW(a); } return true; } CLogonServerDlg::CLogonServerDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CLogonServerDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); iRenWuID = 0; } void CLogonServerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TRACE_MESSAGE, m_TraceServiceControl); DDX_Control(pDX, IDC_TREE1, ServiceTree); DDX_Control(pDX, IDC_EDIT1, mShangBao); DDX_Control(pDX, IDC_EDIT2, mJiQi); DDX_Control(pDX, IDC_EDIT3, csUpdata); } BEGIN_MESSAGE_MAP(CLogonServerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_START_SERVICE, &CLogonServerDlg::OnBnClickedStartService) ON_BN_CLICKED(IDC_STOP_SERVICE, &CLogonServerDlg::OnBnClickedStopService) ON_MESSAGE(WM_MYMSG, &CLogonServerDlg::OnMessageStop) ON_WM_QUERYENDSESSION() ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CLogonServerDlg::OnTvnSelchangedTree1) ON_NOTIFY(TVN_GETINFOTIP, IDC_TREE1, &CLogonServerDlg::OnTvnGetInfoTipTree1) ON_BN_CLICKED(IDC_BUTTON3, &CLogonServerDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON1, &CLogonServerDlg::OnBnClickedButton1) ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CLogonServerDlg::OnNMDblclkTree1) ON_WM_TIMER() END_MESSAGE_MAP() // CLogonServerDlg 消息处理程序 //停止业务 LRESULT CLogonServerDlg::OnMessageStop(WPARAM wParam, LPARAM lParam) { WORD wTest = lParam; if (wTest != g_StartP.wServerID) { return 0; } iRenWuID = wParam;//任务ID //延迟关闭时间 SetTimer(101, 31 * 60 * 1000, NULL); return 0L; } BOOL CLogonServerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); memset(m_AppPath, 0, sizeof(m_AppPath)); GetModuleFileName(AfxGetInstanceHandle(), m_AppPath, sizeof(m_AppPath)); CString strCaption; strCaption.Format(TEXT("登录服务器 -- [ 停止 ](路径:%s)"), m_AppPath); SetWindowText(strCaption/*TEXT("登录服务器 -- [ 停止 ]")*/); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 HICON hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); SetIcon(hIcon, TRUE); // 设置大图标 SetIcon(hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_ServiceUnits.SetServiceUnitsSink(this); HICON hIconNow[4]; // 图标句柄数组 HTREEITEM hCataItem; // 可表示任一分类节点的句柄 // 加载三个图标,并将它们的句柄保存到数组 hIconNow[0] = theApp.LoadIcon(IDI_ICON3); hIconNow[1] = theApp.LoadIcon(IDI_ICON1); hIconNow[2] = theApp.LoadIcon(IDI_ICON4); hIconNow[3] = theApp.LoadIcon(IDI_ICON6); // 创建图像序列CImageList对象 m_imageList.Create(32, 32, ILC_COLOR32, 3, 3); // 将三个图标添加到图像序列 for (int i = 0; i<3; i++) { m_imageList.Add(hIconNow[i]); } // 为树形控件设置图像序列 ServiceTree.SetImageList(&m_imageList, TVSIL_NORMAL); // 插入根节点 hRoot = ServiceTree.InsertItem(_T("提供服务的游戏服务器"), 0, 0); TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir); g_StartP.iAuto = GetPrivateProfileInt(TEXT("Server"), TEXT("Auto"), 0, szIniFile); g_StartP.wServerID = GetPrivateProfileInt(TEXT("Server"), TEXT("ServerID"), 1, szIniFile); //读取字符 GetPrivateProfileString(TEXT("SYS"), TEXT("守护进程"), TEXT(""), g_StartP.szShouHu, CountArray(g_StartP.szShouHu), szIniFile); GetPrivateProfileString(TEXT("SYS"), TEXT("策略获取地址"), TEXT(""), g_StartP.szCeLv, CountArray(g_StartP.szCeLv), szIniFile); if (g_StartP.iAuto == 1) { OnBnClickedStartService(); SetTimer(1, 2000, NULL); } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CLogonServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CLogonServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CLogonServerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } VOID CLogonServerDlg::OnServiceUnitsStatus(enServiceStatus ServiceStatus) { //状态设置 switch (ServiceStatus) { case ServiceStatus_Stop: //停止状态 { CString strCaption; strCaption.Format(TEXT("登录服务器V1.2 --[停止](路径:%s)"), m_AppPath); SetWindowText(strCaption); //设置按钮 GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(FALSE); GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE); //提示信息 LPCTSTR pszDescribe = TEXT("服务停止成功"); CTraceService::TraceString(pszDescribe, TraceLevel_Normal); break; } case ServiceStatus_Config: //配置状态 { CString strCaption; strCaption.Format(TEXT("登录服务器V1.2 -- [ 初始化 ](路径:%s)"), m_AppPath); //设置标题 SetWindowText(strCaption); //设置按钮 GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE); GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE); //提示信息 LPCTSTR pszDescribe = TEXT("正在初始化组件..."); CTraceService::TraceString(pszDescribe, TraceLevel_Normal); break; } case ServiceStatus_Service: //服务状态 { CString strCaption; strCaption.Format(TEXT("登录服务器V1.2 -- [ 运行 ](路径:%s)"), m_AppPath); //设置标题 SetWindowText(strCaption); //设置按钮 GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE); GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE); //提示信息 LPCTSTR pszDescribe = TEXT("服务启动成功"); CTraceService::TraceString(pszDescribe, TraceLevel_Normal); break; } } return; } void CLogonServerDlg::OnBnClickedStartService() { //启动服务 try { //启用共享内存 HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("GAMESERVERINFOG__")); if (m_hMapFile) { //显示共享的文件数据。 LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = { 0 }; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 GAMESERVERINFOALL *pBuffer = (GAMESERVERINFOALL *)lpMapAddr; //检测当前节点是否存在 if (pBuffer->iNum > 20) { CTraceService::TraceString(TEXT("共享内存数据数据混乱"), TraceLevel_Warning); goto look; } //查找节点是否已经存在 for (int i = 0; i < pBuffer->iNum; i++) { if (pBuffer->Data[i].dServerID == g_StartP.wServerID) { StringCchCopy(pBuffer->Data[i].szPath, 256, path_buffer); pBuffer->Data[i].iStat = 1; pBuffer->Data[i].Pid = GetCurrentProcessId(); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); goto look; } } (pBuffer->iNum)++; pBuffer->Data[pBuffer->iNum - 1].dServerID = g_StartP.wServerID; StringCchCopy(pBuffer->Data[pBuffer->iNum - 1].szPath, 256, path_buffer); pBuffer->Data[pBuffer->iNum - 1].iStat = 1; pBuffer->Data[pBuffer->iNum - 1].Pid = GetCurrentProcessId(); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); } else { //创建共享文件。 m_hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 0x10000, _T("GAMESERVERINFOG__")); //拷贝数据到共享文件里。 LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); HINSTANCE hInst = NULL; hInst = AfxGetApp()->m_hInstance; TCHAR path_buffer[_MAX_PATH] = { 0 }; GetModuleFileName(hInst, path_buffer, sizeof(path_buffer));//得到exe文件的全路径 GAMESERVERINFOALL Buffer; ZeroMemory(&Buffer, sizeof(GAMESERVERINFOALL)); Buffer.iNum++; Buffer.Data[Buffer.iNum - 1].dServerID = g_StartP.wServerID; StringCchCopy(Buffer.Data[Buffer.iNum - 1].szPath, 256, path_buffer); Buffer.Data[Buffer.iNum - 1].iStat = 1; Buffer.Data[Buffer.iNum - 1].Pid = GetCurrentProcessId(); StringCchCopy(Buffer.szCtrl, 256, g_StartP.szCeLv); memcpy(lpMapAddr, &Buffer, sizeof(GAMESERVERINFOALL)); FlushViewOfFile(lpMapAddr, sizeof(GAMESERVERINFOALL) + 1); } look: m_ServiceUnits.StartService(); } catch (...) { ASSERT(FALSE); } return; } void CLogonServerDlg::OnBnClickedStopService() { int iRet = MessageBox(L"确定关闭吗?", L"真的确定关闭我吗", MB_YESNO); if (IDYES != iRet) { return; } //停止服务 try { m_ServiceUnits.ConcludeService(); } catch (...) { ASSERT(FALSE); } return; } BOOL CLogonServerDlg::OnQueryEndSession() { //提示消息 if (m_ServiceUnits.GetServiceStatus() != ServiceStatus_Stop) { CTraceService::TraceString(TEXT("服务正在运行中,系统要求注销回话请求失败"), TraceLevel_Warning); return FALSE; } // TODO: 在此添加专用的查询结束会话代码 return TRUE; } BOOL CLogonServerDlg::PreTranslateMessage(MSG * pMsg) { //按键过滤 if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE)) { return TRUE; } return __super::PreTranslateMessage(pMsg); } void CLogonServerDlg::OnOK() { return; } void CLogonServerDlg::OnCancel() { //关闭询问 if (m_ServiceUnits.GetServiceStatus() != ServiceStatus_Stop) { LPCTSTR pszQuestion = TEXT("登录服务器正在运行中,您确实要关闭服务器吗?"); if (AfxMessageBox(pszQuestion, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) != IDYES) return; } //停止服务 m_ServiceUnits.ConcludeService(); __super::OnCancel(); } void CLogonServerDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; } //消息提示 void CLogonServerDlg::OnTvnGetInfoTipTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here *pResult = 0; NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR; // 将传入的pNMHDR转换为NMTVGETINFOTIP指针类型 HTREEITEM hRoot = ServiceTree.GetRootItem(); // 获取树的根节点 CString strText; // 每个树节点的提示信息 if (pTVTipInfo->hItem == hRoot) { // 如果鼠标划过的节点是根节点,则提示信息为空 strText = _T(""); } else { // 如果鼠标划过的节点不是根节点,则将该节点的附加32位数据格式化为字符串 DWORD dServerID = pTVTipInfo->lParam; CGameServerItem * pCGameServerItem = m_ServiceUnits.m_AttemperEngineSink.m_ServerListManager.SearchGameServer(dServerID); if (pCGameServerItem) { strText.Format(_T("节点编号%d,在线人数%d/%d,在线牌桌%d/%d"), pTVTipInfo->lParam , pCGameServerItem->m_GameServer.dwOnLineCount, pCGameServerItem->m_GameServer.dwFullCount , pCGameServerItem->m_GameServer.wTableOnlineCount, pCGameServerItem->m_GameServer.wTableFullCount); } else { strText.Format(_T("节点编号%d,未找到此节点信息."), pTVTipInfo->lParam); } } // 将strText字符串拷贝到pTVTipInfo结构体变量的pszText成员中,这样就能显示内容为strText的提示信息 wcscpy(pTVTipInfo->pszText, strText); } void CLogonServerDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 } void CLogonServerDlg::OnBnClickedButton3() { } void CLogonServerDlg::OnBnClickedButton1() { // 更新通道 m_ServiceUnits.m_AttemperEngineSink.m_pITCPNetworkEngine->OnTBDataEvent(217, 0, NULL, 0); } void CLogonServerDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 HTREEITEM hTreeItem = ServiceTree.GetSelectedItem(); DWORD dServerID = ServiceTree.GetItemData(hTreeItem);//获得当前选中节点的附件信息 HTREEITEM(可以是你存的一个32位的地址,强转成你存放的类型(CString*、float*.....)即可) //CString csTest; //csTest.Format(L"%d", dServerID); //MessageBox(csTest); CGameServerItem * pCGameServerItem = m_ServiceUnits.m_AttemperEngineSink.m_ServerListManager.SearchGameServer(dServerID); if (pCGameServerItem) { pCGameServerItem->m_GameServer.bService = !pCGameServerItem->m_GameServer.bService; HTREEITEM startitem = ServiceTree.GetChildItem(hRoot); while (startitem) { CString strTemp = ServiceTree.GetItemText(startitem); DWORD dData = ServiceTree.GetItemData(startitem); if (dData == dServerID) { if (pCGameServerItem->m_GameServer.bService > 0) { //正常服务状态 ServiceTree.SetItemImage(startitem, 1, 1); break; } else if (pCGameServerItem->m_GameServer.bService == 0) { //主动不提供服务状态 ServiceTree.SetItemImage(startitem, 2, 2); break; } else { //被攻击无法服务状态 ServiceTree.SetItemImage(startitem, 3, 3); break; } } startitem = ServiceTree.GetNextSiblingItem(startitem); } } *pResult = 0; } // //void CLogonServerDlg::OnTimer(UINT_PTR nIDEvent) //{ // // TODO: 在此添加消息处理程序代码和/或调用默认值 // if (nIDEvent == 1) // { // KillTimer(1); // OnBnClickedButton1(); // } // else if (nIDEvent == 101) // { // KillTimer(101); // try // { // m_ServiceUnits.ConcludeService(); // } // catch (...) // { // ASSERT(FALSE); // } // // //通知任务 // //检测人数是否已经退出,若都退出则关闭。 // DWORD dwProcessID = NULL; // if (!StatisticalUser::GetTokenByName(dwProcessID, g_StartP.szShouHu)) // { // CTraceService::TraceString(TEXT("未找守护进程,无法回报信息。"), TraceLevel_Warning); // return; // } // // CList mList; // // if (!StatisticalUser::GetWindowHwndByPid(dwProcessID, mList)) // { // CTraceService::TraceString(TEXT("未找守护进程对应的窗口,无法回报信息。"), TraceLevel_Warning); // return; // } // // //发送信息 // POSITION pos = mList.GetTailPosition(); // CString data; // while (pos != NULL) // { // HWND hHandle = mList.GetNext(pos); // ::SendMessage(hHandle, WM_MYMSGACK, iRenWuID, g_StartP.wServerID); // } // } // __super::OnTimer(nIDEvent); //}