windows-nt/Source/XPSP1/NT/admin/activec/samples/benefits/benefits.cpp
2020-09-26 16:20:57 +08:00

309 lines
8 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: benefits.cpp
//
//--------------------------------------------------------------------------
#include "stdafx.h"
#include "BenSvr.h"
#include "Benefits.h"
#include "RootNode.h"
CBenefits::CBenefits()
{
m_pNode = new CRootNode;
_ASSERTE(m_pNode != NULL);
}
//
// Standard destructor. Simply deletes
// the root node.
//
CBenefits::~CBenefits()
{
delete m_pNode;
m_pNode = NULL;
}
HRESULT CBenefits::Initialize(LPUNKNOWN pUnknown)
{
HRESULT hr = IComponentDataImpl<CBenefits, CBenefitsComponent >::Initialize(pUnknown);
if (FAILED(hr))
return hr;
CComPtr<IImageList> spImageList;
if (m_spConsole->QueryScopeImageList(&spImageList) != S_OK)
{
ATLTRACE(_T("IConsole::QueryScopeImageList failed\n"));
return E_UNEXPECTED;
}
// Load bitmaps associated with the scope pane
// and add them to the image list
// Loads the default bitmaps generated by the wizard
// Change as required
HBITMAP hBitmap16 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BENEFITS_16));
if (hBitmap16 == NULL)
return S_OK;
HBITMAP hBitmap32 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BENEFITS_32));
if (hBitmap32 == NULL)
return S_OK;
if (spImageList->ImageListSetStrip((long*)hBitmap16,
(long*)hBitmap32, 0, RGB(0, 128, 128)) != S_OK)
{
ATLTRACE(_T("IImageList::ImageListSetStrip failed\n"));
return E_UNEXPECTED;
}
//
// This is called to create the unique sub-nodes.
//
( (CRootNode*) m_pNode )->InitializeSubNodes();
return S_OK;
}
//
// This is overridden to handle update notifications from
// the property pages.
//
HRESULT CBenefits::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param)
{
HRESULT hr = E_NOTIMPL;
if ( lpDataObject != NULL )
{
return IComponentDataImpl<CBenefits,CBenefitsComponent>::Notify( lpDataObject, event, arg, param );
}
else
{
//
// There are many events which are sent to Notify with
// the dataobject == NULL. Make sure that the correct one is
// being dealt with.
//
switch( event )
{
case MMCN_PROPERTY_CHANGE:
//
// Send the notification to our root node for further processing.
//
( (CRootNode*) m_pNode )->OnPropertyChange( m_spConsole );
//
// Since we've received an update notification, we'll cause the console
// to be refreshed. This should handle the updates.
//
hr = m_spConsole->UpdateAllViews( NULL, NULL, NULL );
break;
}
}
return( hr );
}
//
// Call the root node's implementation.
//
STDMETHODIMP CBenefits::IsDirty()
{
return( ( (CRootNode*) m_pNode )->IsDirty() );
}
//
// Call the root node's implementation.
//
STDMETHODIMP CBenefits::Load(LPSTREAM pStm)
{
return( ( (CRootNode*) m_pNode )->Load( pStm ) );
}
//
// Call the root node's implementation.
//
STDMETHODIMP CBenefits::Save(LPSTREAM pStm, BOOL fClearDirty)
{
return( ( (CRootNode*) m_pNode )->Save( pStm, fClearDirty ) );
}
//
// Call the root node's implementation.
//
STDMETHODIMP CBenefits::GetSizeMax(ULARGE_INTEGER FAR* pcbSize )
{
return( ( (CRootNode*) m_pNode )->GetSizeMax( pcbSize ) );
}
//
// This function copies the data from the given employee and populates
// the appropriate controls within the page.
//
LRESULT CEmployeeNamePage::OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled )
{
UNUSED_ALWAYS( uiMsg );
UNUSED_ALWAYS( wParam );
UNUSED_ALWAYS( lParam );
UNUSED_ALWAYS( fHandled );
USES_CONVERSION;
_ASSERTE( m_pEmployee != NULL );
SetDlgItemText( IDC_EDIT_LASTNAME, W2T( m_pEmployee->m_szLastName ) );
SetDlgItemText( IDC_EDIT_FIRSTNAME, W2T( m_pEmployee->m_szFirstName ) );
SetDlgItemText( IDC_EDIT_SOCIALSECURITY, W2T( m_pEmployee->m_szSocialSecurity ) );
SetDlgItemText( IDC_EDIT_MOTHERNAME, W2T( m_pEmployee->m_szMotherMaiden ) );
return( TRUE );
}
//
// Handle the storage of any new values to the employee.
//
BOOL CEmployeeNamePage::OnWizardFinish()
{
USES_CONVERSION;
BOOL fValid = TRUE;
TCHAR szBuf[ 256 ];
//
// Get the values from the appropriate edit controls.
// For demo purposes, always assume success unless the last name
// and first are bad.
//
GetDlgItemText( IDC_EDIT_LASTNAME, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szLastName, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_FIRSTNAME, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szFirstName, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_SOCIALSECURITY, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szSocialSecurity, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_MOTHERNAME, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szMotherMaiden, T2W( szBuf ) );
//
// Check for validity of first name and last name.
//
if ( wcslen( m_pEmployee->m_szLastName ) == 0 || wcslen( m_pEmployee->m_szFirstName ) == 0 ||
m_pEmployee->m_szLastName[ 0 ] == ' ' || m_pEmployee->m_szFirstName[ 0 ] == ' ' )
{
//
// Inform the user of the error.
//
MessageBox( _T( "Must enter valid first and last name." ) );
fValid = FALSE;
}
else
{
//
// Data is valid. As a result, post a notification to the snap-in
// that the employee contents have changes. This demonstration does
// not use any sort of hinting, so NULL can be safely pass in as
// the nofication's arguement.
//
PropertyChangeNotify( NULL );
}
return( fValid );
}
//
// This is overridden to modify the UI depending on whether
// we're in start-up mode or not.
//
BOOL CEmployeeNamePage::OnSetActive()
{
if ( m_fStartup )
{
//
// Must use post message during the setactive message.
//
CWindow( GetParent() ).PostMessage( PSM_SETWIZBUTTONS, 0, PSWIZB_NEXT );
}
return TRUE;
}
//
// This function copies the data from the given employee and populates
// the appropriate controls within the page.
//
LRESULT CEmployeeAddressPage::OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled )
{
UNUSED_ALWAYS( uiMsg );
UNUSED_ALWAYS( wParam );
UNUSED_ALWAYS( lParam );
UNUSED_ALWAYS( fHandled );
USES_CONVERSION;
_ASSERTE( m_pEmployee != NULL );
SetDlgItemText( IDC_EDIT_ADDRESSFIRST, W2T( m_pEmployee->m_szAddress1 ) );
SetDlgItemText( IDC_EDIT_ADDRESSSECOND, W2T( m_pEmployee->m_szAddress2 ) );
SetDlgItemText( IDC_EDIT_CITY, W2T( m_pEmployee->m_szCity ) );
SetDlgItemText( IDC_EDIT_STATE, W2T( m_pEmployee->m_szState ) );
SetDlgItemText( IDC_EDIT_ZIP, W2T( m_pEmployee->m_szZip ) );
SetDlgItemText( IDC_EDIT_PHONE, W2T( m_pEmployee->m_szPhone ) );
return( TRUE );
}
//
// Handle the storage of any new values to the employee.
//
BOOL CEmployeeAddressPage::OnWizardFinish()
{
USES_CONVERSION;
BOOL fValid = TRUE;
TCHAR szBuf[ 256 ];
//
// Get the values from the appropriate edit controls.
// For demo purposes, always assume success unless the last name
// and first are bad.
//
GetDlgItemText( IDC_EDIT_ADDRESSFIRST, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szAddress1, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_ADDRESSSECOND, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szAddress2, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_CITY, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szCity, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_STATE, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szState, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_ZIP, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szZip, T2W( szBuf ) );
GetDlgItemText( IDC_EDIT_PHONE, szBuf, sizeof( szBuf ) );
wcscpy( m_pEmployee->m_szPhone, T2W( szBuf ) );
//
// Data is valid. As a result, post a notification to the snap-in
// that the employee contents have changes. This demonstration does
// not use any sort of hinting, so NULL can be safely pass in as
// the nofication's arguement.
//
PropertyChangeNotify( NULL );
return( fValid );
}
//
// This is overridden to modify the UI depending on whether
// we're in start-up mode or not.
//
BOOL CEmployeeAddressPage::OnSetActive()
{
if ( m_fStartup )
{
//
// Must use post message during the setactive message.
//
CWindow( GetParent() ).PostMessage( PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_FINISH );
}
return TRUE;
}