791 lines
17 KiB
C++
791 lines
17 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 2000-2001 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// SelNodePage.cpp
|
|
//
|
|
// Maintained By:
|
|
// David Potter (DavidP) 31-JAN-2001
|
|
// Geoffrey Pease (GPease) 12-MAY-2000
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Pch.h"
|
|
#include "SelNodePage.h"
|
|
#include "WizardUtils.h"
|
|
|
|
DEFINE_THISCLASS("CSelNodePage");
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::CSelNodePage
|
|
//
|
|
// Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// pspIn -- IServiceProvider
|
|
// ecamCreateAddModeIn -- Creating cluster or adding nodes to cluster.
|
|
// pcCountInout -- Count of computers in prgbstrComputersInout
|
|
// prgbstrComputersInout -- Array of computers
|
|
// pbstrClusterNameIn -- Name of the cluster
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CSelNodePage::CSelNodePage(
|
|
IServiceProvider * pspIn,
|
|
ECreateAddMode ecamCreateAddModeIn,
|
|
ULONG * pcCountInout,
|
|
BSTR ** prgbstrComputersInout,
|
|
BSTR * pbstrClusterNameIn
|
|
)
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
Assert( pspIn != NULL );
|
|
Assert( pcCountInout != NULL );
|
|
Assert( prgbstrComputersInout != NULL );
|
|
Assert( pbstrClusterNameIn != NULL );
|
|
|
|
// m_hwnd
|
|
THR( pspIn->TypeSafeQI( IServiceProvider, &m_psp ) );
|
|
m_pcCount = pcCountInout;
|
|
m_prgbstrComputerName = prgbstrComputersInout;
|
|
m_pbstrClusterName = pbstrClusterNameIn;
|
|
m_cfDsObjectPicker = 0;
|
|
|
|
TraceFuncExit();
|
|
|
|
} //*** CSelNodePage::CSelNodePage()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::~CSelNodePage
|
|
//
|
|
// Description:
|
|
// Destructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// None.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CSelNodePage::~CSelNodePage( void )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
if ( m_psp != NULL )
|
|
{
|
|
m_psp->Release();
|
|
}
|
|
|
|
TraceFuncExit();
|
|
|
|
} //*** CSelNodePage::~CSelNodePage()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::OnInitDialog
|
|
//
|
|
// Description:
|
|
// Handle the WM_INITDIALOG window message.
|
|
//
|
|
// Arguments:
|
|
// hDlgIn
|
|
//
|
|
// Return Values:
|
|
// FALSE - Didn't set the focus.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CSelNodePage::OnInitDialog(
|
|
HWND hDlgIn
|
|
)
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
BSTR bstrComputerName = NULL;
|
|
|
|
LRESULT lr = FALSE; // Didn't set the focus.
|
|
|
|
HRESULT hr;
|
|
|
|
if ( ( *m_prgbstrComputerName != NULL )
|
|
&& ( *m_pcCount == 1 )
|
|
&& ( (*m_prgbstrComputerName)[ 0 ] != NULL )
|
|
)
|
|
{
|
|
SetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, (*m_prgbstrComputerName)[ 0 ] );
|
|
}
|
|
else
|
|
{
|
|
DWORD dwStatus;
|
|
DWORD dwClusterState;
|
|
|
|
//
|
|
// If the node is already in a cluster, don't have it default in the edit box.
|
|
// If there is an error getting the "NodeClusterState", then default the node
|
|
// name (it could be in the middle of cleaning up the node).
|
|
//
|
|
|
|
dwStatus = TW32( GetNodeClusterState( NULL, &dwClusterState ) );
|
|
if ( ( dwStatus != ERROR_SUCCESS )
|
|
|| ( dwClusterState == ClusterStateNotConfigured ) )
|
|
{
|
|
hr = THR( HrGetComputerName( ComputerNameDnsHostname, &bstrComputerName ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
SetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, bstrComputerName );
|
|
} // else: no computer was specified
|
|
|
|
m_cfDsObjectPicker = RegisterClipboardFormat( CFSTR_DSOP_DS_SELECTION_LIST );
|
|
if ( m_cfDsObjectPicker == 0 )
|
|
{
|
|
DWORD sc;
|
|
|
|
//
|
|
// TODO: 5-JUL-2000 GalenB
|
|
//
|
|
// Need to log this?
|
|
//
|
|
sc = TW32( GetLastError() );
|
|
|
|
EnableWindow( GetDlgItem( hDlgIn, IDC_SELNODE_PB_BROWSE ), FALSE );
|
|
} // if:
|
|
|
|
Cleanup:
|
|
TraceSysFreeString( bstrComputerName );
|
|
|
|
RETURN( lr );
|
|
|
|
} //*** CSelNodePage::OnInitDialog()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::OnCommand
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// idNotificationIn
|
|
// idControlIn
|
|
// hwndSenderIn
|
|
//
|
|
// Return Values:
|
|
// TRUE
|
|
// FALSE
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CSelNodePage::OnCommand(
|
|
UINT idNotificationIn,
|
|
UINT idControlIn,
|
|
HWND hwndSenderIn
|
|
)
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
LRESULT lr = FALSE;
|
|
|
|
switch ( idControlIn )
|
|
{
|
|
case IDC_SELNODE_E_COMPUTERNAME:
|
|
if ( idNotificationIn == EN_CHANGE )
|
|
{
|
|
THR( HrUpdateWizardButtons() );
|
|
lr = TRUE;
|
|
}
|
|
break;
|
|
|
|
case IDC_SELNODE_PB_BROWSE:
|
|
if ( idNotificationIn == BN_CLICKED )
|
|
{
|
|
//
|
|
// TODO: 26-JUN-2000 GalenB
|
|
//
|
|
// Need to set lr properly.
|
|
//
|
|
THR( HrBrowse() );
|
|
lr = TRUE;
|
|
}
|
|
break;
|
|
} // switch: idControlIn
|
|
|
|
RETURN( lr );
|
|
|
|
} //*** CSelNodePage::OnCommand()
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::HrUpdateWizardButtons
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// S_OK
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
CSelNodePage::HrUpdateWizardButtons( void )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
DWORD dwFlags = PSWIZB_BACK | PSWIZB_NEXT;
|
|
DWORD dwLen;
|
|
|
|
dwLen = GetWindowTextLength( GetDlgItem( m_hwnd, IDC_SELNODE_E_COMPUTERNAME ) );
|
|
if ( dwLen == 0 )
|
|
{
|
|
dwFlags &= ~PSWIZB_NEXT;
|
|
}
|
|
|
|
PropSheet_SetWizButtons( GetParent( m_hwnd ), dwFlags );
|
|
|
|
HRETURN( hr );
|
|
|
|
} //*** CSelNodePage::HrUpdateWizardButtons()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::OnNotifySetActive
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// TRUE
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CSelNodePage::OnNotifySetActive( void )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
LRESULT lr = TRUE;
|
|
|
|
THR( HrUpdateWizardButtons() );
|
|
|
|
//
|
|
// TODO: gpease 23-MAY-2000
|
|
// Figure out: If the user clicks back and changes the computer
|
|
// name, how do we update the middle tier?
|
|
//
|
|
|
|
RETURN( lr );
|
|
|
|
} //*** CSelNodePage::OnNotifySetActive()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::OnNotifyQueryCancel
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// TRUE
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CSelNodePage::OnNotifyQueryCancel( void )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
LRESULT lr = TRUE;
|
|
|
|
int iRet;
|
|
|
|
iRet = MessageBoxFromStrings( m_hwnd,
|
|
IDS_QUERY_CANCEL_TITLE,
|
|
IDS_QUERY_CANCEL_TEXT,
|
|
MB_YESNO
|
|
);
|
|
|
|
if ( iRet == IDNO )
|
|
{
|
|
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
|
|
}
|
|
|
|
RETURN( lr );
|
|
|
|
} //*** CSelNodePage::OnNotifyQueryCancel()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::OnNotifyWizNext
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// TRUE
|
|
// Other LRESULT values.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CSelNodePage::OnNotifyWizNext( void )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
HRESULT hr;
|
|
LPWSTR pszDomain;
|
|
DWORD dwLen;
|
|
DNS_STATUS dnsStatus;
|
|
BSTR bstrComputerName;
|
|
int idcFocus = 0;
|
|
|
|
OBJECTCOOKIE cookieDummy;
|
|
OBJECTCOOKIE cookieCluster;
|
|
|
|
WCHAR szComputerName[ DNS_MAX_NAME_BUFFER_LENGTH ] = { 0 };
|
|
|
|
LRESULT lr = TRUE;
|
|
|
|
dwLen = GetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, szComputerName, ARRAYSIZE( szComputerName ) );
|
|
AssertMsg( dwLen != 0, "How did I get here?" );
|
|
|
|
hr = THR( HrValidateDnsHostname( m_hwnd, szComputerName, mvdhoALLOW_ONLY_HOSTNAME_LABEL ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
idcFocus = IDC_SELNODE_E_COMPUTERNAME;
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Build the FQDN DNS hostname to the computer.
|
|
//
|
|
|
|
pszDomain = wcschr( *m_pbstrClusterName, L'.' );
|
|
Assert( pszDomain != NULL );
|
|
if ( pszDomain == NULL )
|
|
{
|
|
// BUGBUG 31-JAN-2001 DavidP What can the user do here? We need a better way to handle this.
|
|
goto Cleanup;
|
|
}
|
|
|
|
wcsncpy( &szComputerName[ dwLen ], pszDomain, ARRAYSIZE( szComputerName ) - dwLen - 1 /* NULL */ );
|
|
|
|
bstrComputerName = TraceSysAllocString( szComputerName );
|
|
if ( bstrComputerName == NULL )
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
|
|
//
|
|
// Free old list (if any)
|
|
//
|
|
|
|
while ( *m_pcCount != 0 )
|
|
{
|
|
(*m_pcCount) --;
|
|
TraceSysFreeString( (*m_prgbstrComputerName)[ *m_pcCount ] );
|
|
}
|
|
|
|
//
|
|
// Make a new list (if needed).
|
|
//
|
|
|
|
if ( *m_prgbstrComputerName == NULL )
|
|
{
|
|
*m_prgbstrComputerName = (BSTR *) TraceAlloc( 0, sizeof(BSTR) );
|
|
if ( *m_prgbstrComputerName == NULL )
|
|
{
|
|
goto OutOfMemory;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Take ownership of bstrComputerName.
|
|
//
|
|
|
|
*m_pcCount = 1;
|
|
(*m_prgbstrComputerName)[ 0 ] = bstrComputerName;
|
|
|
|
Cleanup:
|
|
RETURN( lr );
|
|
|
|
Error:
|
|
if ( idcFocus != 0 )
|
|
{
|
|
SetFocus( GetDlgItem( m_hwnd, idcFocus ) );
|
|
}
|
|
// Don't go to the next page.
|
|
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
|
|
goto Cleanup;
|
|
|
|
OutOfMemory:
|
|
goto Error;
|
|
|
|
} //*** CSelNodePage::OnNotifyWizNext()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::OnNotify
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// idCtrlIn
|
|
// pnmhdrIn
|
|
//
|
|
// Return Values:
|
|
// TRUE
|
|
// Other LRESULT values
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CSelNodePage::OnNotify(
|
|
WPARAM idCtrlIn,
|
|
LPNMHDR pnmhdrIn
|
|
)
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
LRESULT lr = TRUE;
|
|
|
|
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, 0 );
|
|
|
|
switch( pnmhdrIn->code )
|
|
{
|
|
case PSN_SETACTIVE:
|
|
lr = OnNotifySetActive();
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
lr = OnNotifyWizNext();
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
lr = OnNotifyQueryCancel();
|
|
break;
|
|
} // switch: notify code
|
|
|
|
RETURN( lr );
|
|
|
|
} //*** CSelNodePage::OnNotify()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::HrBrowse
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Values:
|
|
// S_OK
|
|
// Other HRESULT values.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
CSelNodePage::HrBrowse( void )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
HRESULT hr = S_OK;
|
|
IDsObjectPicker * piop = NULL;
|
|
IDataObject * pido = NULL;
|
|
HCURSOR hOldCursor = NULL;
|
|
|
|
hOldCursor = SetCursor( LoadCursor( g_hInstance, IDC_WAIT ) );
|
|
|
|
// Create an instance of the object picker.
|
|
hr = THR( CoCreateInstance( CLSID_DsObjectPicker, NULL, CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, (void **) &piop ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
goto CleanUp;
|
|
} // if:
|
|
|
|
// Initialize the object picker instance.
|
|
hr = THR( HrInitObjectPicker( piop ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
goto CleanUp;
|
|
} // if:
|
|
|
|
SetCursor( hOldCursor );
|
|
|
|
// Invoke the modal dialog.
|
|
hr = THR( piop->InvokeDialog( m_hwnd, &pido ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
goto CleanUp;
|
|
} // if:
|
|
|
|
if ( hr == S_OK )
|
|
{
|
|
hr = THR( HrGetSelection( pido ) );
|
|
} // if:
|
|
else if ( hr == S_FALSE )
|
|
{
|
|
hr = S_OK; // don't want to squawk in the caller...
|
|
} // else if:
|
|
|
|
CleanUp:
|
|
|
|
if ( pido != NULL )
|
|
{
|
|
pido->Release();
|
|
} // if:
|
|
|
|
if ( piop != NULL )
|
|
{
|
|
piop->Release();
|
|
} // if:
|
|
|
|
HRETURN( hr );
|
|
|
|
} //*** CSelNodePage::HrBrowse()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::HrInitObjectPicker
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// piopIn -- IDsObjectPicker
|
|
//
|
|
// Return Values:
|
|
// HRESULT values.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
CSelNodePage::HrInitObjectPicker( IDsObjectPicker * piopIn )
|
|
{
|
|
TraceFunc( "" );
|
|
|
|
DSOP_SCOPE_INIT_INFO rgScopeInit[ 1 ];
|
|
DSOP_INIT_INFO iiInfo;
|
|
|
|
ZeroMemory( rgScopeInit, sizeof( DSOP_SCOPE_INIT_INFO ) * (sizeof( rgScopeInit ) / sizeof( rgScopeInit[ 0 ] ) ) );
|
|
|
|
rgScopeInit[ 0 ].cbSize = sizeof( DSOP_SCOPE_INIT_INFO );
|
|
rgScopeInit[ 0 ].flType = DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN | DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN;
|
|
rgScopeInit[ 0 ].flScope = DSOP_SCOPE_FLAG_STARTING_SCOPE;
|
|
|
|
rgScopeInit[ 0 ].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS;
|
|
rgScopeInit[ 0 ].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS;
|
|
|
|
ZeroMemory( &iiInfo, sizeof( iiInfo ) );
|
|
|
|
iiInfo.cbSize = sizeof( iiInfo );
|
|
iiInfo.pwzTargetComputer = NULL;
|
|
iiInfo.cDsScopeInfos = 1;
|
|
iiInfo.aDsScopeInfos = rgScopeInit;
|
|
iiInfo.flOptions = 0; //DSOP_FLAG_MULTISELECT;
|
|
|
|
HRETURN( piopIn->Initialize( &iiInfo) );
|
|
|
|
} //*** CSelNodePage::HrInitObjectPicker
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CSelNodePage::HrGetSelection
|
|
//
|
|
// Description:
|
|
//
|
|
// Arguments:
|
|
// pidoIn -- IDataObject
|
|
//
|
|
// Return Values:
|
|
// HRESULT values.
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
HRESULT
|
|
CSelNodePage::HrGetSelection(
|
|
IDataObject * pidoIn
|
|
)
|
|
{
|
|
TraceFunc( "" );
|
|
Assert( pidoIn != NULL );
|
|
|
|
HRESULT hr;
|
|
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL, NULL };
|
|
FORMATETC formatetc = { (CLIPFORMAT) m_cfDsObjectPicker, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
|
|
PDS_SELECTION_LIST pds = NULL;
|
|
DWORD sc;
|
|
|
|
hr = THR( pidoIn->GetData( &formatetc, &stgmedium ) );
|
|
if ( FAILED( hr ) )
|
|
{
|
|
goto CleanUp;
|
|
} // if:
|
|
|
|
pds = (PDS_SELECTION_LIST) GlobalLock( stgmedium.hGlobal );
|
|
if ( pds == NULL )
|
|
{
|
|
sc = TW32( GetLastError() );
|
|
hr = HRESULT_FROM_WIN32( sc );
|
|
goto CleanUp;
|
|
} // if:
|
|
|
|
if ( pds->cItems == 1 )
|
|
{
|
|
SetDlgItemText( m_hwnd, IDC_SELNODE_E_COMPUTERNAME, pds->aDsSelection[ 0 ].pwzName );
|
|
} // if:
|
|
|
|
CleanUp:
|
|
|
|
if ( pds != NULL )
|
|
{
|
|
GlobalUnlock( stgmedium.hGlobal );
|
|
} // if:
|
|
|
|
if ( stgmedium.hGlobal != NULL )
|
|
{
|
|
ReleaseStgMedium( &stgmedium );
|
|
} // if:
|
|
|
|
HRETURN( hr );
|
|
|
|
} //*** CSelNodePage::HrGetSelection()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// static
|
|
// CALLBACK
|
|
// CSelNodePage::S_DlgProc
|
|
//
|
|
// Description:
|
|
// Dialog proc for this page.
|
|
//
|
|
// Arguments:
|
|
// hDlgIn
|
|
// MsgIn
|
|
// wParam
|
|
// lParam
|
|
//
|
|
// Return Values:
|
|
// FALSE
|
|
// Other LRESULT values
|
|
//
|
|
// Remarks:
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
INT_PTR
|
|
CALLBACK
|
|
CSelNodePage::S_DlgProc(
|
|
HWND hDlgIn,
|
|
UINT MsgIn,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
// Don't do TraceFunc because every mouse movement
|
|
// will cause this function to be called.
|
|
|
|
WndMsg( hDlgIn, MsgIn, wParam, lParam );
|
|
|
|
LRESULT lr = FALSE;
|
|
|
|
CSelNodePage * pPage = reinterpret_cast< CSelNodePage *> ( GetWindowLongPtr( hDlgIn, GWLP_USERDATA ) );
|
|
|
|
if ( MsgIn == WM_INITDIALOG )
|
|
{
|
|
Assert( lParam != NULL );
|
|
|
|
PROPSHEETPAGE * ppage = reinterpret_cast< PROPSHEETPAGE * >( lParam );
|
|
SetWindowLongPtr( hDlgIn, GWLP_USERDATA, (LPARAM) ppage->lParam );
|
|
pPage = reinterpret_cast< CSelNodePage * >( ppage->lParam );
|
|
pPage->m_hwnd = hDlgIn;
|
|
}
|
|
|
|
if ( pPage != NULL )
|
|
{
|
|
Assert( hDlgIn == pPage->m_hwnd );
|
|
|
|
switch( MsgIn )
|
|
{
|
|
case WM_INITDIALOG:
|
|
lr = pPage->OnInitDialog( hDlgIn );
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
lr = pPage->OnNotify( wParam, reinterpret_cast< LPNMHDR >( lParam ) );
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
lr= pPage->OnCommand( HIWORD( wParam ), LOWORD( wParam ), (HWND) lParam );
|
|
break;
|
|
|
|
// no default clause needed
|
|
} // switch: message
|
|
} // if: there is a page associated with the window
|
|
|
|
return lr;
|
|
|
|
} //*** CSelNodePage::S_DlgProc()
|