?? atldlgs.h
字號:
// Implementation - override to prevent usage
HWND Create(LPCTSTR, HWND, _U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, _U_MENUorID = 0U, LPVOID = NULL)
{
ATLASSERT(FALSE);
return NULL;
}
};
/////////////////////////////////////////////////////////////////////////////
// CPropertySheetImpl - implements a property sheet
#if (_MSC_VER >= 1200)
typedef HPROPSHEETPAGE _HPROPSHEETPAGE_TYPE;
#else
// we use void* here instead of HPROPSHEETPAGE becuase HPROPSHEETPAGE
// is a _PSP*, but _PSP is not defined properly
typedef void* _HPROPSHEETPAGE_TYPE;
#endif
template <class T, class TBase = CPropertySheetWindow>
class ATL_NO_VTABLE CPropertySheetImpl : public CWindowImplBaseT< TBase >
{
public:
PROPSHEETHEADER m_psh;
CSimpleArray<_HPROPSHEETPAGE_TYPE> m_arrPages;
// Construction/Destruction
CPropertySheetImpl(_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL)
{
memset(&m_psh, 0, sizeof(PROPSHEETHEADER));
m_psh.dwSize = sizeof(PROPSHEETHEADER);
m_psh.dwFlags = PSH_USECALLBACK;
m_psh.hInstance = _Module.GetResourceInstance();
m_psh.phpage = NULL; // will be set later
m_psh.nPages = 0; // will be set later
m_psh.pszCaption = title.m_lpstr;
m_psh.nStartPage = uStartPage;
m_psh.hwndParent = hWndParent; // if NULL, will be set in DoModal/Create
m_psh.pfnCallback = T::PropSheetCallback;
}
~CPropertySheetImpl()
{
if(m_arrPages.GetSize() > 0) // sheet never created, destroy all pages
{
for(int i = 0; i < m_arrPages.GetSize(); i++)
::DestroyPropertySheetPage((HPROPSHEETPAGE)m_arrPages[i]);
}
}
static int CALLBACK PropSheetCallback(HWND hWnd, UINT uMsg, LPARAM)
{
if(uMsg == PSCB_INITIALIZED)
{
ATLASSERT(hWnd != NULL);
T* pT = (T*)_Module.ExtractCreateWndData();
// subclass the sheet window
pT->SubclassWindow(hWnd);
// remove page handles array
pT->_CleanUpPages();
}
return 0;
}
HWND Create(HWND hWndParent = NULL)
{
ATLASSERT(m_hWnd == NULL);
m_psh.dwFlags |= PSH_MODELESS;
if(m_psh.hwndParent == NULL)
m_psh.hwndParent = hWndParent;
m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData();
m_psh.nPages = m_arrPages.GetSize();
T* pT = static_cast<T*>(this);
_Module.AddCreateWndData(&m_thunk.cd, pT);
HWND hWnd = (HWND)::PropertySheet(&m_psh);
_CleanUpPages(); // ensure clean-up, required if call failed
ATLASSERT(m_hWnd == hWnd);
return hWnd;
}
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
{
ATLASSERT(m_hWnd == NULL);
m_psh.dwFlags &= ~PSH_MODELESS;
if(m_psh.hwndParent == NULL)
m_psh.hwndParent = hWndParent;
m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData();
m_psh.nPages = m_arrPages.GetSize();
T* pT = static_cast<T*>(this);
_Module.AddCreateWndData(&m_thunk.cd, pT);
INT_PTR nRet = ::PropertySheet(&m_psh);
_CleanUpPages(); // ensure clean-up, required if call failed
return nRet;
}
// implementation helper - clean up pages array
void _CleanUpPages()
{
m_psh.nPages = 0;
m_psh.phpage = NULL;
m_arrPages.RemoveAll();
}
// Attributes (extended overrides of client class methods)
// These now can be called before the sheet is created
// Note: Calling these after the sheet is created gives unpredictable results
int GetPageCount() const
{
if(m_hWnd == NULL) // not created yet
return m_arrPages.GetSize();
return TBase::GetPageCount();
}
int GetActiveIndex() const
{
if(m_hWnd == NULL) // not created yet
return m_psh.nStartPage;
return TBase::GetActiveIndex();
}
HPROPSHEETPAGE GetPage(int nPageIndex) const
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
return (HPROPSHEETPAGE)m_arrPages[nPageIndex];
}
int GetPageIndex(HPROPSHEETPAGE hPage) const
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
return m_arrPages.Find((_HPROPSHEETPAGE_TYPE&)hPage);
}
BOOL SetActivePage(int nPageIndex)
{
if(m_hWnd == NULL) // not created yet
{
ATLASSERT(nPageIndex >= 0 && nPageIndex < m_arrPages.GetSize());
m_psh.nStartPage = nPageIndex;
return TRUE;
}
return TBase::SetActivePage(nPageIndex);
}
BOOL SetActivePage(HPROPSHEETPAGE hPage)
{
ATLASSERT(hPage != NULL);
if (m_hWnd == NULL) // not created yet
{
int nPageIndex = GetPageIndex(hPage);
if(nPageIndex == -1)
return FALSE;
return SetActivePage(nPageIndex);
}
return TBase::SetActivePage(hPage);
}
void SetTitle(LPCTSTR lpszText, UINT nStyle = 0)
{
ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0); // only PSH_PROPTITLE is valid
ATLASSERT(lpszText != NULL);
if(m_hWnd == NULL)
{
// set internal state
m_psh.pszCaption = lpszText; // must exist until sheet is created
m_psh.dwFlags &= ~PSH_PROPTITLE;
m_psh.dwFlags |= nStyle;
}
else
{
// set external state
TBase::SetTitle(lpszText, nStyle);
}
}
void SetWizardMode()
{
m_psh.dwFlags |= PSH_WIZARD;
}
void EnableHelp()
{
m_psh.dwFlags |= PSH_HASHELP;
}
// Operations
BOOL AddPage(HPROPSHEETPAGE hPage)
{
ATLASSERT(hPage != NULL);
BOOL bRet = TRUE;
if(m_hWnd != NULL)
TBase::AddPage(hPage);
else // sheet not created yet, use internal data
bRet = m_arrPages.Add((_HPROPSHEETPAGE_TYPE&)hPage);
return bRet;
}
BOOL AddPage(LPCPROPSHEETPAGE pPage)
{
ATLASSERT(pPage != NULL);
HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);
if(hPage == NULL)
return FALSE;
BOOL bRet = AddPage(hPage);
if(!bRet)
::DestroyPropertySheetPage(hPage);
return bRet;
}
BOOL RemovePage(HPROPSHEETPAGE hPage)
{
ATLASSERT(hPage != NULL);
if (m_hWnd == NULL) // not created yet
{
int nPage = GetPageIndex(hPage);
if(nPage == -1)
return FALSE;
return RemovePage(nPage);
}
TBase::RemovePage(hPage);
return TRUE;
}
BOOL RemovePage(int nPageIndex)
{
BOOL bRet = TRUE;
if(m_hWnd != NULL)
TBase::RemovePage(nPageIndex);
else // sheet not created yet, use internal data
bRet = m_arrPages.RemoveAt(nPageIndex);
return bRet;
}
#if (_WIN32_IE >= 0x0400)
void SetHeader(LPCTSTR szbmHeader)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
m_psh.dwFlags &= ~PSH_WIZARD;
m_psh.dwFlags |= (PSH_HEADER | PSH_WIZARD97);
m_psh.pszbmHeader = szbmHeader;
}
void SetHeader(HBITMAP hbmHeader)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
m_psh.dwFlags &= ~PSH_WIZARD;
m_psh.dwFlags |= (PSH_HEADER | PSH_USEHBMHEADER | PSH_WIZARD97);
m_psh.hbmHeader = hbmHeader;
}
void SetWatermark(LPCTSTR szbmWatermark, HPALETTE hplWatermark = NULL)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
m_psh.dwFlags &= ~PSH_WIZARD;
m_psh.dwFlags |= PSH_WATERMARK | PSH_WIZARD97;
m_psh.pszbmWatermark = szbmWatermark;
if (hplWatermark != NULL)
{
m_psh.dwFlags |= PSH_USEHPLWATERMARK;
m_psh.hplWatermark = hplWatermark;
}
}
void SetWatermark(HBITMAP hbmWatermark, HPALETTE hplWatermark = NULL)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
m_psh.dwFlags &= ~PSH_WIZARD;
m_psh.dwFlags |= (PSH_WATERMARK | PSH_USEHBMWATERMARK | PSH_WIZARD97);
m_psh.hbmWatermark = hbmWatermark;
if (hplWatermark != NULL)
{
m_psh.dwFlags |= PSH_USEHPLWATERMARK;
m_psh.hplWatermark = hplWatermark;
}
}
void StretchWatermark(bool bStretchWatermark)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
if (bStretchWatermark)
m_psh.dwFlags |= PSH_STRETCHWATERMARK;
else
m_psh.dwFlags &= ~PSH_STRETCHWATERMARK;
}
#endif
// Message map and handlers
BEGIN_MSG_MAP(CPropertySheetImpl)
MESSAGE_HANDLER(WM_COMMAND, OnCommand)
MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand)
END_MSG_MAP()
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
if(HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) &&
((m_psh.dwFlags & PSH_MODELESS) != 0) && (GetActivePage() == NULL))
DestroyWindow();
return lRet;
}
LRESULT OnSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
if(((m_psh.dwFlags & PSH_MODELESS) == PSH_MODELESS) && ((wParam & 0xFFF0) == SC_CLOSE))
SendMessage(WM_CLOSE);
else
bHandled = FALSE;
return 0;
}
};
// for non-customized sheets
class CPropertySheet : public CPropertySheetImpl<CPropertySheet>
{
public:
CPropertySheet(_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL)
: CPropertySheetImpl<CPropertySheet>(title, uStartPage, hWndParent)
{ }
BEGIN_MSG_MAP(CPropertySheet)
MESSAGE_HANDLER(WM_COMMAND, CPropertySheetImpl<CPropertySheet>::OnCommand)
END_MSG_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// CPropertyPageWindow - client side for a property page
class CPropertyPageWindow : public CWindow
{
public:
// Constructors
CPropertyPageWindow(HWND hWnd = NULL) : CWindow(hWnd) { }
CPropertyPageWindow& operator=(HWND hWnd)
{
m_hWnd = hWnd;
return *this;
}
// Attributes
CPropertySheetWindow GetPropertySheet() const
{
ATLASSERT(::IsWindow(m_hWnd));
return CPropertySheetWindow(GetParent());
}
// Operations
BOOL Apply()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
return GetPropertySheet().Apply();
}
void CancelToClose()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
GetPropertySheet().CancelToClose();
}
void SetModified(BOOL bChanged = TRUE)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
GetPropertySheet().SetModified(m_hWnd, bChanged);
}
LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
return GetPropertySheet().QuerySiblings(wParam, lParam);
}
void RebootSystem()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
GetPropertySheet().RebootSystem();
}
void RestartWindows()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
GetPropertySheet().RestartWindows();
}
void SetWizardButtons(DWORD dwFlags)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(GetParent() != NULL);
GetPropertySheet().SetWizardButtons(dwFlags);
}
// Implementation - overrides to prevent usage
HWND Create(LPCTSTR, HWND, _U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, _U_MENUorID = 0U, LPVOID = NULL)
{
ATLASSERT(FALSE);
return NULL;
}
};
/////////////////////////////////////////////////////////////////////////////
// CPropertyPageImpl - implements a property page
template <class T, class TBase = CPropertyPageWindow>
class ATL_NO_VTABLE CPropertyPageImpl : public CDialogImplBaseT< TBase >
{
public:
PROPSHEETPAGE m_psp;
operator PROPSHEETPAGE*() { return &m_psp; }
// Construction
CPropertyPageImpl(_U_STRINGorID title = (LPCTSTR)NULL)
{
// initialize PROPSHEETPAGE struct
memset(&m_psp, 0, sizeof(PROPSHEETPAGE));
m_psp.dwSize = sizeof(PROPSHEETPAGE);
m_psp.dwFlags = PSP_USECALLBACK;
m_psp.hInstance = _Module.GetResourceInstance();
T* pT = static_cast<T*>(this);
m_psp.pszTemplate = MAKEINTRESOURCE(pT->IDD);
m_psp.pfnDlgProc = (DLGPROC)T::StartDialogProc;
m_psp.pfnCallback = T::PropPageCallback;
m_psp.lParam = (LPARAM)pT;
if(title.m_lpstr != NULL)
SetTitle(title);
}
static UINT CALLBACK PropPageCallback(HWND hWnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
{
hWnd; // avoid level 4 warning
if(uMsg == PSPCB_CREATE)
{
ATLASSERT(hWnd == NULL);
CDialogImplBaseT< TBase >* pPage = (CDialogImplBaseT< TBase >*)(T*)ppsp->lParam;
_Module.AddCreateWndData(&pPage->m_thunk.cd, pPage);
}
return 1;
}
HPROPSHEETPAGE Create()
{
return ::CreatePropertySheetPage(&m_psp);
}
// Attributes
void SetTitle(_U_STRINGorID title)
{
m_psp.pszTitle = title.m_lpstr;
m_psp.dwFlags |= PSP_USETITLE;
}
#if (_WIN32_IE >= 0x0500)
void SetHeaderTitle(LPCTSTR lpstrHeaderTitle)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
m_psp.dwFlags |= PSP_USEHEADERTITLE;
m_psp.pszHeaderTitle = lpstrHeaderTitle;
}
void SetHeaderSubTitle(LPCTSTR lpstrHeaderSubTitle)
{
ATLASSERT(m_hWnd == NULL); // can't do this after it's created
m_psp.dwFlags |= PSP_USEHEADERSUBTITLE;
m_psp.pszHeaderSubTitle = lpstrHeaderSubTitle;
}
#endif //(_WIN32_IE >= 0x0500)
// Operat
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -