📄 netconnect.cpp
字号:
(LPARAM)pGuid );
pdnSPInfoEnum++;
}
SAFE_DELETE( pdnSPInfo );
// 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 );
return S_OK;
}
//-----------------------------------------------------------------------------
// 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_PATH );
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( 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( TEXT("ConnectUsingLobbySettings"), hr );
return NCW_S_LOBBYCONNECT;
}
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( TEXT("GetSPCaps"), hr );
// Set the host expire time to around 3 times
// length of the dwDefaultEnumRetryInterval
m_dwEnumHostExpireInterval = dpspCaps.dwDefaultEnumRetryInterval * 3;
// Create a device address
SAFE_RELEASE( m_pDeviceAddress );
hr = CoCreateInstance( CLSID_DirectPlay8Address, NULL,CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Address, (LPVOID*) &m_pDeviceAddress );
if( FAILED(hr) )
return DXTRACE_ERR( TEXT("CoCreateInstance"), hr );
if( FAILED( hr = m_pDeviceAddress->SetSP( pGuid ) ) )
return DXTRACE_ERR( TEXT("SetSP"), hr );
// Create a host address
SAFE_RELEASE( m_pHostAddress );
hr = CoCreateInstance( CLSID_DirectPlay8Address, NULL,CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Address, (LPVOID*) &m_pHostAddress );
if( FAILED(hr) )
return DXTRACE_ERR( TEXT("CoCreateInstance"), hr );
if( FAILED( hr = m_pHostAddress->SetSP( pGuid ) ) )
return DXTRACE_ERR( TEXT("SetSP"), hr );
// 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 )
{
HRESULT hr;
switch( msg )
{
case WM_INITDIALOG:
{
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;
SetDlgItemText( hDlg, IDC_SEARCH_CHECK, TEXT("Start Search") );
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( 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( 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 )
{
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( TEXT("SessionsDlgEnumHosts"), hr );
KillTimer( hDlg, TIMERID_DISPLAY_HOSTS );
MessageBox( hDlg, TEXT("Error enumerating DirectPlay games."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
}
}
else
{
SetDlgItemText( hDlg, IDC_SEARCH_CHECK, TEXT("Start Search") );
// Stop the timer, and stop the async enumeration
KillTimer( hDlg, TIMERID_DISPLAY_HOSTS );
// Until the CancelAsyncOperation returns, it is possible
// to still receive host enumerations
if( m_hEnumAsyncOp )
m_pDP->CancelAsyncOperation( m_hEnumAsyncOp, 0 );
// Reset the search portion of the dialog
SessionsDlgInitListbox( hDlg );
}
break;
case IDC_GAMES_LIST:
if( HIWORD(wParam) != LBN_DBLCLK )
break;
// Fall through
case IDC_JOIN:
if( FAILED( hr = SessionsDlgJoinGame( hDlg ) ) )
{
DXTRACE_ERR( TEXT("SessionsDlgJoinGame"), hr );
MessageBox( hDlg, TEXT("Unable to join game."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
}
break;
case IDC_CREATE:
if( FAILED( hr = SessionsDlgCreateGame( hDlg ) ) )
{
DXTRACE_ERR( TEXT("SessionsDlgCreateGame"), hr );
MessageBox( hDlg, TEXT("Unable to create game."),
TEXT("DirectPlay Sample"),
MB_OK | MB_ICONERROR );
}
break;
case IDCANCEL: // The close button was press
m_hrDialog = NCW_S_QUIT;
EndDialog( hDlg, 0 );
break;
case IDC_BACK: // Cancel button was pressed
m_hrDialog = NCW_S_BACKUP;
EndDialog( hDlg, 0 );
break;
default:
return FALSE; // Message not handled
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -