611 lines
19 KiB
C++
611 lines
19 KiB
C++
/*****************************************************************************\
|
|
FILE: EffectsAdvPg.cpp
|
|
|
|
DESCRIPTION:
|
|
This code will display the Effect tab in the Advanced Display Control
|
|
panel.
|
|
|
|
BryanSt 4/13/2000 Updated and Converted to C++
|
|
|
|
Copyright (C) Microsoft Corp 2000-2000. All rights reserved.
|
|
\*****************************************************************************/
|
|
|
|
#include "priv.h"
|
|
#include "EffectsAdvPg.h"
|
|
#include "regutil.h"
|
|
|
|
//#undef _SHSEMIP_H_
|
|
//#include <shsemip.h>
|
|
|
|
|
|
|
|
typedef struct
|
|
{
|
|
DWORD dwControlID;
|
|
DWORD dwHelpContextID;
|
|
}POPUP_HELP_ARRAY;
|
|
|
|
POPUP_HELP_ARRAY phaMainDisplay[] = {
|
|
{ IDC_LARGEICONS, IDH_DISPLAY_EFFECTS_LARGE_ICONS_CHECKBOX },
|
|
{ IDC_ICONHIGHCOLOR, IDH_DISPLAY_EFFECTS_ALL_COLORS_CHECKBOX },
|
|
{ IDC_MENUANIMATION, IDH_DISPLAY_EFFECTS_ANIMATE_WINDOWS },
|
|
{ IDC_FONTSMOOTH, IDH_DISPLAY_EFFECTS_SMOOTH_FONTS_CHECKBOX },
|
|
{ IDC_SHOWDRAG, IDH_DISPLAY_EFFECTS_DRAG_WINDOW_CHECKBOX },
|
|
{ IDC_KEYBOARDINDICATORS, IDH_DISPLAY_EFFECTS_HIDE_KEYBOARD_INDICATORS },
|
|
{ IDC_GRPBOX_2, IDH_COMM_GROUPBOX },
|
|
{ IDC_COMBOEFFECT, IDH_DISPLAY_EFFECTS_ANIMATE_LISTBOX },
|
|
{ IDC_COMBOFSMOOTH, IDH_DISPLAY_EFFECTS_SMOOTH_FONTS_LISTBOX },
|
|
{ IDC_MENUSHADOWS, IDH_DISPLAY_EFFECTS_MENUSHADOWS},
|
|
{ 0, 0 },
|
|
{ 0, 0 }, // double-null terminator NECESSARY!
|
|
};
|
|
|
|
#define SZ_HELPFILE_DISPLAY TEXT("DISPLAY.HLP")
|
|
#define SZ_HELPFILE_WINDOWS TEXT("WINDOWS.HLP")
|
|
|
|
ULONG g_ulFontInformation, g_ulNewFontInformation;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//===========================
|
|
// *** Class Internals & Helpers ***
|
|
//===========================
|
|
int FontSmoothingTypeToListIndex(DWORD dwFontSmoothingType)
|
|
{
|
|
// We OR dwSmoothingType with 0x3 because USER may add other high bits that we don't care about.
|
|
return ((0x3 & dwFontSmoothingType) - 1);
|
|
}
|
|
|
|
|
|
DWORD ListIndexToFontSmoothingType(int nIndex, DWORD dwPreviousType)
|
|
{
|
|
// We want to keep the high bits in dwPreviousType because we are only replacing
|
|
// the lower bits.
|
|
return ((0xFFFFFFF0 & dwPreviousType) | (nIndex + 1));
|
|
}
|
|
|
|
|
|
void HideComboEffectsWindow(HWND hDlg)
|
|
{
|
|
TCHAR szText[MAX_PATH];
|
|
|
|
// We change the text so it doesn't have a reference to the drop down.
|
|
LoadString(HINST_THISDLL, IDS_COMBO_EFFECTS_NOLIST, szText, ARRAYSIZE(szText));
|
|
SetWindowText(GetDlgItem(hDlg, IDC_MENUANIMATION), szText);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_COMBOEFFECT), SW_HIDE);
|
|
}
|
|
|
|
|
|
BOOL FadeEffectAvailable()
|
|
{
|
|
BOOL fFade = FALSE, fTestFade = FALSE;
|
|
|
|
ClassicSystemParametersInfo( SPI_GETMENUFADE, 0, (PVOID)&fFade, 0 );
|
|
if (fFade)
|
|
return TRUE;
|
|
|
|
ClassicSystemParametersInfo( SPI_SETMENUFADE, 0, (PVOID)1, 0);
|
|
ClassicSystemParametersInfo( SPI_GETMENUFADE, 0, (PVOID)&fTestFade, 0 );
|
|
ClassicSystemParametersInfo( SPI_SETMENUFADE, 0, IntToPtr(fFade), 0);
|
|
|
|
return (fTestFade);
|
|
}
|
|
|
|
|
|
HRESULT CEffectsPage::_OnApply(HWND hDlg)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// Full Color Icons
|
|
if (m_pEffectsState && (m_pEffectsState->_nOldHighIconColor != m_pEffectsState->_nHighIconColor))
|
|
{
|
|
if ((GetBitsPerPixel() < 16) && (m_pEffectsState->_nHighIconColor == 16)) // Display mode won't support icon high colors
|
|
{
|
|
TCHAR szTemp1[512];
|
|
TCHAR szTemp2[256];
|
|
|
|
LoadString(HINST_THISDLL, IDS_256COLORPROBLEM, szTemp1, ARRAYSIZE(szTemp1));
|
|
LoadString(HINST_THISDLL, IDS_ICONCOLORWONTWORK, szTemp2, ARRAYSIZE(szTemp2));
|
|
StrCatBuff(szTemp1, szTemp2, ARRAYSIZE(szTemp1));
|
|
LoadString(HINST_THISDLL, IDS_EFFECTS, szTemp2, ARRAYSIZE(szTemp2));
|
|
|
|
MessageBox(hDlg, szTemp1, szTemp2, MB_OK|MB_ICONINFORMATION);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CEffectsPage::_OnInit(HWND hDlg)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
TCHAR szRes[100];
|
|
|
|
if (!m_pEffectsState)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Load the state from persisted form (registry) to the state struct
|
|
//////////////////////////////////////////////////////////////////////////
|
|
g_bMirroredOS = IS_MIRRORING_ENABLED();
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Update UI based on the state struct
|
|
//////////////////////////////////////////////////////////////////////////
|
|
if (m_pEffectsState->_nLargeIcon == ICON_INDETERMINATE)
|
|
{
|
|
HWND hItem = GetDlgItem(hDlg, IDC_LARGEICONS);
|
|
SendMessage(hItem, BM_SETSTYLE, (WPARAM)LOWORD(BS_AUTO3STATE), MAKELPARAM(FALSE,0));
|
|
}
|
|
|
|
// Set CheckBoxes
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_LARGEICONS), BM_SETCHECK, (WPARAM)m_pEffectsState->_nLargeIcon, 0);
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_MENUSHADOWS), BM_SETCHECK, (WPARAM)m_pEffectsState->_fMenuShadows, 0);
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_ICONHIGHCOLOR ), BM_SETCHECK, (WPARAM)(BOOL)(m_pEffectsState->_nHighIconColor == 16), 0);
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_MENUANIMATION), BM_SETCHECK, (WPARAM)m_pEffectsState->_wpMenuAnimation, 0);
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_FONTSMOOTH), BM_SETCHECK, (WPARAM)m_pEffectsState->_fFontSmoothing, 0);
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_SHOWDRAG), BM_SETCHECK, (WPARAM)m_pEffectsState->_fDragWindow, 0);
|
|
SendMessage((HWND)GetDlgItem(hDlg, IDC_KEYBOARDINDICATORS), BM_SETCHECK, (WPARAM)(m_pEffectsState->_fKeyboardIndicators ? BST_UNCHECKED : BST_CHECKED), 0);
|
|
|
|
|
|
// Set Effects Drop Down
|
|
HWND hwndCombo = GetDlgItem(hDlg,IDC_COMBOEFFECT);
|
|
ComboBox_ResetContent(hwndCombo);
|
|
LoadString(HINST_THISDLL, IDS_FADEEFFECT, szRes, ARRAYSIZE(szRes) );
|
|
ComboBox_AddString(hwndCombo, szRes);
|
|
LoadString(HINST_THISDLL, IDS_SCROLLEFFECT, szRes, ARRAYSIZE(szRes) );
|
|
ComboBox_AddString(hwndCombo, szRes);
|
|
ComboBox_SetCurSel(hwndCombo, (MENU_EFFECT_FADE == m_pEffectsState->_dwAnimationEffect) ? 0 : 1);
|
|
EnableWindow(hwndCombo, (UINT)m_pEffectsState->_wpMenuAnimation);
|
|
|
|
if (IsTSPerfFlagEnabled(TSPerFlag_NoAnimation))
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_MENUANIMATION), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_COMBOEFFECT), FALSE);
|
|
LogStatus("Animation Forced off because of TS Perf Flags\r\n");
|
|
}
|
|
|
|
if (IsTSPerfFlagEnabled(TSPerFlag_NoWindowDrag))
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SHOWDRAG), FALSE);
|
|
LogStatus("FullWindowDrag feature Forced off because of TS Perf Flags\r\n");
|
|
}
|
|
|
|
if (!FadeEffectAvailable())
|
|
{
|
|
HideComboEffectsWindow(hDlg);
|
|
}
|
|
|
|
if (0 != SHGetRestriction(NULL,POLICY_KEY_EXPLORER,POLICY_VALUE_ANIMATION))
|
|
{
|
|
//disable
|
|
//0= enable
|
|
//non-0= disable
|
|
//relies on the fact that if the key does not exist it returns 0 as well
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_MENUANIMATION), FALSE);
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_COMBOEFFECT), FALSE);
|
|
}
|
|
|
|
hwndCombo = GetDlgItem(hDlg,IDC_COMBOFSMOOTH);
|
|
ComboBox_ResetContent(hwndCombo);
|
|
LoadString(HINST_THISDLL, IDS_STANDARDSMOOTHING, szRes, ARRAYSIZE(szRes));
|
|
ComboBox_AddString(hwndCombo, szRes);
|
|
LoadString(HINST_THISDLL, IDS_CLEARTYPE, szRes, ARRAYSIZE(szRes));
|
|
ComboBox_AddString(hwndCombo, szRes);
|
|
|
|
BOOL fTemp;
|
|
ComboBox_SetCurSel(hwndCombo, m_pEffectsState->_dwFontSmoothingType-1);
|
|
if (ClassicSystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, (PVOID)&fTemp, 0))
|
|
{
|
|
EnableWindow((HWND)hwndCombo, m_pEffectsState->_fFontSmoothing);
|
|
}
|
|
else
|
|
{
|
|
ShowWindow(hwndCombo, SW_HIDE);
|
|
ShowWindow(GetDlgItem(hDlg, IDC_SHOWME), SW_HIDE);
|
|
}
|
|
|
|
|
|
if (0 != SHGetRestriction(NULL, POLICY_KEY_EXPLORER, POLICY_VALUE_KEYBOARDNAV))
|
|
{
|
|
//disable, see comment for animation
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_KEYBOARDINDICATORS), FALSE);
|
|
}
|
|
|
|
//disable and uncheck things if we are on terminal server
|
|
BOOL bEffectsEnabled;
|
|
if (!ClassicSystemParametersInfo(SPI_GETUIEFFECTS, 0, (PVOID) &bEffectsEnabled, 0))
|
|
{
|
|
// This flag is only available on Win2k and later. We're depending
|
|
// on the call returning false if the flag doesn't exist...
|
|
bEffectsEnabled = TRUE;
|
|
}
|
|
|
|
if (!bEffectsEnabled)
|
|
{
|
|
EnableWindow((HWND)GetDlgItem( hDlg, IDC_MENUANIMATION), FALSE);
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_ICONHIGHCOLOR), FALSE);
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_KEYBOARDINDICATORS), FALSE);
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_FONTSMOOTH), FALSE);
|
|
EnableWindow((HWND)GetDlgItem(hDlg, IDC_COMBOFSMOOTH), FALSE);
|
|
|
|
HideComboEffectsWindow(hDlg);
|
|
SendDlgItemMessage(hDlg, IDC_MENUANIMATION, BM_SETCHECK, 0, 0);
|
|
SendDlgItemMessage(hDlg, IDC_ICONHIGHCOLOR, BM_SETCHECK, 0, 0);
|
|
SendDlgItemMessage(hDlg, IDC_KEYBOARDINDICATORS, BM_SETCHECK, 0, 0);
|
|
SendDlgItemMessage(hDlg, IDC_FONTSMOOTH, BM_SETCHECK, 0, 0);
|
|
}
|
|
|
|
// We remove the Keyboard indicators check box on non-NT platform since User32
|
|
// does not provide the functionality to implement the feature.
|
|
if (!IsOSNT())
|
|
{
|
|
HWND hwndSWC = GetDlgItem(hDlg, IDC_SHOWDRAG);
|
|
HWND hwndKI = GetDlgItem(hDlg, IDC_KEYBOARDINDICATORS);
|
|
HWND hwndGroup = GetDlgItem(hDlg, IDC_GRPBOX_2);
|
|
|
|
// Hide the Hide keyboard cues check box on non-NT platform
|
|
ShowWindow(hwndKI, SW_HIDE);
|
|
|
|
// Calculate the bottom margin
|
|
RECT rect;
|
|
RECT rectGroup;
|
|
GetWindowRect(hwndKI, &rect);
|
|
GetWindowRect(hwndGroup, &rectGroup);
|
|
int margin = rectGroup.bottom - rect.bottom;
|
|
|
|
GetWindowRect(hwndSWC, &rect);
|
|
SetWindowPos(hwndGroup, HWND_TOP, 0, 0, rectGroup.right - rectGroup.left,
|
|
rect.bottom - rectGroup.top + margin, SWP_NOMOVE | SWP_NOZORDER);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
INT_PTR CEffectsPage::_OnCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
BOOL fHandled = 1; // Not handled (WM_COMMAND seems to be different)
|
|
WORD idCtrl = GET_WM_COMMAND_ID(wParam, lParam);
|
|
WORD wEvent = GET_WM_COMMAND_CMD(wParam, lParam);
|
|
|
|
switch (idCtrl)
|
|
{
|
|
case IDOK:
|
|
EndDialog(hDlg, IDOK);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, IDCANCEL);
|
|
break;
|
|
|
|
case IDC_LARGEICONS:
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_nLargeIcon = (int)SendMessage ( (HWND)lParam, BM_GETCHECK, 0, 0 );
|
|
}
|
|
break;
|
|
|
|
case IDC_MENUSHADOWS:
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_fMenuShadows = (int)SendMessage ( (HWND)lParam, BM_GETCHECK, 0, 0 );
|
|
}
|
|
break;
|
|
|
|
case IDC_ICONHIGHCOLOR:
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_nHighIconColor = 4;
|
|
if (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == TRUE)
|
|
{
|
|
m_pEffectsState->_nHighIconColor = 16;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_SHOWDRAG:
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_fDragWindow = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED);
|
|
}
|
|
break;
|
|
|
|
case IDC_MENUANIMATION:
|
|
if (m_pEffectsState)
|
|
{
|
|
switch (m_pEffectsState->_wpMenuAnimation)
|
|
{
|
|
case BST_UNCHECKED:
|
|
m_pEffectsState->_wpMenuAnimation = BST_CHECKED;
|
|
break;
|
|
|
|
case BST_CHECKED:
|
|
m_pEffectsState->_wpMenuAnimation = BST_UNCHECKED;
|
|
break;
|
|
|
|
case BST_INDETERMINATE:
|
|
m_pEffectsState->_wpMenuAnimation = BST_UNCHECKED;
|
|
break;
|
|
}
|
|
SendMessage( (HWND)lParam, BM_SETCHECK, (WPARAM)m_pEffectsState->_wpMenuAnimation, 0 );
|
|
EnableWindow((HWND)GetDlgItem( hDlg, IDC_COMBOEFFECT), (BST_CHECKED == m_pEffectsState->_wpMenuAnimation));
|
|
}
|
|
break;
|
|
|
|
case IDC_COMBOEFFECT:
|
|
if ((wEvent == CBN_SELCHANGE) && m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_dwAnimationEffect = (DWORD)ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBOEFFECT)) + 1;
|
|
}
|
|
break;
|
|
|
|
case IDC_COMBOFSMOOTH:
|
|
if ((wEvent == CBN_SELCHANGE) && m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_dwFontSmoothingType = ListIndexToFontSmoothingType(ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBOFSMOOTH)), m_pEffectsState->_dwFontSmoothingType);
|
|
}
|
|
break;
|
|
|
|
case IDC_FONTSMOOTH:
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_fFontSmoothing = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED);
|
|
EnableWindow((HWND)GetDlgItem( hDlg, IDC_COMBOFSMOOTH), m_pEffectsState->_fFontSmoothing);
|
|
if (m_pEffectsState->_fFontSmoothing)
|
|
{
|
|
m_pEffectsState->_dwFontSmoothingType = ListIndexToFontSmoothingType(ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBOFSMOOTH)), m_pEffectsState->_dwFontSmoothingType);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_KEYBOARDINDICATORS:
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->_fKeyboardIndicators = ((SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED) ? FALSE : TRUE);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return fHandled;
|
|
}
|
|
|
|
|
|
INT_PTR CALLBACK PropertySheetDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CEffectsPage * pThis = (CEffectsPage *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
if (WM_INITDIALOG == wMsg)
|
|
{
|
|
pThis = (CEffectsPage *) lParam;
|
|
|
|
if (pThis)
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
|
}
|
|
}
|
|
|
|
if (pThis)
|
|
return pThis->_PropertySheetDlgProc(hDlg, wMsg, wParam, lParam);
|
|
|
|
return DefWindowProc(hDlg, wMsg, wParam, lParam);
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// PropertySheetDlgProc()
|
|
//
|
|
// The dialog procedure for the "PlusPack" property sheet page.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
INT_PTR CEffectsPage::_PropertySheetDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch( uMessage )
|
|
{
|
|
case WM_INITDIALOG:
|
|
_OnInit(hDlg);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
_OnCommand(hDlg, uMessage, wParam, lParam);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
LPHELPINFO lphi = (LPHELPINFO)lParam;
|
|
|
|
if( lphi->iContextType == HELPINFO_WINDOW )
|
|
{
|
|
LPCWSTR pszHelpFile = ((lphi->hItemHandle == GetDlgItem(hDlg, IDC_GRPBOX_2)) ? SZ_HELPFILE_WINDOWS : SZ_HELPFILE_DISPLAY);
|
|
WinHelp( (HWND)lphi->hItemHandle, pszHelpFile, HELP_WM_HELP, (DWORD_PTR)phaMainDisplay);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
// first check for dlg window
|
|
if( (HWND)wParam == hDlg )
|
|
{
|
|
// let the def dlg proc decide whether to respond or ignore;
|
|
// necessary for title bar sys menu on right click
|
|
return FALSE; // didn't process message EXIT
|
|
}
|
|
else
|
|
{
|
|
// else go for the controls
|
|
LPCWSTR pszHelpFile = (((HWND)wParam == GetDlgItem(hDlg, IDC_GRPBOX_2)) ? SZ_HELPFILE_WINDOWS : SZ_HELPFILE_DISPLAY);
|
|
WinHelp( (HWND)wParam, pszHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)phaMainDisplay);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
HRESULT CEffectsPage::_IsDirty(IN BOOL * pIsDirty)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if (pIsDirty && m_pEffectsState)
|
|
{
|
|
// Ask state if it's dirty
|
|
*pIsDirty = m_pEffectsState->IsDirty();
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//===========================
|
|
// *** IAdvancedDialog Interface ***
|
|
//===========================
|
|
HRESULT CEffectsPage::DisplayAdvancedDialog(IN HWND hwndParent, IN IPropertyBag * pBasePage, IN BOOL * pfEnableApply)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if (hwndParent && pBasePage && pfEnableApply)
|
|
{
|
|
// Load State Into Advanced Dialog
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->Release();
|
|
m_pEffectsState = NULL;
|
|
}
|
|
|
|
*pfEnableApply = FALSE;
|
|
CEffectState * pEffectClone = NULL;
|
|
|
|
hr = SHPropertyBag_ReadByRef(pBasePage, SZ_PBPROP_EFFECTSSTATE, (void *)&pEffectClone, sizeof(pEffectClone));
|
|
if (SUCCEEDED(hr) && pEffectClone)
|
|
{
|
|
// We want a copy of their state
|
|
hr = pEffectClone->Clone(&m_pEffectsState);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
LinkWindow_RegisterClass();
|
|
|
|
// Display Advanced Dialog
|
|
if ((IDOK == DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(DLG_EFFECTS), hwndParent, PropertySheetDlgProc, (LPARAM)this)) && m_pEffectsState)
|
|
{
|
|
// The user clicked OK, so merge modified state back into base dialog
|
|
_IsDirty(pfEnableApply);
|
|
|
|
// The user clicked Okay in the dialog so merge the dirty state from the
|
|
// advanced dialog into the base dialog.
|
|
hr = SHPropertyBag_WriteByRef(pBasePage, SZ_PBPROP_EFFECTSSTATE, (void *)m_pEffectsState);
|
|
m_pEffectsState->Release();
|
|
m_pEffectsState = NULL;
|
|
}
|
|
}
|
|
|
|
LinkWindow_UnregisterClass(HINST_THISDLL);
|
|
pEffectClone->Release();
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//===========================
|
|
// *** IUnknown Interface ***
|
|
//===========================
|
|
ULONG CEffectsPage::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
|
|
|
|
ULONG CEffectsPage::Release()
|
|
{
|
|
if (InterlockedDecrement(&m_cRef))
|
|
return m_cRef;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
|
|
HRESULT CEffectsPage::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
static const QITAB qit[] =
|
|
{
|
|
QITABENT(CEffectsPage, IObjectWithSite),
|
|
QITABENT(CEffectsPage, IAdvancedDialog),
|
|
{ 0 },
|
|
};
|
|
|
|
return QISearch(this, qit, riid, ppvObj);
|
|
}
|
|
|
|
|
|
|
|
|
|
//===========================
|
|
// *** Class Methods ***
|
|
//===========================
|
|
CEffectsPage::CEffectsPage() : m_cRef(1)
|
|
{
|
|
// This needs to be allocated in Zero Inited Memory.
|
|
// Assert that all Member Variables are inited to Zero.
|
|
m_fDirty = FALSE;
|
|
}
|
|
|
|
|
|
CEffectsPage::~CEffectsPage()
|
|
{
|
|
if (m_pEffectsState)
|
|
{
|
|
m_pEffectsState->Release();
|
|
}
|
|
}
|
|
|
|
|
|
HRESULT CEffectsPage_CreateInstance(OUT IAdvancedDialog ** ppAdvDialog)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if (ppAdvDialog)
|
|
{
|
|
CEffectsPage * pThis = new CEffectsPage();
|
|
|
|
if (pThis)
|
|
{
|
|
hr = pThis->QueryInterface(IID_PPV_ARG(IAdvancedDialog, ppAdvDialog));
|
|
pThis->Release();
|
|
}
|
|
else
|
|
{
|
|
*ppAdvDialog = NULL;
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|