#include "StdAfx.h" #include "ServerListControl.h" ////////////////////////////////////////////////////////////////////////////////// //构造函数 CServerListControl::CServerListControl() { } //析构函数 CServerListControl::~CServerListControl() { } //配置列表 VOID CServerListControl::InitListControl() { //变量定义 INT nColIndex = 0; //配置列表 InsertColumn(nColIndex++, TEXT("房间名字"), LVCFMT_LEFT, 120/*90*/); InsertColumn(nColIndex++, TEXT("模块名字"), LVCFMT_CENTER, 80); InsertColumn(nColIndex++, TEXT("房间类型"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("桌子数目"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("监听端口"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("房间标识"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("类型标识"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("节点标识"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("排序标识"), LVCFMT_CENTER, 60); InsertColumn(nColIndex++, TEXT("数据库名"), LVCFMT_LEFT, 100); InsertColumn(nColIndex++, TEXT("数据库地址"), LVCFMT_LEFT, 100); InsertColumn(nColIndex++, TEXT("服务器名"), LVCFMT_LEFT, 140); InsertColumn(nColIndex++, TEXT("客户端名"), LVCFMT_LEFT, 120); return; } //子项排序 INT CServerListControl::SortListItemData(LPARAM lParam1, LPARAM lParam2, WORD wColumnIndex) { //变量定义 tagGameServerInfo * pGameServerInfo1 = (tagGameServerInfo *)lParam1; tagGameServerInfo * pGameServerInfo2 = (tagGameServerInfo *)lParam2; //安装排序 bool bInstall1 = (pGameServerInfo1->dwNativeVersion != 0L); bool bInstall2 = (pGameServerInfo2->dwNativeVersion != 0L); if (bInstall1 != bInstall2) return (bInstall1 == true) ? 1 : -1; //子项排序 switch (wColumnIndex) { case 0: //房间名字 { return lstrcmp(pGameServerInfo1->szServerName, pGameServerInfo2->szServerName); } case 1: //游戏名字 { return lstrcmp(pGameServerInfo1->szGameName, pGameServerInfo2->szGameName); } case 2: //房间类型 { return (pGameServerInfo1->wServerType > pGameServerInfo2->wServerType) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 3: //桌子数目 { return (pGameServerInfo1->wTableCount > pGameServerInfo2->wTableCount) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 4: //监听端口 { return (pGameServerInfo1->wServerPort > pGameServerInfo2->wServerPort) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 5: //房间标识 { return (pGameServerInfo1->wServerID > pGameServerInfo2->wServerID) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 6: //类型标识 { //房间标识 WORD wKindID1 = pGameServerInfo1->wKindID; if (wKindID1 == 0) wKindID1 = pGameServerInfo1->wGameID; //房间标识 WORD wKindID2 = pGameServerInfo2->wKindID; if (wKindID2 == 0) wKindID2 = pGameServerInfo2->wGameID; return (wKindID1 > wKindID2) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 7: //节点标识 { return (pGameServerInfo1->wNodeID > pGameServerInfo2->wNodeID) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 8: //排序标识 { return (pGameServerInfo1->wSortID > pGameServerInfo2->wSortID) ? SORT_POSITION_AFTER : SORT_POSITION_FRONT; } case 9: //数据库名 { return lstrcmp(pGameServerInfo1->szDataBaseName, pGameServerInfo2->szDataBaseName); } case 10: //数据库地址 { return lstrcmp(pGameServerInfo1->szDataBaseAddr, pGameServerInfo2->szDataBaseAddr); } case 11: //服务器名 { return lstrcmp(pGameServerInfo1->szServerDLLName, pGameServerInfo2->szServerDLLName); } case 12: //客户端名 { return lstrcmp(pGameServerInfo1->szClientEXEName, pGameServerInfo2->szClientEXEName); } } return 0; } //获取颜色 VOID CServerListControl::GetListItemColor(LPARAM lItemParam, UINT uItemStatus, tagListItemColor & ListItemColor) { //变量定义 ASSERT(lItemParam != NULL); tagGameServerInfo * pGameServerInfo = (tagGameServerInfo *)lItemParam; //没有安装 if (pGameServerInfo->dwNativeVersion == 0L) { //设置颜色 ListItemColor.rcTextColor = RGB(125, 125, 125); ListItemColor.rcBackColor = (uItemStatus&ODS_SELECTED) ? RGB(50, 50, 50) : CR_NORMAL_BK; return; } //存在更新 if (pGameServerInfo->dwNativeVersion != pGameServerInfo->dwServerVersion) { //设置颜色 ListItemColor.rcTextColor = RGB(128, 0, 0); ListItemColor.rcBackColor = (uItemStatus&ODS_SELECTED) ? RGB(230, 230, 0) : CR_NORMAL_BK; return; } //版本一致 if (pGameServerInfo->dwNativeVersion == pGameServerInfo->dwServerVersion) { //设置颜色 ListItemColor.rcBackColor = (uItemStatus&ODS_SELECTED) ? RGB(0, 0, 128) : CR_NORMAL_BK; ListItemColor.rcTextColor = (uItemStatus&ODS_SELECTED) ? RGB(255, 255, 255) : RGB(0, 0, 0); return; } return; } //插入列表 bool CServerListControl::InsertServerInfo(tagGameServerInfo * pGameServerInfo) { //变量定义 LVFINDINFO FindInfo; ZeroMemory(&FindInfo, sizeof(FindInfo)); //设置变量 FindInfo.flags = LVFI_PARAM; FindInfo.lParam = (LPARAM)pGameServerInfo; //存在判断 INT nInsertItem = FindItem(&FindInfo); if (nInsertItem != LB_ERR) return true; //插入列表 for (WORD i = 0; i < m_ListHeaderCtrl.GetItemCount(); i++) { if (i == 0) { //插入首项 INT nIndex = GetInsertIndex(pGameServerInfo); LPCTSTR pszDescribe = GetDescribeString(pGameServerInfo, i); nInsertItem = InsertItem(LVIF_TEXT | LVIF_PARAM, nIndex, pszDescribe, 0, 0, 0, (LPARAM)pGameServerInfo); } else { //字符子项 SetItem(nInsertItem, i, LVIF_TEXT, GetDescribeString(pGameServerInfo, i), 0, 0, 0, 0); } } return true; } //插入索引 WORD CServerListControl::GetInsertIndex(tagGameServerInfo * pGameServerInfo) { //变量定义 INT nItemCount = GetItemCount(); tagGameServerInfo * pGameServerTemp = NULL; //获取位置 for (INT i = 0; i < nItemCount; i++) { //获取数据 pGameServerTemp = (tagGameServerInfo *)GetItemData(i); //安装判断 if ((pGameServerInfo->dwNativeVersion == 0) && (pGameServerTemp->dwNativeVersion != 0)) { continue; } //游戏名字 if (lstrcmp(pGameServerInfo->szGameName, pGameServerTemp->szGameName) < 0) { return i; } //房间名字 if (lstrcmp(pGameServerInfo->szServerName, pGameServerTemp->szServerName) < 0) { return i; } } return nItemCount; } //描述字符 LPCTSTR CServerListControl::GetDescribeString(tagGameServerInfo * pGameServerInfo, WORD wColumnIndex) { //变量定义 static TCHAR szDescribe[128] = TEXT(""); //构造字符 switch (wColumnIndex) { case 0: //房间名字 { return pGameServerInfo->szServerName; } case 1: //游戏名字 { return pGameServerInfo->szGameName; } case 2: //房间类型 { //财富类型 if (pGameServerInfo->wServerType&GAME_GENRE_GOLD) { lstrcpyn(szDescribe, TEXT("财富类型"), CountArray(szDescribe)); return szDescribe; } //积分类型 if (pGameServerInfo->wServerType&GAME_GENRE_SCORE) { lstrcpyn(szDescribe, TEXT("金币类型")/*TEXT("积分类型")*/, CountArray(szDescribe)); return szDescribe; } //比赛类型 if (pGameServerInfo->wServerType&GAME_GENRE_MATCH) { lstrcpyn(szDescribe, TEXT("比赛类型"), CountArray(szDescribe)); return szDescribe; } //训练类型 if (pGameServerInfo->wServerType&GAME_GENRE_EDUCATE) { lstrcpyn(szDescribe, TEXT("训练类型"), CountArray(szDescribe)); return szDescribe; } return TEXT("未知类型"); } case 3: //桌子数目 { _itot(pGameServerInfo->wTableCount, szDescribe, 10); return szDescribe; } case 4: //监听端口 { if (pGameServerInfo->wServerPort == 0) return TEXT("-"); _itot(pGameServerInfo->wServerPort, szDescribe, 10); return szDescribe; } case 5: //房间标识 { _itot(pGameServerInfo->wServerID, szDescribe, 10); return szDescribe; } case 6: //类型标识 { WORD wKindID = pGameServerInfo->wKindID; WORD wGameID = pGameServerInfo->wGameID; _itot((wKindID == 0) ? wGameID : wKindID, szDescribe, 10); return szDescribe; } case 7: //节点标识 { _itot(pGameServerInfo->wNodeID, szDescribe, 10); return szDescribe; } case 8: //排序标识 { _itot(pGameServerInfo->wSortID, szDescribe, 10); return szDescribe; } case 9: //数据库名 { return pGameServerInfo->szDataBaseName; } case 10: //数据库地址 { return pGameServerInfo->szDataBaseAddr; } case 11: //服务器名 { return pGameServerInfo->szServerDLLName; } case 12: //客户端名 { return pGameServerInfo->szClientEXEName; } } return NULL; } //////////////////////////////////////////////////////////////////////////////////