📄 netconnect.cpp
字号:
// Perform the enumeration
hr = m_pDP->EnumServiceProviders( NULL, NULL, pdnSPInfo,
&dwSize, &dwItems, 0 );
if( FAILED(hr) )
{
DXTRACE_ERR_MSGBOX( TEXT("EnumServiceProviders"), hr );
goto LCleanReturn;
}
// For each detected provider, add an item to the listbox
DPN_SERVICE_PROVIDER_INFO* pdnSPInfoEnum;
pdnSPInfoEnum = pdnSPInfo;
DWORD i;
for ( i = 0; i < dwItems; i++ )
{
DXUtil_ConvertWideStringToGenericCch( strName, pdnSPInfoEnum->pwszName, MAX_PATH );
// Found a service provider, so put it in the listbox
iLBIndex = (int)SendMessage( hWndListBox, LB_ADDSTRING, 0,
(LPARAM)strName );
if( iLBIndex == CB_ERR )
{
// Error, stop enumerating
hr = E_FAIL;
DXTRACE_ERR_MSGBOX( TEXT("ConnectionsDlgFillListBox"), hr );
goto LCleanReturn;
}
// Store pointer to GUID in listbox
GUID* pGuid = new GUID;
if( NULL == pGuid )
{
hr = E_OUTOFMEMORY;
DXTRACE_ERR_MSGBOX( TEXT("ConnectionsDlgFillListBox"), hr );
goto LCleanReturn;
}
memcpy( pGuid, &pdnSPInfoEnum->guid, sizeof(GUID) );
SendMessage( hWndListBox, LB_SETITEMDATA, iLBIndex,
(LPARAM)pGuid );
// Advance to next provider
pdnSPInfoEnum++;
}
// Add "Wait for Lobby Connection" selection in list box
SendMessage( hWndListBox, LB_ADDSTRING, 0,
(LPARAM) TEXT("Wait for Lobby Connection") );
SetFocus( hWndListBox );
// Try to select the default preferred provider
iLBIndex = (int)SendMessage( hWndListBox, LB_FINDSTRINGEXACT, (WPARAM)-1,
(LPARAM)m_strPreferredProvider );
if( iLBIndex != LB_ERR )
SendMessage( hWndListBox, LB_SETCURSEL, iLBIndex, 0 );
else
SendMessage( hWndListBox, LB_SETCURSEL, 0, 0 );
hr = S_OK;
LCleanReturn:
SAFE_DELETE_ARRAY( pdnSPInfo );
return hr;
}
//-----------------------------------------------------------------------------
// Name: ConnectionsDlgOnOK()
// Desc: Stores the player name m_strPlayerName, and in creates a IDirectPlay
// object based on the connection type the user selected.
//-----------------------------------------------------------------------------
HRESULT CNetConnectWizard::ConnectionsDlgOnOK( HWND hDlg )
{
LRESULT iIndex;
HRESULT hr;
GetDlgItemText( hDlg, IDC_PLAYER_NAME_EDIT, m_strLocalPlayerName, MAX_PLAYER_NAME );
if( _tcslen( m_strLocalPlayerName ) == 0 )
{
MessageBox( hDlg, TEXT("You must enter a valid player name."),
TEXT("DirectPlay Sample"), MB_OK );
return S_OK;
}
HWND hWndListBox = GetDlgItem( hDlg, IDC_CONNECTION_LIST );
iIndex = SendMessage( hWndListBox, LB_GETCURSEL, 0, 0 );
SendMessage( hWndListBox, LB_GETTEXT, iIndex, (LPARAM)m_strPreferredProvider );
GUID* pGuid = (GUID*) SendMessage( hWndListBox, LB_GETITEMDATA, iIndex, 0 );
if( NULL == pGuid )
{
// 'Wait for lobby launch' SP has been selected, so wait for a connection
if( FAILED( hr = m_pLobbiedApp->SetAppAvailable( TRUE, 0 ) ) )
return DXTRACE_ERR_MSGBOX( TEXT("SetAppAvailable"), hr );
// Display the multiplayer connect dialog box.
DialogBox( m_hInst, MAKEINTRESOURCE(IDD_LOBBY_WAIT_STATUS),
hDlg, (DLGPROC) StaticLobbyWaitDlgProc );
if( m_bHaveConnectionSettingsFromLobby )
{
if( FAILED( hr = ConnectUsingLobbySettings() ) )
return DXTRACE_ERR_MSGBOX( TEXT("ConnectUsingLobbySettings"), hr );
return NCW_S_LOBBYCONNECT;
}
// 'Wait for lobby launch' was canceled, so don't wait for a connection anymore
if( FAILED( hr = m_pLobbiedApp->SetAppAvailable( FALSE, 0 ) ) )
return DXTRACE_ERR_MSGBOX( TEXT("SetAppAvailable"), hr );
return S_OK;
}
// Query for the enum host timeout for this SP
DPN_SP_CAPS dpspCaps;
ZeroMemory( &dpspCaps, sizeof(DPN_SP_CAPS) );
dpspCaps.dwSize = sizeof(DPN_SP_CAPS);
if( FAILED( hr = m_pDP->GetSPCaps( pGuid, &dpspCaps, 0 ) ) )
return DXTRACE_ERR_MSGBOX( TEXT("GetSPCaps"), hr );
// Set the host expire time to around 3 times
// length of the dwDefaultEnumRetryInterval
m_dwEnumHostExpireInterval = dpspCaps.dwDefaultEnumRetryInterval * 3;
m_guidSP = *pGuid;
// The SP has been chosen, so move forward in the wizard
m_hrDialog = NCW_S_FORWARD;
EndDialog( hDlg, 0 );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ConnectionsDlgCleanup()
// Desc: Deletes the connection buffers from the listbox
//-----------------------------------------------------------------------------
VOID CNetConnectWizard::ConnectionsDlgCleanup( HWND hDlg )
{
GUID* pGuid = NULL;
DWORD iIndex;
DWORD dwCount;
HWND hWndListBox = GetDlgItem( hDlg, IDC_CONNECTION_LIST );
dwCount = (DWORD)SendMessage( hWndListBox, LB_GETCOUNT, 0, 0 );
for( iIndex = 0; iIndex < dwCount; iIndex++ )
{
pGuid = (GUID*) SendMessage( hWndListBox, LB_GETITEMDATA,
iIndex, 0 );
SAFE_DELETE( pGuid );
}
}
//-----------------------------------------------------------------------------
// Name: StaticSessionsDlgProc()
// Desc: Static msg handler which passes messages
//-----------------------------------------------------------------------------
INT_PTR CALLBACK CNetConnectWizard::StaticSessionsDlgProc( HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
if( g_pNCW )
return g_pNCW->SessionsDlgProc( hDlg, uMsg, wParam, lParam );
return FALSE; // Message not handled
}
//-----------------------------------------------------------------------------
// Name: SessionsDlgProc()
// Desc: Handles messages fro the multiplayer games dialog
//-----------------------------------------------------------------------------
INT_PTR CALLBACK CNetConnectWizard::SessionsDlgProc( HWND hDlg, UINT msg,
WPARAM wParam, LPARAM lParam )
{
UNREFERENCED_PARAMETER( lParam );
HRESULT hr;
switch( msg )
{
case WM_INITDIALOG:
{
#if defined(WIN32_PLATFORM_PSPC) && (_WIN32_WCE >= 300)
SHINITDLGINFO shidi;
memset(&shidi, 0, sizeof(SHINITDLGINFO));
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
SetForegroundWindow(hDlg);
SHInitDialog(&shidi);
#endif // WIN32_PLATFORM_PSPC
m_hDlg = hDlg;
// Load and set the icon
HICON hIcon = LoadIcon( m_hInst, MAKEINTRESOURCE( IDI_MAIN ) );
SendMessage( hDlg, WM_SETICON, ICON_BIG, (LPARAM) hIcon ); // Set big icon
SendMessage( hDlg, WM_SETICON, ICON_SMALL, (LPARAM) hIcon ); // Set small icon
// Set the window title
TCHAR strWindowTitle[256];
wsprintf( strWindowTitle, TEXT("%s - Multiplayer Games"), m_strAppName );
SetWindowText( hDlg, strWindowTitle );
// Init the search portion of the dialog
m_bSearchingForSessions = FALSE;
// Check to see if a former search is still waiting to end
if(m_hEnumAsyncOp != NULL)
{
EnableWindow( GetDlgItem(hDlg, IDC_SEARCH_CHECK), FALSE );
SetDlgItemText( hDlg, IDC_SEARCH_CHECK, TEXT("Stopping...") );
}
SessionsDlgInitListbox( hDlg );
}
break;
case WM_TIMER:
// Upon this timer message, then refresh the list of hosts
// by expiring old hosts, and displaying the list in the
// dialog box
if( wParam == TIMERID_DISPLAY_HOSTS )
{
// Don't refresh if we are not enumerating hosts
if( !m_bSearchingForSessions )
break;
// Expire all of the hosts that haven't
// refreshed in a certain period of time
SessionsDlgExpireOldHostEnums();
// Display the list of hosts in the dialog
if( FAILED( hr = SessionsDlgDisplayEnumList( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("SessionsDlgDisplayEnumList"), hr );
KillTimer( hDlg, TIMERID_DISPLAY_HOSTS );
MessageBox( hDlg, TEXT("Error enumerating DirectPlay games."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
}
}
else if( wParam == TIMERID_CONNECT_COMPLETE )
{
// Check to see if the MessageHandler has set an event to tell us the
// DPN_MSGID_CONNECT_COMPLETE has been processed. Now m_hrConnectComplete
// is valid.
if( WAIT_OBJECT_0 == WaitForSingleObject( m_hConnectCompleteEvent, 0 ) )
{
m_bConnecting = FALSE;
// Re-enable create button
EnableWindow( GetDlgItem( hDlg, IDC_CREATE ), TRUE );
if( FAILED( m_hrConnectComplete ) )
{
DXTRACE_ERR_MSGBOX( TEXT("DPN_MSGID_CONNECT_COMPLETE"), m_hrConnectComplete );
MessageBox( m_hDlg, TEXT("Unable to join game."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
}
else
{
// DirectPlay connect successful, so end dialog
m_hrDialog = NCW_S_FORWARD;
EndDialog( m_hDlg, 0 );
}
KillTimer( hDlg, TIMERID_CONNECT_COMPLETE );
}
}
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDC_SEARCH_CHECK:
m_bSearchingForSessions = !m_bSearchingForSessions;
if( m_bSearchingForSessions )
{
// Ask the user for the remote address
if( SPRequiresPort( &m_guidSP ) )
{
int nResult = (int)DialogBox( m_hInst, MAKEINTRESOURCE(IDD_MULTIPLAYER_ADDRESS),
hDlg, (DLGPROC) StaticAddressDlgProc );
// If the user cancelled the remote address dialog box,
// don't start the search
if( nResult == IDCANCEL )
{
m_bSearchingForSessions = FALSE;
break;
}
}
SetDlgItemText( hDlg, IDC_SEARCH_CHECK, TEXT("Searching...") );
// Start the timer to display the host list every so often
SetTimer( hDlg, TIMERID_DISPLAY_HOSTS, DISPLAY_REFRESH_RATE, NULL );
// Start the async enumeration
if( FAILED( hr = SessionsDlgEnumHosts( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("SessionsDlgEnumHosts"), hr );
KillTimer( hDlg, TIMERID_DISPLAY_HOSTS );
MessageBox( hDlg, TEXT("Error enumerating DirectPlay games."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
}
}
else
{
SessionsDlgStopEnumHosts( hDlg );
}
break;
case IDC_GAMES_LIST:
if( HIWORD(wParam) != LBN_DBLCLK )
break;
// Fall through
case IDC_JOIN:
if( FAILED( hr = SessionsDlgJoinGame( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("SessionsDlgJoinGame"), hr );
MessageBox( hDlg, TEXT("Unable to join game."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -