📄 logindlg.cpp
字号:
// LoginDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MirRobot.h"
#include "LoginDlg.h"
#include "windowsx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg dialog
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoginDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_dwOfsList=(DWORD*)&m_grpBuffer[12];
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
ON_CBN_SELCHANGE(IDC_AREA, OnSelchangeArea)
ON_CBN_SELCHANGE(IDC_SERVER, OnSelchangeServer)
ON_BN_CLICKED(IDC_OK, OnOk)
ON_BN_CLICKED(IDC_CANCEL, OnCancel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg message handlers
BOOL CLoginDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetGroupFile("group.dat");
SetAreaList(::GetDlgItem(this->m_hWnd,IDC_AREA));
SetServerCaptionList(::GetDlgItem(this->m_hWnd,IDC_SERVER),0);
ComboBox_AddString(::GetDlgItem(this->m_hWnd,IDC_CHARACTER),"左边人物");
ComboBox_AddString(::GetDlgItem(this->m_hWnd,IDC_CHARACTER),"右边人物");
ComboBox_SetCurSel(::GetDlgItem(this->m_hWnd,IDC_CHARACTER),0);
#ifdef MIR_SF_CLIENT
GetDlgItem(IDC_AREA)->EnableWindow(FALSE);
GetDlgItem(IDC_SERVER)->EnableWindow(FALSE);
#endif
/*ComboBox_SetCurSel(::GetDlgItem(this->m_hWnd,IDC_AREA),
GetPrivateProFileInt("Login","LastArea",0,".\MirRobot.ini"));
ComboBox_SetCurSel(::GetDlgItem(this->m_hWnd,IDC_SERVER),
GetPrivateProFileInt("Login","LastServer",0,".\MirRobot.ini"));
ComboBox_SetCurSel(::GetDlgItem(this->m_hWnd,IDC_CHARACTER),
GetPrivateProFileInt("Login","LastCharacter",0,".\MirRobot.ini"));*/
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
int CLoginDlg::SetGroupFile(char *file)
{
int filelen=0;
int i=0;
FILE*fp=fopen( file, "rb" );
if(fp==NULL)
return 0;
fseek(fp,0,SEEK_END);
filelen=ftell(fp);
fseek(fp,0,SEEK_SET );
fread((void*)m_grpBuffer,filelen,1,fp);
fclose(fp);
m_AreaCount=(int)m_grpBuffer[8]&0xff;
UnGroupStream((char*)&m_grpBuffer[m_dwOfsList[0]],filelen-m_dwOfsList[0] );
if(!ProcAreaInfo())
return 0;
return 1;
}
int CLoginDlg::UnGroupStream(char*stream, int size)
{
int i=0;
if(stream==NULL )
return 0;
if(size==0 )
return 0;
for(i=0;i<size;i++)
{
if(stream[i] & 1)
{
stream[i]--;
}
else
{
stream[i]++;
}
}
stream[size]='\0';
return 1;
}
int CLoginDlg::ProcAreaInfo()
{
char tmps[200];
char name[3048];
char*ptrStream;
int pptr=0;
int i=0;
int iptr=0;
ptrStream=GetStreamPtr(0);
if( ptrStream == NULL )
return 0;
GetSetting(ptrStream,"main","name",name);
// MessageBox(0,name, 0, 0 );
int ilen = strlen( name );
for( i = 0;i <= ilen;i ++ )
{
if( name[i] == ';' || name[i] == '\0' )
{
memcpy( (void*)tmps, (void*)&name[iptr], i - iptr );
tmps[i-iptr] = '\0';
strcpy( m_AreaInfo[pptr].AreaName, tmps );
pptr ++;
iptr = i + 1;
}
}
for( i = 0;i < m_AreaCount;i ++ )
{
ptrStream = GetStreamPtr( i * 2 + 1 );
GetStream( i * 2 + 1, name );
if( ptrStream == NULL )
return 0;
if( !GetSetting( name, "server","servercount", tmps ))
{
if( !GetSetting( name, "group", "groupnum", tmps ))
{
return 0;
}
}
pptr = atoi( tmps );
m_AreaInfo[i].dwServerCount = pptr;
if( pptr <= 0 || pptr >= 9 )
return 0;
//if( i > 50 && i < 60 )MessageBox( 0, name, 0, 0 );
for( iptr = 0;iptr < pptr;iptr ++ )
{
sprintf( tmps, "Server%dCaption", iptr + 1);
if( !GetSetting( name, "server", tmps, m_AreaInfo[i].ServerCaption[iptr] ))
{
sprintf( tmps, "Group%d", iptr );
if( !GetSetting( name, "group", tmps, m_AreaInfo[i].ServerCaption[iptr] ))
{
return 0;
}
}
sprintf( tmps, "Server%dName", iptr + 1 );
if( !GetSetting( name, "server", tmps, m_AreaInfo[i].ServerName[iptr] ) )
{
sprintf( tmps, "GroupNick%d", iptr );
if( !GetSetting( name, "group", tmps, m_AreaInfo[i].ServerName[iptr] ))
{
return 0;
}
}
// MessageBox( 0, m_AreaInfo[i].ServerName[iptr], 0, 0 );
}
ptrStream = GetStreamPtr( i * 2 + 2 );
if( ptrStream == NULL )
return 0;
GetSetting( ptrStream, "setup", "ServerAddr", m_AreaInfo[i].IpAddress );
}
return 1;
}
char* CLoginDlg::GetStreamPtr(int id)
{
if(id<0 || id>=m_AreaCount*2+2)
return NULL;
return (&m_grpBuffer[m_dwOfsList[id*2]]);
}
int CLoginDlg::GetSetting(char *stream, char *segment, char *name, char *setting)
{
char mtmp[3024];
int ilen = 0;
if( stream == 0 )
return 0;
if( segment == 0 )
return 0;
if( name == 0 )
return 0;
if( setting == 0 )
return 0;
setting[0] = '\0';
ilen = strlen( stream );
int iptr = -1;
int lstart = 0;
int sstart = 0;
#define FLAG_SEARCHSEG 0
#define FLAG_SEARCHNAME 0xff
#define FLAG_GETSETTING 0xff00
int iflag = FLAG_SEARCHSEG;
int i = 0;
for( i = 0;i < ilen;i ++ )
{
if( stream[i] == 0x0a || stream[i] == 0x0d )
{
if( iflag == FLAG_GETSETTING )
{
memcpy( (void*)mtmp, (void*)&stream[sstart], i - sstart );
mtmp[i - sstart] = '\0';
strcpy( setting, mtmp );
//printf( "Found %s\n", mtmp );
return 1;
}
lstart = i + 1;
}
if( iflag == FLAG_SEARCHNAME )
{
if( stream[i] == '=' )
{
memcpy( (void*)mtmp, (void*)&stream[lstart],i - lstart );
mtmp[i - lstart] = '\0';
if( stricmp( mtmp, name ) == 0 )
{
iflag = FLAG_GETSETTING;
sstart = i + 1;
}
printf( "%s\n", mtmp );
}
}
if( stream[i] == '[' )
{
if( iflag == FLAG_SEARCHNAME )
{
return 0;
}
iptr = i + 1;
}
if( stream[i] == ']' )
{
memcpy( (void*)mtmp, (void*)&stream[iptr], i - iptr);
mtmp[i-iptr] = '\0';
printf( "%s\n", mtmp );
if( stricmp( mtmp, segment ) == 0 )
iflag = FLAG_SEARCHNAME;
}
}
return 0;
}
int CLoginDlg::GetStream(int id, char *stream)
{
if( id < 0 || id >= m_AreaCount * 2 + 2 )
return NULL;
memcpy( (void*)stream, (void*)&m_grpBuffer[m_dwOfsList[id * 2]], m_dwOfsList[id * 2 + 1] );
stream[m_dwOfsList[id * 2 + 1]] = 0x0a;
stream[m_dwOfsList[id * 2 + 1]+1] = 0;
return 1;
}
int CLoginDlg::SetAreaList(HWND hWnd)
{
int i=0;
for(i=0;i<m_AreaCount;i++)
{
ComboBox_AddString(hWnd,m_AreaInfo[i].AreaName);
}
ComboBox_SetCurSel(hWnd,0);
return 1;
}
int CLoginDlg::SetServerCaptionList(HWND hWnd, int AreaID)
{
int i = 0;
int icnt = 0;
icnt = ComboBox_GetCount( hWnd );
ComboBox_ResetContent( hWnd );
for( i = 0;i < icnt;i ++ )
{
ComboBox_DeleteString( hWnd, i );
}
if( AreaID >= 0 && AreaID < m_AreaCount )
{
for( i = 0;i < (int)m_AreaInfo[AreaID].dwServerCount;i ++ )
{
ComboBox_AddString( hWnd, m_AreaInfo[AreaID].ServerCaption[i] );
}
ComboBox_SetCurSel( hWnd, 0 );
return 1;
}
return 0;
}
void CLoginDlg::OnOk()
{
// TODO: Add your control notification handler code here
m_AreaId=ComboBox_GetCurSel(::GetDlgItem(this->m_hWnd,IDC_AREA));
m_ServerId=ComboBox_GetCurSel(::GetDlgItem(this->m_hWnd,IDC_SERVER));
char strBuf[128];
GetServerName(m_AreaId,m_ServerId,strBuf);
m_retVal.m_ServerName=strBuf;
GetIpAddress(m_AreaId,strBuf);
m_retVal.m_ServerIP=strBuf;
m_retVal.m_Character=ComboBox_GetCurSel(::GetDlgItem(this->m_hWnd,IDC_CHARACTER));
GetDlgItem(IDC_ACCOUNT)->GetWindowText(m_retVal.m_Account);
GetDlgItem(IDC_PASSWORD)->GetWindowText(m_retVal.m_Password);
if(m_retVal.m_Account.GetLength()>4 && m_retVal.m_Password.GetLength()>4)
this->EndDialog(IDOK);
else
MessageBox("请您正确输入账号/密码!");
}
void CLoginDlg::OnCancel()
{
this->EndDialog(!IDOK);
}
void CLoginDlg::OnSelchangeServer()
{
// TODO: Add your control notification handler code here
m_ServerId = ComboBox_GetCurSel(::GetDlgItem(this->m_hWnd,IDC_SERVER));
}
void CLoginDlg::OnSelchangeArea()
{
// TODO: Add your control notification handler code here
m_AreaId=ComboBox_GetCurSel(::GetDlgItem(this->m_hWnd,IDC_AREA));
SetServerCaptionList(::GetDlgItem(this->m_hWnd,IDC_SERVER),m_AreaId);
m_ServerId=ComboBox_GetCurSel(::GetDlgItem(this->m_hWnd,IDC_SERVER));
}
int CLoginDlg::GetServerName(int AreaID, int ServerIndex, char *ServerName)
{
if( AreaID >= 0 && AreaID < m_AreaCount )
{
if( ServerIndex >= 0 && ServerIndex < (int)m_AreaInfo[AreaID].dwServerCount )
{
strcpy( ServerName, m_AreaInfo[AreaID].ServerName[ServerIndex] );
return 1;
}
return 0;
}
return 0;
}
int CLoginDlg::GetIpAddress(int AreaID, char *IpAddr)
{
if( AreaID >= 0 && AreaID < m_AreaCount )
{
strcpy( IpAddr, m_AreaInfo[AreaID].IpAddress );
return 1;
}
return 0;
}
void CLoginDlg::OnOK()
{
this->OnOk();
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -