Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
453 lines
14 KiB
C++
453 lines
14 KiB
C++
// SetupPage3.cpp : 구현 파일입니다.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "SeverSetupDlg.h"
|
|
#include "SetupPage3.h"
|
|
#include "ServerGroup.h"
|
|
|
|
#include <Utility/Setup/ServerSetup.h>
|
|
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
|
#include ".\setuppage3.h"
|
|
|
|
// CSetupPage3 대화 상자입니다.
|
|
|
|
IMPLEMENT_DYNAMIC(CSetupPage3, CPropertyPage)
|
|
|
|
CSetupPage3::CSetupPage3()
|
|
: CPropertyPage(CSetupPage3::IDD)
|
|
, m_bPingCheck(FALSE)
|
|
, m_bHackCheck(FALSE)
|
|
, m_bLotteryEvent(FALSE)
|
|
, m_bLevelUpEvent(FALSE)
|
|
, m_bDeathPenaltyEvent(FALSE)
|
|
, m_ExpRate(_T(""))
|
|
, m_DropRate(_T(""))
|
|
, m_EquipCorrRate(_T(""))
|
|
, m_ServerID(_T(""))
|
|
, m_ServerIDHex(_T(""))
|
|
, m_bEnabled(FALSE)
|
|
, m_DBAgentServerAddress(_T(""))
|
|
, m_LogServerAddress(_T(""))
|
|
, m_ChatServerAddress(_T(""))
|
|
, m_BattleLimit(_T(""))
|
|
, m_BattleLimitPer(_T("100"))
|
|
, m_strZoneCount(_T("0"))
|
|
, m_bBattleServer(FALSE)
|
|
, m_Fame(_T(""))
|
|
, m_Refine(_T(""))
|
|
, m_Mileage(_T(""))
|
|
, m_strTCPPort(_T(""))
|
|
, m_strP1UDPListen(_T(""))
|
|
{
|
|
}
|
|
|
|
CSetupPage3::~CSetupPage3()
|
|
{
|
|
}
|
|
|
|
void CSetupPage3::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
|
|
DDX_Check(pDX, IDC_PINGCHECK, m_bPingCheck);
|
|
DDX_Check(pDX, IDC_HACKCHECK, m_bHackCheck);
|
|
DDX_Check(pDX, IDC_LOTTERY, m_bLotteryEvent);
|
|
DDX_Check(pDX, IDC_LEVELUP, m_bLevelUpEvent);
|
|
DDX_Check(pDX, IDC_DEATHPENALTY, m_bDeathPenaltyEvent);
|
|
DDX_Text(pDX, IDC_AGENTADDR, m_DBAgentServerAddress);
|
|
DDX_Text(pDX, IDC_EXP, m_ExpRate);
|
|
DDX_Text(pDX, IDC_DROP, m_DropRate);
|
|
DDX_Control(pDX, IDC_ZONE, m_Zone);
|
|
DDX_Control(pDX, IDC_CHANNEL, m_Channel);
|
|
DDX_Text(pDX, IDC_SERVERID, m_ServerID);
|
|
DDX_Text(pDX, IDC_SERVERID_HEX, m_ServerIDHex);
|
|
DDX_Control(pDX, IDC_GROUP, m_Group);
|
|
DDX_Text(pDX, IDC_LOGSERVERADDR, m_LogServerAddress);
|
|
DDX_Text(pDX, IDC_CHATSERVERADDR, m_ChatServerAddress);
|
|
DDX_Text(pDX, IDC_BATTLELIMIT, m_BattleLimit);
|
|
DDX_Text(pDX, IDC_BATTLELIMITPER, m_BattleLimitPer);
|
|
DDX_Text(pDX, IDC_ZONE_TCPPORT, m_strTCPPort);
|
|
DDX_Control(pDX, IDC_ZONE_SELECTION, m_ctrlZoneCountCb);
|
|
DDX_Text(pDX, IDC_ZONE_COUNT, m_strZoneCount);
|
|
DDX_Control(pDX, IDC_SAVE_ZONE_SETING, m_ctrlSaveZoneSetting);
|
|
DDX_Check(pDX, IDC_GAMEBATTLESERVER, m_bBattleServer);
|
|
DDX_Control(pDX, IDC_NATION_SELECTION, m_Nation);
|
|
DDX_Text(pDX, IDC_FAME, m_Fame);
|
|
DDX_Text(pDX, IDC_REFINE, m_Refine);
|
|
DDX_Text(pDX, IDC_MILEAGE, m_Mileage);
|
|
DDX_Text(pDX, IDC_ZONE_UDPPORT, m_strP1UDPListen);
|
|
DDX_Text(pDX, IDC_EQUIPCORR, m_EquipCorrRate);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CSetupPage3, CPropertyPage)
|
|
ON_CBN_SELCHANGE(IDC_GROUP, OnCbnSelchangeGroup)
|
|
ON_CBN_SELCHANGE(IDC_ZONE, OnCbnSelchangeZone)
|
|
ON_CBN_SELCHANGE(IDC_CHANNEL, OnCbnSelchangeChannel)
|
|
ON_BN_CLICKED(IDC_ZONE_ADD, OnBnClickedZoneAdd)
|
|
ON_BN_CLICKED(IDC_ZONE_DEL, OnBnClickedZoneDel)
|
|
ON_CBN_SELCHANGE(IDC_ZONE_SELECTION, OnCbnSelchangeZoneSelection)
|
|
ON_BN_CLICKED(IDC_SAVE_ZONE_SETING, OnBnClickedSaveZoneSetting)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
// CSetupPage3 메시지 처리기입니다.
|
|
BOOL CSetupPage3::OnInitDialog()
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
const int MAX_BUFFER = 260;
|
|
|
|
char ZoneCount[MAX_BUFFER] = "";
|
|
char strInputedZoneSetupNum[MAX_BUFFER] = "";
|
|
char strGameServerNation[MAX_BUFFER] = "";
|
|
char strBattleServer[MAX_BUFFER] = "";
|
|
|
|
ReadStringFromReg(g_szSetupFileName, "Zone_ETC", "ZoneCount", ZoneCount, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, "Zone_ETC", "InputedZoneSetupNum", strInputedZoneSetupNum, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, "Zone_ETC", "GameServerNation", strGameServerNation, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, "Zone_ETC", "BattleServerGroup", strBattleServer, MAX_BUFFER);
|
|
|
|
m_strZoneCount = ZoneCount;
|
|
m_bBattleServer = (0 != atoi(strBattleServer));
|
|
|
|
// 게임 서버 설정 페이지 콤보 셋팅
|
|
SetGameServerNation(m_Nation);
|
|
SetServerGroup(m_Group);
|
|
SetServerZone(m_Zone);
|
|
SetServerChannel(m_Channel);
|
|
SetZoneCountCombo(m_ctrlZoneCountCb);
|
|
|
|
m_Nation.SetCurSel(atoi(strGameServerNation));
|
|
|
|
// 셋팅 되어 있는 존이 있다면 첫번째 셋팅 한 존으로 초기화
|
|
if (0 == atoi(ZoneCount))
|
|
{
|
|
m_ctrlZoneCountCb.EnableWindow(false);
|
|
m_ctrlSaveZoneSetting.EnableWindow(false);
|
|
}
|
|
else
|
|
{
|
|
m_ctrlZoneCountCb.SetCurSel(0);
|
|
SetGameServerPage(1);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CSetupPage3::SetGameServerPage(unsigned int nZoneCount)
|
|
{
|
|
const int MAX_BUFFER = 260;
|
|
|
|
char szSection[MAX_BUFFER], szSetCount[MAX_BUFFER] = "";
|
|
|
|
for(int nZone = 1; nZone < m_Zone.GetCount(); ++nZone)
|
|
{
|
|
for(int nCh = 0; nCh < m_Channel.GetCount(); ++nCh)
|
|
{
|
|
_snprintf(szSection, MAX_PATH, "Zone_%02d%02d", nZone, nCh);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "SetCount", szSetCount, MAX_BUFFER);
|
|
|
|
if ((nZoneCount != 0) && (nZoneCount == atoi(szSetCount)))
|
|
{
|
|
SetZoneSetupInfo(szSection);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
SetZoneSetupInfo("?????");
|
|
}
|
|
|
|
void CSetupPage3::SetZoneSetupInfo(char* szSection)
|
|
{
|
|
// 게임 서버 설정 페이지 셋팅할 정보 읽기
|
|
|
|
const int MAX_BUFFER = 260;
|
|
|
|
char szServerID[MAX_BUFFER] = "";
|
|
char szPingCheck[MAX_BUFFER] = "";
|
|
char szSpeedHackCheck[MAX_BUFFER] = "";
|
|
char szLotteryEvent[MAX_BUFFER] = "";
|
|
char szLevelUpEvent[MAX_BUFFER] = "";
|
|
char szDeathPenaltyEvent[MAX_BUFFER] = "";
|
|
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "ServerID", szServerID, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "PingCheck", szPingCheck, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "SpeedHackCheck", szSpeedHackCheck, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "LotteryEvent", szLotteryEvent, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "LevelUpEvent", szLevelUpEvent, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "DeathPenaltyEvent", szDeathPenaltyEvent, MAX_BUFFER);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "DBAgentServerAddr", m_DBAgentServerAddress);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "LogServerAddr", m_LogServerAddress);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "ChatServerAddr", m_ChatServerAddress);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "ExpRate", m_ExpRate);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "DropRate", m_DropRate);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "EquipCorrRate", m_EquipCorrRate);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "Fame", m_Fame);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "Refine", m_Refine);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "Mileage", m_Mileage);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "BattleUserLimit", m_BattleLimit);
|
|
ReadStringFromReg(g_szSetupFileName, szSection, "BattleUserLimitPer", m_BattleLimitPer);
|
|
|
|
// 페이지 셋팅
|
|
m_ServerID = szServerID;
|
|
m_bPingCheck = atoi(szPingCheck);
|
|
m_bHackCheck = atoi(szSpeedHackCheck);
|
|
m_bLotteryEvent = atoi(szLotteryEvent);
|
|
m_bLevelUpEvent = atoi(szLevelUpEvent);
|
|
m_bDeathPenaltyEvent= atoi(szDeathPenaltyEvent);
|
|
|
|
SERVER_ID serverID = {0,};
|
|
serverID.dwID = atoi(szServerID);
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
|
|
m_ServerID.Format("%d", serverID.dwID);
|
|
m_ServerIDHex.Format("0x%08X", serverID.dwID);
|
|
|
|
m_Group.SetCurSel(serverID.GetGroup());
|
|
m_Zone.SetCurSel(serverID.GetZone());
|
|
m_Channel.SetCurSel(serverID.GetChannel());
|
|
|
|
m_strTCPPort.Format("%d", GetZoneTCPPort(serverID.dwID));
|
|
m_strP1UDPListen.Format("%d", CServerSetup::GetP1GameServerUDPPort(serverID.dwID));
|
|
|
|
switch(m_Zone.GetCurSel())
|
|
{
|
|
case SERVER_ID::ZONE1:
|
|
case SERVER_ID::ZONE2:
|
|
case SERVER_ID::ZONE4:
|
|
case SERVER_ID::ZONE5:
|
|
case SERVER_ID::ZONE12:
|
|
case SERVER_ID::BATTLE_SERVER:
|
|
m_Channel.SetCurSel(0);
|
|
m_Channel.EnableWindow(true);
|
|
break;
|
|
|
|
default:
|
|
m_Channel.SetCurSel(0);
|
|
m_Channel.EnableWindow(false);
|
|
break;
|
|
}
|
|
|
|
UpdateData(false);
|
|
}
|
|
|
|
// nSaveType : true - 전 게임서버 공통 정보 저장
|
|
// false - 개별 게임서버 정보 저장
|
|
void CSetupPage3::Save(bool bSaveType)
|
|
{
|
|
if (!m_bEnabled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
UpdateData(true);
|
|
|
|
// 전 게임서버 공통 저장 항목 (섹션: Zone_ETC) --------------------------------------------------------------
|
|
|
|
// 게임 서버 국가
|
|
char szGameServerNation[MAX_PATH] = "";
|
|
_snprintf(szGameServerNation, MAX_PATH, "%d", m_Nation.GetCurSel());
|
|
WriteStringToReg(g_szSetupFileName, "Zone_ETC", "GameServerNation", szGameServerNation);
|
|
// 배틀 로한군의 게임 서버인지 여부
|
|
WriteStringToReg(g_szSetupFileName, "Zone_ETC", "BattleServerGroup", BOOLToString(m_bBattleServer));
|
|
// 저장할 존 정보의 개수
|
|
WriteStringToReg(g_szSetupFileName, "Zone_ETC", "ZoneCount", m_strZoneCount );
|
|
|
|
|
|
// 개별 게임서버 저장 항목 (섹션: Zone_%02d%02d) ------------------------------------------------------------
|
|
if (!bSaveType)
|
|
{
|
|
if ((m_Zone.GetCurSel() == -1)
|
|
|| (m_Channel.GetCurSel() == -1)
|
|
|| (m_ctrlZoneCountCb.GetCurSel() == -1))
|
|
{
|
|
MessageBox("Invalid Selection;");
|
|
return;
|
|
}
|
|
|
|
// 현재 사용중인 SetCount로 저장하려한다면 기존것을 'not use' 로 저장
|
|
const int MAX_BUFFER = 260;
|
|
|
|
char szTemp[MAX_BUFFER], szSetCount[MAX_BUFFER] = "";
|
|
for(int nZone = 1; nZone < m_Zone.GetCount(); ++nZone)
|
|
{
|
|
for(int nCh = 0; nCh < m_Channel.GetCount(); ++nCh)
|
|
{
|
|
_snprintf(szTemp, MAX_PATH, "Zone_%02d%02d", nZone, nCh);
|
|
ReadStringFromReg(g_szSetupFileName, szTemp, "SetCount", szSetCount, MAX_BUFFER);
|
|
if (atoi(szSetCount) == (m_ctrlZoneCountCb.GetCurSel() + 1))
|
|
{
|
|
WriteStringToReg(g_szSetupFileName, szTemp, "SetCount", "not use");
|
|
}
|
|
}
|
|
}
|
|
|
|
char szSection[MAX_PATH] = "";
|
|
_snprintf(szSection, MAX_PATH, "Zone_%02d%02d", m_Zone.GetCurSel(), m_Channel.GetCurSel());
|
|
|
|
WriteStringToReg(g_szSetupFileName, szSection, "ServerID", m_ServerID);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "PingCheck", BOOLToString(m_bPingCheck));
|
|
WriteStringToReg(g_szSetupFileName, szSection, "SpeedHackCheck", BOOLToString(m_bHackCheck));
|
|
WriteStringToReg(g_szSetupFileName, szSection, "LotteryEvent", BOOLToString(m_bLotteryEvent));
|
|
WriteStringToReg(g_szSetupFileName, szSection, "LevelUpEvent", BOOLToString(m_bLevelUpEvent));
|
|
WriteStringToReg(g_szSetupFileName, szSection, "DeathPenaltyEvent", BOOLToString(m_bDeathPenaltyEvent));
|
|
WriteStringToReg(g_szSetupFileName, szSection, "DBAgentServerAddr", m_DBAgentServerAddress);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "LogServerAddr", m_LogServerAddress);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "ChatServerAddr", m_ChatServerAddress);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "ExpRate", m_ExpRate);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "DropRate", m_DropRate);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "EquipCorrRate", m_EquipCorrRate);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "Fame", m_Fame);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "Refine", m_Refine);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "Mileage", m_Mileage);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "BattleUserLimit", m_BattleLimit);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "BattleUserLimitPer", m_BattleLimitPer);
|
|
|
|
// SetCount: 몇번째로 셋팅한 존 정보인지 저장
|
|
_snprintf(szSetCount, MAX_PATH, "%d", m_ctrlZoneCountCb.GetCurSel() + 1);
|
|
WriteStringToReg(g_szSetupFileName, szSection, "SetCount", szSetCount);
|
|
}
|
|
}
|
|
|
|
BOOL CSetupPage3::OnSetActive()
|
|
{
|
|
UpdateData(FALSE);
|
|
m_bEnabled = TRUE;
|
|
return CPropertyPage::OnSetActive();
|
|
}
|
|
|
|
void CSetupPage3::OnCbnSelchangeGroup()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
SERVER_ID serverID = {0,};
|
|
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
serverID.sID.Group = m_Group.GetCurSel();
|
|
serverID.sID.ID = m_Zone.GetCurSel();
|
|
serverID.sID.Channel = m_Channel.GetCurSel();
|
|
|
|
m_ServerID.Format("%d", serverID.dwID);
|
|
m_ServerIDHex.Format("0x%08X", serverID.dwID);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CSetupPage3::OnCbnSelchangeZone()
|
|
{
|
|
SERVER_ID serverID = {0,};
|
|
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
serverID.sID.Group = m_Group.GetCurSel();
|
|
serverID.sID.ID = m_Zone.GetCurSel();
|
|
serverID.sID.Channel = m_Channel.GetCurSel();
|
|
|
|
m_ServerID.Format("%d", serverID.dwID);
|
|
m_ServerIDHex.Format("0x%08X", serverID.dwID);
|
|
|
|
m_strTCPPort.Format("%d", GetZoneTCPPort(serverID.dwID));
|
|
m_strP1UDPListen.Format("%d", CServerSetup::GetP1GameServerUDPPort(serverID.dwID));
|
|
|
|
switch(m_Zone.GetCurSel())
|
|
{
|
|
case SERVER_ID::ZONE1:
|
|
case SERVER_ID::ZONE2:
|
|
case SERVER_ID::ZONE4:
|
|
case SERVER_ID::ZONE5:
|
|
case SERVER_ID::ZONE12:
|
|
case SERVER_ID::BATTLE_SERVER:
|
|
m_Channel.SetCurSel(0);
|
|
m_Channel.EnableWindow(true);
|
|
break;
|
|
|
|
default:
|
|
m_Channel.SetCurSel(0);
|
|
m_Channel.EnableWindow(false);
|
|
break;
|
|
}
|
|
|
|
UpdateData(false);
|
|
}
|
|
|
|
void CSetupPage3::OnCbnSelchangeChannel()
|
|
{
|
|
UpdateData(true);
|
|
|
|
SERVER_ID serverID = {0,};
|
|
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
serverID.sID.Group = m_Group.GetCurSel();
|
|
serverID.sID.ID = m_Zone.GetCurSel();
|
|
serverID.sID.Channel = m_Channel.GetCurSel();
|
|
|
|
m_ServerID.Format ("%d", serverID.dwID);
|
|
m_ServerIDHex.Format("0x%08X", serverID.dwID);
|
|
|
|
m_strTCPPort.Format( "%d", GetZoneTCPPort(serverID.dwID));
|
|
m_strP1UDPListen.Format("%d", CServerSetup::GetP1GameServerUDPPort(serverID.dwID));
|
|
|
|
UpdateData(false);
|
|
}
|
|
|
|
void CSetupPage3::OnBnClickedZoneAdd()
|
|
{
|
|
if (atoi(m_strZoneCount) == 0) // 존 카운트가 1이되는 순간 활성화 될 항목
|
|
{
|
|
m_ctrlZoneCountCb.EnableWindow(true);
|
|
m_ctrlSaveZoneSetting.EnableWindow(true);
|
|
}
|
|
|
|
// 존 카운트 1 증가
|
|
int nCount = atoi(m_strZoneCount);
|
|
nCount++;
|
|
m_strZoneCount.Format("%d", nCount);
|
|
|
|
UpdateData(false);
|
|
|
|
SetZoneCountCombo(m_ctrlZoneCountCb);
|
|
}
|
|
|
|
void CSetupPage3::OnBnClickedZoneDel()
|
|
{
|
|
if (atoi(m_strZoneCount) == 1) // 존 카운트가 0이되는 순간 비활성화 시킬 항목
|
|
{
|
|
m_ctrlZoneCountCb.EnableWindow(false);
|
|
m_ctrlSaveZoneSetting.EnableWindow(false);
|
|
}
|
|
|
|
// 존 카운트 1 감소
|
|
int nCount = atoi(m_strZoneCount);
|
|
|
|
if (nCount > 0) nCount--;
|
|
|
|
m_strZoneCount.Format("%d", nCount);
|
|
|
|
UpdateData(false);
|
|
|
|
SetZoneCountCombo(m_ctrlZoneCountCb);
|
|
}
|
|
|
|
void CSetupPage3::SetZoneCountCombo(CComboBox& ZoneCountCb)
|
|
{
|
|
CString strComboString;
|
|
int nDeleteCount = ZoneCountCb.GetCount();
|
|
int nMaxZoneConut = atoi(m_strZoneCount);
|
|
|
|
ZoneCountCb.ResetContent();
|
|
for(int count = 1; count <= nMaxZoneConut; count++) // 현재 정보로 콤보 다시 셋팅
|
|
{
|
|
strComboString.Format("zone count %d", count);
|
|
ZoneCountCb.InsertString(count - 1 , strComboString);
|
|
}
|
|
}
|
|
|
|
void CSetupPage3::OnCbnSelchangeZoneSelection()
|
|
{
|
|
SetGameServerPage(m_ctrlZoneCountCb.GetCurSel() + 1);
|
|
}
|
|
|
|
void CSetupPage3::OnBnClickedSaveZoneSetting()
|
|
{
|
|
Save(false);
|
|
} |