You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
577 lines
16 KiB
577 lines
16 KiB
/*
|
|
****************************************************************************
|
|
| Copyright (C) 2001 Microsoft Corporation
|
|
|
|
|
| Module Name:
|
|
|
|
|
| UI.cpp
|
|
|
|
|
| Abstract:
|
|
| This is the UI code for the IIS6 Monitor tool
|
|
|
|
|
| Author:
|
|
| Ivo Jeglov (ivelinj)
|
|
|
|
|
| Revision History:
|
|
| November 2001
|
|
|
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include <windowsx.h>
|
|
#include "UI.h"
|
|
#include "Utils.h"
|
|
|
|
|
|
// Property pages DLG procs
|
|
INT_PTR CALLBACK WelcomeDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
INT_PTR CALLBACK LicenseDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
INT_PTR CALLBACK PolicyDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
INT_PTR CALLBACK SettingsDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
INT_PTR CALLBACK InstallDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
INT_PTR CALLBACK ResultDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
|
|
// Other DLG procs
|
|
INT_PTR CALLBACK FatDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
INT_PTR CALLBACK ProgressDlgProc ( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam );
|
|
|
|
// Helpers
|
|
BOOL CheckForFAT ( HINSTANCE hInst, HWND hwndParent );
|
|
|
|
|
|
// Shared data for all the wizard pages
|
|
struct _FontData
|
|
{
|
|
HFONT hTitle;
|
|
HFONT hTips;
|
|
};
|
|
|
|
// Settings data
|
|
struct _Settings
|
|
{
|
|
BOOL bEnableTrail;
|
|
DWORD dwKeepFilesPeriod;
|
|
};
|
|
|
|
|
|
struct _SharedData
|
|
{
|
|
_FontData Fonts;
|
|
_Settings Settings;
|
|
LPCTSTR szError;
|
|
HINSTANCE hInst;
|
|
};
|
|
|
|
|
|
// Helpers
|
|
void LoadTextInCtrl ( UINT nResID, HWND hCtrl );
|
|
void AjustLicenseWizBtn ( HWND hwndPage );
|
|
void InitFonts ( _FontData& FontData );
|
|
void SetWndFontFromLPARAM ( HWND hwndCtrl, LPARAM lParam, BOOL bTitle );
|
|
|
|
|
|
|
|
void DoInstallUI( HINSTANCE hInstance )
|
|
{
|
|
const BYTE PAGE_COUNT = 6;
|
|
|
|
PROPSHEETPAGEW psp = { 0 }; // Defines the property sheet pages
|
|
HPROPSHEETPAGE ahPsp[ PAGE_COUNT ] = { 0 }; // An array to hold the page's HPROPSHEETPAGE handles
|
|
PROPSHEETHEADERW psh = { 0 }; // Defines the property sheet
|
|
_SharedData WizData = { 0 }; // The settings data structure
|
|
|
|
// Create the fonts
|
|
InitFonts( /*r*/WizData.Fonts );
|
|
WizData.hInst = hInstance;
|
|
|
|
// Create the Wizard pages
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
// Welcome page
|
|
psp.dwSize = sizeof( psp );
|
|
psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER | PSP_USETITLE;
|
|
psp.hInstance = hInstance;
|
|
psp.lParam = reinterpret_cast<LPARAM>( &WizData );
|
|
psp.pfnDlgProc = WelcomeDlgProc;
|
|
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_WELCOME );
|
|
psp.pszTitle = MAIN_TITLE;
|
|
|
|
ahPsp[ 0 ] = ::CreatePropertySheetPageW( &psp );
|
|
|
|
// License page
|
|
psp.pfnDlgProc = LicenseDlgProc;
|
|
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_LICENSE );
|
|
|
|
ahPsp[ 1 ] = ::CreatePropertySheetPageW( &psp );
|
|
|
|
// Policy page
|
|
psp.pfnDlgProc = PolicyDlgProc;
|
|
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_POLICY );
|
|
|
|
ahPsp[ 2 ] = ::CreatePropertySheetPageW( &psp );
|
|
|
|
// Settings Page
|
|
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_SETUP );
|
|
psp.pfnDlgProc = SettingsDlgProc;
|
|
|
|
ahPsp[ 3 ] = ::CreatePropertySheetPageW( &psp );
|
|
|
|
// Install Page
|
|
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_INSTALL );
|
|
psp.pfnDlgProc = InstallDlgProc;
|
|
|
|
ahPsp[ 4 ] = ::CreatePropertySheetPageW( &psp );
|
|
|
|
// Result page
|
|
psp.pszTemplate = MAKEINTRESOURCEW( IDD_WPAGE_RESULT );
|
|
psp.pfnDlgProc = ResultDlgProc;
|
|
|
|
ahPsp[ 5 ] = ::CreatePropertySheetPageW( &psp );
|
|
|
|
// Create the property sheet
|
|
psh.dwSize = sizeof( psh );
|
|
psh.hInstance = hInstance;
|
|
psh.hwndParent = NULL;
|
|
psh.phpage = ahPsp;
|
|
psh.dwFlags = PSH_DEFAULT | PSH_NOCONTEXTHELP | PSH_WIZARD97 | PSH_USEICONID;
|
|
psh.pszIcon = MAKEINTRESOURCEW( IDI_SETUP );
|
|
psh.nStartPage = 0;
|
|
psh.nPages = PAGE_COUNT;
|
|
|
|
// Show the wizard.
|
|
VERIFY( ::PropertySheetW( &psh ) != -1 );
|
|
|
|
::DeleteObject( WizData.Fonts.hTips );
|
|
::DeleteObject( WizData.Fonts.hTitle );
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK WelcomeDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
static _SharedData* pData = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Set the title font
|
|
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_TITLE ), lParam, TRUE );
|
|
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_TIP ), lParam, FALSE );
|
|
|
|
// Load the info text
|
|
LoadTextInCtrl( IDR_INFO, ::GetDlgItem( hwndDlg, IDC_INFO ) );
|
|
|
|
// Init the shared data here
|
|
_ASSERT( NULL == pData );
|
|
pData = reinterpret_cast<_SharedData*>( reinterpret_cast<PROPSHEETPAGE*>( lParam )->lParam );
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch ( reinterpret_cast<NMHDR*>( lParam )->code )
|
|
{
|
|
case PSN_SETACTIVE:
|
|
PropSheet_SetWizButtons( ::GetParent( hwndDlg ), PSWIZB_NEXT );
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
// Here is the place to test the requirements
|
|
_ASSERT( pData != NULL );
|
|
pData->szError = CanInstall();
|
|
|
|
// If no error - check if on FAT
|
|
if ( ( NULL == pData->szError ) && !CheckForFAT( pData->hInst, hwndDlg ) )
|
|
{
|
|
// If we are here - the user don't want to install IISMon on FAT
|
|
pData->szError = _T("Installation canceled by the user");
|
|
}
|
|
|
|
if ( pData->szError != NULL )
|
|
{
|
|
// Error - Go to the result page
|
|
PropSheet_SetCurSel( ::GetParent( hwndDlg ), NULL, 5 );
|
|
}
|
|
|
|
break;
|
|
};
|
|
break;
|
|
|
|
case WM_CTLCOLORDLG:
|
|
case WM_CTLCOLORSTATIC:
|
|
// Change the dlg background to white
|
|
return reinterpret_cast<INT_PTR>( ::GetStockObject( WHITE_BRUSH ) );
|
|
break;
|
|
};
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK LicenseDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Load the License text into the edit control
|
|
LoadTextInCtrl( IDR_LICENSE, ::GetDlgItem( hwndDlg, IDC_LICENSE ) );
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
// Will handle only the state changes of the check box button
|
|
if ( HIWORD( wParam ) == BN_CLICKED )
|
|
{
|
|
AjustLicenseWizBtn( hwndDlg );
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
LPNMHDR pNM = reinterpret_cast<NMHDR*>( lParam );
|
|
|
|
switch( pNM->code )
|
|
{
|
|
case PSN_SETACTIVE:
|
|
AjustLicenseWizBtn( hwndDlg );
|
|
break;
|
|
}
|
|
break;
|
|
};
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK PolicyDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Load the License text into the edit control
|
|
LoadTextInCtrl( IDR_POLICY, ::GetDlgItem( hwndDlg, IDC_POLICY ) );
|
|
break;
|
|
|
|
};
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK SettingsDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
int i = 0;
|
|
|
|
static LPCTSTR aszEntries[] = { _T("One week"),
|
|
_T("Two weeks"),
|
|
_T("One month" ),
|
|
_T("Two months" ),
|
|
_T("Never" ) };
|
|
|
|
// How many days represent each of the combo box options above
|
|
static UINT anAuditFilesTime[] = { 7, 14, 30, 60, 0 };
|
|
_ASSERT( ARRAY_SIZE( anAuditFilesTime ) == ARRAY_SIZE( aszEntries ) );
|
|
|
|
static _SharedData* pData = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Fill the combo box
|
|
for ( i = 0; i < ARRAY_SIZE( aszEntries ); ++i )
|
|
{
|
|
VERIFY( ::SendMessage( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ),
|
|
CB_ADDSTRING,
|
|
0,
|
|
reinterpret_cast<LPARAM>( aszEntries[ i ] ) ) != CB_ERR );
|
|
}
|
|
// Set the default selection to the first one
|
|
VERIFY( ::SendMessage( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ),
|
|
CB_SETCURSEL,
|
|
0,
|
|
0 ) != CB_ERR );
|
|
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_WARNING ), lParam, FALSE );
|
|
|
|
// Enable the audit trail
|
|
::SendMessage( ::GetDlgItem( hwndDlg, IDC_ENABLE_TRAIL ),
|
|
BM_SETCHECK,
|
|
BST_CHECKED,
|
|
0 );
|
|
|
|
// Init the shared data here
|
|
_ASSERT( NULL == pData );
|
|
pData = reinterpret_cast<_SharedData*>( reinterpret_cast<PROPSHEETPAGE*>( lParam )->lParam );
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
if ( HIWORD( wParam ) == BN_CLICKED )
|
|
{
|
|
// Enable/ Disable the combo box depending on the 'Enable trail' state
|
|
BOOL bChecked = ( ::IsDlgButtonChecked( hwndDlg, IDC_ENABLE_TRAIL ) == BST_CHECKED );
|
|
::EnableWindow( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ), bChecked );
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
LPNMHDR pNM = reinterpret_cast<NMHDR*>( lParam );
|
|
|
|
switch( pNM->code )
|
|
{
|
|
case PSN_SETACTIVE:
|
|
// For this dialog both Next and Back are enabled
|
|
PropSheet_SetWizButtons( ::GetParent( hwndDlg ), PSWIZB_NEXT | PSWIZB_BACK );
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
// Store the settings in the shared data struct
|
|
_ASSERT( pData != NULL );
|
|
pData->Settings.bEnableTrail = ( ::IsDlgButtonChecked( hwndDlg, IDC_ENABLE_TRAIL ) == BST_CHECKED );
|
|
|
|
if ( pData->Settings.bEnableTrail )
|
|
{
|
|
LRESULT nSel = ::SendMessage( ::GetDlgItem( hwndDlg, IDC_KEEPFILES ),
|
|
CB_GETCURSEL,
|
|
0,
|
|
0 );
|
|
_ASSERT( nSel != CB_ERR );
|
|
_ASSERT( nSel < ARRAY_SIZE( anAuditFilesTime ) );
|
|
|
|
pData->Settings.dwKeepFilesPeriod = anAuditFilesTime[ nSel ];
|
|
}
|
|
else
|
|
{
|
|
pData->Settings.dwKeepFilesPeriod = 0;
|
|
}
|
|
break;
|
|
|
|
}
|
|
break;
|
|
};
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK InstallDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
static LPCWSTR _WARNING =
|
|
L"The World Wide Web Publishing Service (W3SVC) is either stopped or disabled on your server. W3SVC provides \
|
|
Web conectivity and administration through IIS. If you do not plan to run W3SVC, you should not install IIS 6.0 \
|
|
Monitor. To cancel installation, click Cancel.\n\nTo complete the installation of the IIS 6.0 Monitor, \
|
|
click Next.\n\nIf you would like to modify your audit trail settings, click Back.";
|
|
|
|
// If W3SVC is not running or if it is disabled - add a warning
|
|
if ( ( WM_INITDIALOG == uMsg ) && !IsW3SVCEnabled() )
|
|
{
|
|
RECT rc;
|
|
VERIFY( ::GetWindowRect( ::GetDlgItem( hwndDlg, IDC_FRAME ), &rc ) );
|
|
|
|
VERIFY( ::SetWindowTextW( ::GetDlgItem( hwndDlg, IDC_INFO ), _WARNING ) );
|
|
VERIFY( ::SetWindowPos( ::GetDlgItem( hwndDlg, IDC_FRAME ),
|
|
NULL,
|
|
0,
|
|
0,
|
|
rc.right - rc.left,
|
|
rc.bottom - rc.top + 60,
|
|
SWP_NOMOVE | SWP_NOZORDER ) );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK ResultDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
_SharedData* pData = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Init the shared data here
|
|
_ASSERT( NULL == pData );
|
|
pData = reinterpret_cast<_SharedData*>( reinterpret_cast<PROPSHEETPAGE*>( lParam )->lParam );
|
|
|
|
// Set the title font
|
|
SetWndFontFromLPARAM( ::GetDlgItem( hwndDlg, IDC_RESULT ), lParam, TRUE );
|
|
|
|
// If a previous error - set it. Else - try to install
|
|
if ( NULL == pData->szError )
|
|
{
|
|
// Show the status window
|
|
HWND hwndStatus = ::CreateDialog( pData->hInst, MAKEINTRESOURCE( IDD_PROGRESS ), hwndDlg, ProgressDlgProc );
|
|
::ShowWindow( hwndStatus, SW_SHOW );
|
|
::RedrawWindow( hwndStatus, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW );
|
|
_ASSERT( hwndStatus != NULL );
|
|
|
|
pData->szError = Install( pData->hInst, pData->Settings.bEnableTrail, pData->Settings.dwKeepFilesPeriod );
|
|
|
|
// Hide the status window
|
|
::DestroyWindow( hwndStatus );
|
|
}
|
|
|
|
if ( pData->szError != NULL )
|
|
{
|
|
TCHAR szBuffer[ 2048 ];
|
|
::_stprintf( szBuffer,
|
|
_T("IIS 6.0 Monitor installation failed because of the following error:\n\n%s"),
|
|
pData->szError );
|
|
|
|
VERIFY( ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_RESULT ), _T("Installation Unsuccessful!") ) );
|
|
VERIFY( ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_INFO ), szBuffer ) );
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
if ( PSN_SETACTIVE == reinterpret_cast<NMHDR*>( lParam )->code )
|
|
{
|
|
// Change the Next button to Finish. Back is not enabled - this is a result screen
|
|
PropSheet_SetWizButtons( ::GetParent( hwndDlg ), PSWIZB_FINISH );
|
|
}
|
|
break;
|
|
|
|
case WM_CTLCOLORDLG:
|
|
case WM_CTLCOLORSTATIC:
|
|
// Change the dlg background to white
|
|
return reinterpret_cast<INT_PTR>( ::GetStockObject( WHITE_BRUSH ) );
|
|
};
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK FatDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
RECT rc;
|
|
|
|
const UINT nNoDetailsHeight = 170;
|
|
const UINT nWithDetailsHeight = 310;
|
|
|
|
VERIFY( ::GetWindowRect( hwndDlg, &rc ) );
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
LoadTextInCtrl( IDR_FATDETAILS, ::GetDlgItem( hwndDlg, IDC_DETAILS ) );
|
|
::SetWindowPos( hwndDlg, NULL, 0, 0, rc.right - rc.left, nNoDetailsHeight, SWP_NOMOVE | SWP_NOZORDER );
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDOK:
|
|
case IDCANCEL:
|
|
::EndDialog( hwndDlg, LOWORD( wParam ) );
|
|
break;
|
|
|
|
case IDC_TOGGLE:
|
|
// Alter current state ( current state is obtained using the window height )
|
|
bool bDetailsVisible = !( ( rc.bottom - rc.top ) > nNoDetailsHeight );
|
|
VERIFY( ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_TOGGLE ),
|
|
bDetailsVisible ? _T("Details <<") : _T("Details >>" ) ) );
|
|
::SetWindowPos( hwndDlg,
|
|
NULL,
|
|
0,
|
|
0,
|
|
rc.right - rc.left,
|
|
bDetailsVisible ? nWithDetailsHeight : nNoDetailsHeight,
|
|
SWP_NOMOVE | SWP_NOZORDER );
|
|
break;
|
|
}
|
|
break;
|
|
};
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
INT_PTR CALLBACK ProgressDlgProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam )
|
|
{
|
|
// Nothing to do here
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
BOOL CheckForFAT( HINSTANCE hInst, HWND hwndParent )
|
|
{
|
|
BOOL bRes = TRUE;
|
|
|
|
// If the file system is FAT - warn the user
|
|
if ( !IsNTFS() )
|
|
{
|
|
INT_PTR nDlgRes = ::DialogBox( hInst, MAKEINTRESOURCE( IDD_FAT_WARNING ), hwndParent, FatDlgProc );
|
|
|
|
bRes = ( IDOK == nDlgRes );
|
|
}
|
|
|
|
return bRes;
|
|
}
|
|
|
|
|
|
void LoadTextInCtrl( UINT nResID, HWND hwndCtrl )
|
|
{
|
|
_ASSERT( hwndCtrl != NULL );
|
|
|
|
HRSRC hRes = ::FindResource( NULL, MAKEINTRESOURCE( nResID ), RT_RCDATA );
|
|
_ASSERT( hRes != NULL );
|
|
|
|
// Get the resource data
|
|
HGLOBAL hData = ::LoadResource( NULL, hRes );
|
|
_ASSERT( hData != NULL );
|
|
|
|
LPVOID pvData = ::LockResource( hData );
|
|
_ASSERT( pvData != NULL );
|
|
|
|
// The text is ANSI!
|
|
VERIFY( ::SetWindowTextA( hwndCtrl, reinterpret_cast<LPCSTR>( pvData ) ) );
|
|
}
|
|
|
|
|
|
|
|
void AjustLicenseWizBtn( HWND hwndPage )
|
|
{
|
|
// Enable / Disable the next button depending ot check box state
|
|
bool bChecked = ( ::IsDlgButtonChecked( hwndPage, IDC_ACCEPT ) == BST_CHECKED );
|
|
PropSheet_SetWizButtons( ::GetParent( hwndPage ), bChecked ? PSWIZB_NEXT | PSWIZB_BACK : PSWIZB_BACK );
|
|
}
|
|
|
|
|
|
|
|
void InitFonts( _FontData& FontData )
|
|
{
|
|
// Create the font for the wizard title texts and for the text of tipd
|
|
NONCLIENTMETRICS ncm = { 0 };
|
|
ncm.cbSize = sizeof( ncm );
|
|
::SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 );
|
|
|
|
|
|
LOGFONT TitleLogFont = ncm.lfMessageFont;
|
|
TitleLogFont.lfWeight = FW_BOLD;
|
|
lstrcpy( TitleLogFont.lfFaceName, _T("Verdana Bold") );
|
|
|
|
// Create the tips font
|
|
FontData.hTips = ::CreateFontIndirect( &TitleLogFont );
|
|
|
|
// Create the intro/end title font
|
|
HDC hdc = ::GetDC(NULL); // Gets the screen DC
|
|
INT FontSize = 12;
|
|
TitleLogFont.lfHeight = 0 - GetDeviceCaps( hdc, LOGPIXELSY ) * FontSize / 72;
|
|
FontData.hTitle = ::CreateFontIndirect( &TitleLogFont );
|
|
|
|
::ReleaseDC( NULL, hdc );
|
|
}
|
|
|
|
|
|
|
|
void SetWndFontFromLPARAM( HWND hwndCtrl, LPARAM lParam, BOOL bTitle )
|
|
{
|
|
PROPSHEETPAGE* pPage = reinterpret_cast<PROPSHEETPAGE*>( lParam );
|
|
_FontData Fonts = reinterpret_cast<_SharedData*>( pPage->lParam )->Fonts;
|
|
|
|
SetWindowFont( hwndCtrl, bTitle ? Fonts.hTitle : Fonts.hTips, TRUE );
|
|
}
|