windows-nt/Source/XPSP1/NT/shell/ext/ratings/msrating/basedlg.h
2020-09-26 16:20:57 +08:00

170 lines
3.9 KiB
C++

/****************************************************************************\
*
* basedlg.h
*
* Created: William Taylor (wtaylor) 01/22/01
*
* MS Ratings Base Property Page
*
\****************************************************************************/
#ifndef BASE_DIALOG_H
#define BASE_DIALOG_H
#include "apithk.h"
class CCommonDialogRoutines
{
public:
void ShowHideWindow( HWND hwndDlg, int iCtrl, BOOL fEnable )
{
HWND hCtrl = ::GetDlgItem( hwndDlg, iCtrl );
ASSERT( hCtrl );
if ( hCtrl )
{
::EnableWindow( hCtrl, fEnable );
::ShowWindow( hCtrl, fEnable ? SW_SHOW : SW_HIDE );
}
}
void SetErrorFocus( HWND hwndDlg, int iCtrl )
{
HWND hCtrl = ::GetDlgItem( hwndDlg, iCtrl );
ASSERT( hCtrl );
if ( hCtrl )
{
::SetFocus( hCtrl );
::SendMessage( hCtrl, EM_SETSEL, 0, -1 );
}
}
};
template <WORD t_wDlgTemplateID>
class CBasePropertyPage : public CPropertyPage<t_wDlgTemplateID>
{
private:
PROPSHEETPAGE * m_ppsPage;
public:
typedef CBasePropertyPage<t_wDlgTemplateID> thisClass;
typedef CPropertyPage<t_wDlgTemplateID> baseClass;
BEGIN_MSG_MAP(thisClass)
CHAIN_MSG_MAP_ALT(baseClass, 0)
END_MSG_MAP()
CBasePropertyPage(_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPage<t_wDlgTemplateID>(title)
{
m_ppsPage = NULL;
}
~CBasePropertyPage()
{
if ( m_ppsPage )
{
LocalFree( m_ppsPage );
m_ppsPage = NULL;
}
}
operator PROPSHEETPAGE*() { return m_ppsPage; }
// Override to insure Luna works!
HPROPSHEETPAGE Create()
{
HINSTANCE hinst = _Module.GetResourceInstance();
ASSERT( hinst );
ASSERT( ! m_ppsPage );
m_ppsPage = Whistler_CreatePropSheetPageStruct( hinst );
if ( ! m_ppsPage )
{
TraceMsg( TF_ERROR, "CBasePropertyPage::Create() - m_ppsPage could not be created!" );
return 0;
}
m_ppsPage->dwFlags = PSP_USECALLBACK;
m_ppsPage->hInstance = hinst;
baseClass * pT = static_cast<baseClass *>(this);
pT; // avoid level 4 warning
m_ppsPage->pszTemplate = MAKEINTRESOURCE(pT->IDD);
m_ppsPage->pfnDlgProc = (DLGPROC)baseClass::StartDialogProc;
m_ppsPage->pfnCallback = baseClass::PropPageCallback;
m_ppsPage->lParam = (LPARAM)this;
return ::CreatePropertySheetPage( m_ppsPage );
}
protected:
void MarkChanged()
{
SendMessage( GetParent(), PSM_CHANGED, (WPARAM) m_hWnd, 0 );
}
void ShowHideControl( int iCtrl, BOOL fEnable )
{
CCommonDialogRoutines cdr;
cdr.ShowHideWindow( m_hWnd, iCtrl, fEnable );
}
};
template <class TDerived>
class CBaseDialog : public CDialogImpl<TDerived>
{
public:
typedef CBaseDialog<TDerived> thisClass;
typedef CDialogImpl<TDerived> baseClass;
BEGIN_MSG_MAP(thisClass)
// CHAIN_MSG_MAP_ALT(baseClass, 0)
END_MSG_MAP()
protected:
void ShowHideControl( int iCtrl, BOOL fEnable )
{
CCommonDialogRoutines cdr;
cdr.ShowHideWindow( m_hWnd, iCtrl, fEnable );
}
void SetErrorControl( int iCtrl )
{
CCommonDialogRoutines cdr;
cdr.SetErrorFocus( m_hWnd, iCtrl );
}
void ReduceDialogHeight( int iCtrl )
{
RECT rectControlBox;
ASSERT( GetDlgItem( iCtrl ) );
::GetWindowRect( GetDlgItem( iCtrl ), &rectControlBox );
RECT rectWindow;
GetWindowRect( &rectWindow );
int nNewHeight = ( rectControlBox.bottom - rectWindow.top ) + 8;
RECT rectSize;
GetClientRect( &rectSize );
rectSize.bottom = nNewHeight;
SetWindowPos( NULL, &rectSize, SWP_NOMOVE | SWP_NOZORDER );
}
};
#endif