📄 dynamicdialogtemplate.h
字号:
dialogItemSize.x, dialogItemSize.y, dialogItemSize.cx, dialogItemSize.cy,
id,
text, text ? ::lstrlenW(text) + 1 : 0,
classString, classString ? ::lstrlenW(classString) + 1 : 0);
}
bool AddControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text,
ClassAtom atom)
{
const long classAtomWordCount = 2;
WORD classAtom[classAtomWordCount] = {0xFFFF, (WORD)atom};
return this->AddControl(style, dwExtendedStyle,
x, y, cx, cy,
id,
text, text ? ::lstrlenW(text) + 1 : 0,
(const wchar_t*)classAtom, classAtomWordCount);
}
bool AddControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text,
ClassAtom atom)
{
const long classAtomWordCount = 2;
WORD classAtom[classAtomWordCount] = {0xFFFF, (WORD)atom};
return this->AddControl(style, dwExtendedStyle,
dialogItemSize.x, dialogItemSize.y, dialogItemSize.cx, dialogItemSize.cy,
id,
text, text ? ::lstrlenW(text) + 1 : 0,
(const wchar_t*)classAtom, classAtomWordCount);
}
bool AddButtonControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, x, y, cx, cy,
id, text, eClassAtom_Button);
}
bool AddButtonControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, dialogItemSize,
id, text, eClassAtom_Button);
}
bool AddEditControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, x, y, cx, cy,
id, text, eClassAtom_Edit);
}
bool AddEditControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, dialogItemSize,
id, text, eClassAtom_Edit);
}
bool AddStaticControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, x, y, cx, cy,
id, text, eClassAtom_Static);
}
bool AddStaticControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, dialogItemSize,
id, text, eClassAtom_Static);
}
bool AddListBoxControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, x, y, cx, cy,
id, text, eClassAtom_ListBox);
}
bool AddListBoxControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, dialogItemSize,
id, text, eClassAtom_ListBox);
}
bool AddScrollBarControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, x, y, cx, cy,
id, text, eClassAtom_ScrollBar);
}
bool AddScrollBarControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, dialogItemSize,
id, text, eClassAtom_ScrollBar);
}
bool AddComboBoxControl(
DWORD style, DWORD dwExtendedStyle,
short x, short y, short cx, short cy,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, x, y, cx, cy,
id, text, eClassAtom_ComboBox);
}
bool AddComboBoxControl(
DWORD style, DWORD dwExtendedStyle,
const DynamicDialogItemSize dialogItemSize,
WORD id, const wchar_t* text)
{
return this->AddControl(style, dwExtendedStyle, dialogItemSize,
id, text, eClassAtom_ComboBox);
}
};
class CDynamicDialogExTemplate
{
};
// CDynamicDialogImpl is just like CDialogImpl, but it uses CDynamicDialogTemplate, and
// DialogBoxIndirectParam instead of DialogBoxParam and
// CreateDialogIndirectParam instead of CreateDialogParam
#if (_ATL_VER >= 0x0700)
// Important! If ATL::CDialogImpl ever changes, reflect those changes here.
// We don't inherit from CDialogImpl at all and completely duplicate (and
// appropriately modify) everything it does.
template <class T, class TBase = ATL::CWindow, class TDynamicDialogTemplate = CDynamicDialogTemplate>
class ATL_NO_VTABLE CDynamicDialogImpl : public ATL::CDialogImplBaseT< TBase >
{
protected:
TDynamicDialogTemplate m_dynamicDialogTemplate;
// Overrideables
public:
// You always need to override ConstructDialogResource
//bool ConstructDialogResource(void) { }
public:
#ifdef _DEBUG
bool m_bModal;
CDynamicDialogImpl() : m_bModal(false) { }
#endif //_DEBUG
// modal dialogs
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL)
{
ATLASSERT(m_hWnd == NULL);
T* pT = static_cast<T*>(this);
pT->ConstructDialogResource();
ATLASSERT((bool)m_dynamicDialogTemplate);
_AtlWinModule.AddCreateWndData(&m_thunk.cd, (ATL::CDialogImplBaseT< TBase >*)this);
#ifdef _DEBUG
m_bModal = true;
#endif //_DEBUG
//return ::DialogBoxParam(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(static_cast<T*>(this)->IDD),
// hWndParent, T::StartDialogProc, dwInitParam);
return ::DialogBoxIndirectParam(_AtlBaseModule.GetResourceInstance(), m_dynamicDialogTemplate,
hWndParent, T::StartDialogProc, dwInitParam);
}
BOOL EndDialog(int nRetCode)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(m_bModal); // must be a modal dialog
return ::EndDialog(m_hWnd, nRetCode);
}
// modeless dialogs
HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL)
{
ATLASSERT(m_hWnd == NULL);
T* pT = static_cast<T*>(this);
pT->ConstructDialogResource();
ATLASSERT((bool)m_dynamicDialogTemplate);
_AtlWinModule.AddCreateWndData(&m_thunk.cd, (ATL::CDialogImplBaseT< TBase >*)this);
#ifdef _DEBUG
m_bModal = false;
#endif //_DEBUG
//HWND hWnd = ::CreateDialogParam(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(static_cast<T*>(this)->IDD),
// hWndParent, T::StartDialogProc, dwInitParam);
HWND hWnd = ::CreateDialogIndirectParam(_AtlBaseModule.GetResourceInstance(), m_dynamicDialogTemplate,
hWndParent, T::StartDialogProc, dwInitParam);
ATLASSERT(m_hWnd == hWnd);
return hWnd;
}
// for CComControl
HWND Create(HWND hWndParent, RECT&, LPARAM dwInitParam = NULL)
{
return Create(hWndParent, dwInitParam);
}
BOOL DestroyWindow()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(!m_bModal); // must not be a modal dialog
return ::DestroyWindow(m_hWnd);
}
};
#endif // (_ATL_VER >= 0x0700)
// CDynamicPropertyPageImpl inherits from CPropertyPageImpl, but it uses CDynamicDialogTemplate
// to construct an in-memory dialog resource (instead of using a dialog template whose resource
// identifier is aliased by "IDD" in the derived class). This in-memory dialog resource is created
// either during a "Create" call, or when there's an implicit or explict cast to PROPSHEETPAGE*
// (such as when "AddPage" is called on the sheet with the page as the argument).
template <class T, class TBase = WTL::CPropertyPageWindow, class TDynamicDialogTemplate = CDynamicDialogTemplate>
class ATL_NO_VTABLE CDynamicPropertyPageImpl : public WTL::CPropertyPageImpl< T, TBase >
{
protected:
typedef WTL::CPropertyPageImpl< T, TBase > baseClass;
protected:
bool m_dialogResourceInitialized;
TDynamicDialogTemplate m_dynamicDialogTemplate;
// Constructors
public:
CDynamicPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) :
baseClass(title),
m_dialogResourceInitialized(false)
{
// We do this after the constructor but before
// the property page is created.
//T* pT = static_cast<T*>(this);
//pT->ConstructDialogResource();
//m_psp.dwFlags |= PSP_DLGINDIRECT;
//m_psp.pResource = m_dynamicDialogTemplate;
}
// Enumerations
public:
// Since we're going to provide the dialog template dynamically,
// have IDD be 0. We're still going to inherit from CPropertyPageImpl
// so this will be used in its constructor (but we'll change things
// in InitializeDialogResource so "pResource" is used instead of "pszTemplate").
enum { IDD = 0 };
// CPropertyPageImpl Overrides:
public:
// This Create() isn't called by WTL at all, but just in case someone else
// calls it, we need to override it to ensure the dialog resource is initialized.
HPROPSHEETPAGE Create()
{
T* pT = static_cast<T*>(this);
pT->InitializeDialogResource();
return baseClass::Create();
}
public:
// We'll do a post-constructor construction by overriding the
// operator PROPSHEETPAGE*(), and calling "ConstructDialogResource"
// which is overrideable. This should get called when you do
// "AddPage", "InsertPage", . The reason we need ConstructDialogResource
// to be called outside of the constructor is because we want it
// to be overrideable, and have the version in the most derived class called.
// In the case of a normal dialog, we can override DoModal and Create.
// However, with a property page, those functions don't get called
// (they do get called by the sheet though, so something might be added
// there to call some kind of "FinalConstruct" like with COM).
//operator PROPSHEETPAGE*() { return &m_psp; }
operator PROPSHEETPAGE*()
{
T* pT = static_cast<T*>(this);
pT->InitializeDialogResource();
return baseClass::operator PROPSHEETPAGE*();
}
// Overrideables
public:
// You always need to override ConstructDialogResource
//bool ConstructDialogResource(void) { }
void InitializeDialogResource(void)
{
if(!m_dialogResourceInitialized)
{
m_dialogResourceInitialized = true;
T* pT = static_cast<T*>(this);
if(pT->ConstructDialogResource())
{
m_psp.dwFlags |= PSP_DLGINDIRECT;
m_psp.pResource = m_dynamicDialogTemplate;
}
}
}
};
}; // namespace DynamicDialog
#endif //__DynamicDialogTemplate_h__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -