📄 atldlgs.h
字号:
::SendMessage(m_hWnd, PSM_SETTITLE, nStyle, (LPARAM)lpszText);
}
HWND GetTabControl() const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HWND)::SendMessage(m_hWnd, PSM_GETTABCONTROL, 0, 0L);
}
void SetFinishText(LPCTSTR lpszText)
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_SETFINISHTEXT, 0, (LPARAM)lpszText);
}
void SetWizardButtons(DWORD dwFlags)
{
ATLASSERT(::IsWindow(m_hWnd));
::PostMessage(m_hWnd, PSM_SETWIZBUTTONS, 0, dwFlags);
}
// Operations
BOOL AddPage(HPROPSHEETPAGE hPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(hPage != NULL);
return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage);
}
BOOL AddPage(LPCPROPSHEETPAGE pPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(pPage != NULL);
HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);
if(hPage == NULL)
return FALSE;
return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage);
}
#ifndef _WIN32_WCE
BOOL InsertPage(int nNewPageIndex, HPROPSHEETPAGE hPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(hPage != NULL);
return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage);
}
BOOL InsertPage(int nNewPageIndex, LPCPROPSHEETPAGE pPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(pPage != NULL);
HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);
if(hPage == NULL)
return FALSE;
return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage);
}
BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, HPROPSHEETPAGE hPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(hPage != NULL);
return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage);
}
BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, LPCPROPSHEETPAGE pPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(pPage != NULL);
HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);
if(hPage == NULL)
return FALSE;
return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage);
}
#endif //!_WIN32_WCE
void RemovePage(int nPageIndex)
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_REMOVEPAGE, nPageIndex, 0L);
}
void RemovePage(HPROPSHEETPAGE hPage)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(hPage != NULL);
::SendMessage(m_hWnd, PSM_REMOVEPAGE, 0, (LPARAM)hPage);
}
BOOL PressButton(int nButton)
{
ATLASSERT(::IsWindow(m_hWnd));
return (BOOL)::SendMessage(m_hWnd, PSM_PRESSBUTTON, nButton, 0L);
}
BOOL Apply()
{
ATLASSERT(::IsWindow(m_hWnd));
return (BOOL)::SendMessage(m_hWnd, PSM_APPLY, 0, 0L);
}
void CancelToClose()
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_CANCELTOCLOSE, 0, 0L);
}
void SetModified(HWND hWndPage, BOOL bChanged = TRUE)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(::IsWindow(hWndPage));
UINT uMsg = bChanged ? PSM_CHANGED : PSM_UNCHANGED;
::SendMessage(m_hWnd, uMsg, (WPARAM)hWndPage, 0L);
}
LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam)
{
ATLASSERT(::IsWindow(m_hWnd));
return ::SendMessage(m_hWnd, PSM_QUERYSIBLINGS, wParam, lParam);
}
void RebootSystem()
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_REBOOTSYSTEM, 0, 0L);
}
void RestartWindows()
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_RESTARTWINDOWS, 0, 0L);
}
BOOL IsDialogMessage(LPMSG lpMsg)
{
ATLASSERT(::IsWindow(m_hWnd));
return (BOOL)::SendMessage(m_hWnd, PSM_ISDIALOGMESSAGE, 0, (LPARAM)lpMsg);
}
#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
int HwndToIndex(HWND hWnd) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (int)::SendMessage(m_hWnd, PSM_HWNDTOINDEX, (WPARAM)hWnd, 0L);
}
HWND IndexToHwnd(int nIndex) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HWND)::SendMessage(m_hWnd, PSM_INDEXTOHWND, nIndex, 0L);
}
int PageToIndex(HPROPSHEETPAGE hPage) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (int)::SendMessage(m_hWnd, PSM_PAGETOINDEX, 0, (LPARAM)hPage);
}
HPROPSHEETPAGE IndexToPage(int nIndex) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HPROPSHEETPAGE)::SendMessage(m_hWnd, PSM_INDEXTOPAGE, nIndex, 0L);
}
int IdToIndex(int nID) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (int)::SendMessage(m_hWnd, PSM_IDTOINDEX, 0, nID);
}
int IndexToId(int nIndex) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (int)::SendMessage(m_hWnd, PSM_INDEXTOID, nIndex, 0L);
}
int GetResult() const
{
ATLASSERT(::IsWindow(m_hWnd));
return (int)::SendMessage(m_hWnd, PSM_GETRESULT, 0, 0L);
}
BOOL RecalcPageSizes()
{
ATLASSERT(::IsWindow(m_hWnd));
return (BOOL)::SendMessage(m_hWnd, PSM_RECALCPAGESIZES, 0, 0L);
}
void SetHeaderTitle(int nIndex, LPCTSTR lpstrHeaderTitle)
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_SETHEADERTITLE, nIndex, (LPARAM)lpstrHeaderTitle);
}
void SetHeaderSubTitle(int nIndex, LPCTSTR lpstrHeaderSubTitle)
{
ATLASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, PSM_SETHEADERSUBTITLE, nIndex, (LPARAM)lpstrHeaderSubTitle);
}
#endif //(_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)
// Implementation - override to prevent usage
HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_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 ATL::CWindowImplBaseT< TBase >
{
public:
PROPSHEETHEADER m_psh;
ATL::CSimpleArray<_HPROPSHEETPAGE_TYPE> m_arrPages;
// Construction/Destruction
CPropertySheetImpl(ATL::_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;
#if (_ATL_VER >= 0x0700)
m_psh.hInstance = ATL::_AtlBaseModule.GetResourceInstance();
#else //!(_ATL_VER >= 0x0700)
m_psh.hInstance = _Module.GetResourceInstance();
#endif //!(_ATL_VER >= 0x0700)
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);
#if (_ATL_VER >= 0x0700)
T* pT = (T*)ATL::_AtlWinModule.ExtractCreateWndData();
#else //!(_ATL_VER >= 0x0700)
T* pT = (T*)_Module.ExtractCreateWndData();
#endif //!(_ATL_VER >= 0x0700)
// 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);
#if (_ATL_VER >= 0x0700)
ATL::_AtlWinModule.AddCreateWndData(&pT->m_thunk.cd, pT);
#else //!(_ATL_VER >= 0x0700)
_Module.AddCreateWndData(&pT->m_thunk.cd, pT);
#endif //!(_ATL_VER >= 0x0700)
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);
#if (_ATL_VER >= 0x0700)
ATL::_AtlWinModule.AddCreateWndData(&pT->m_thunk.cd, pT);
#else //!(_ATL_VER >= 0x0700)
_Module.AddCreateWndData(&pT->m_thunk.cd, pT);
#endif //!(_ATL_VER >= 0x0700)
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 = FALSE;
if(m_hWnd != NULL)
bRet = 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) && !defined(_WIN32_WCE)
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -