内存对话框模板封装类
无需在资源中定义对话框,直接在内存中定义对话框资源,主要用于简单的对话框,例如网页向导对话框...
完整的封装类在最后面,下面是使用示例:
Example
//==========================================================================
// 概述:
// CDlgUserLogin 管理用户登陆网页的内存模板对话框
//==========================================================================
class CDlgUserLogin : public CDHtmlDialogT< DialogTraitsResizeT< 400 , 240 > >
{ }
//==========================================================================
// 概述:
// CDlgUserLogin 管理用户登陆网页的内存模板对话框
//==========================================================================
class CDlgUserLogin : public CDHtmlDialogT< DialogTraitsResizeT< 400 , 240 > >
{ }
完整的封装类文件如下:
DlgTemplate.h
//==================================================================================================
// 基于内存对话框模板的对话框模板
// --------------------------------------------------------------------------------------------
// <1> 出现下列情况你可以使用该文件定义的模板:
// 1) 对话框很简单,该对话框上没有任何预设的控件
// 2) 使用对话框仅仅是作为一个模式窗口使用
// 3) 为了使用一个类,但该类只能放在对话框中
//
// <2> 使用这些模板类需要注意的事情:
// 1) 对话框的标题需要在继承类的适当函数里进行设置
// 2) 网页对话框的标题从网页中获取,即使用网页的 <TITLE></TITLE>
//
// --------------------------------------------------------------------------------------------
// 上海欣能信息科技发展有限公司 王志科 2008-10-31
//==================================================================================================
#ifndef __SHINE_ENERGY_TECHNOLOGY_GRAPHICS_PLATFORM_SOFTWARE_GROUP_MEMORY_DIALOG_TEMPLATE_DECLARES__
#define __SHINE_ENERGY_TECHNOLOGY_GRAPHICS_PLATFORM_SOFTWARE_GROUP_MEMORY_DIALOG_TEMPLATE_DECLARES__
#pragma once
//==================================================================================================
// 内存对话框模板类的特征定义类,该类作为内存对话框特征的模板参数
template< SHORT Width, SHORT Height, DWORD Style, DWORD ExStyle, SHORT FontSize > struct DialogTraitsT
{
enum ETraits{ WIDTH = Width, HEIGHT = Height, STYLE = Style, EX_STYLE = ExStyle, FONT_SIZE = FontSize };
};
//==================================================================================================
// 定义对话框模板的常用风格
CONST DWORD DS_POPUP_DIALOG = WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_MODALFRAME ;
CONST DWORD DS_POPUP_RESIZE = WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT | WS_THICKFRAME ;
CONST DWORD DS_CHILD_WINDOW = WS_CHILD | WS_VISIBLE | WS_TABSTOP | DS_SETFONT ;
//==================================================================================================
// 定义对话框模板的系统字体和标准大小
CONST WCHAR DLG_FONT_NAME[] = { L"MS Shell Dlg" };
CONST SHORT DLG_FONT_SIZE = 8 ;
//==================================================================================================
// 定义对话框模板的常用特征:不可调整大小的对话框,一般作为模态对话框使用
template< SHORT Width = 360 , SHORT Height = 240 , DWORD ExStyle = 0 , SHORT FontSize = DLG_FONT_SIZE >
struct DialogTraitsDefaultT : public DialogTraitsT< Width, Height, DS_POPUP_DIALOG, ExStyle, FontSize >
{
};
//==================================================================================================
// 定义对话框模板的常用特征:可调整大小的对话框
template< SHORT Width = 360 , SHORT Height = 240 , DWORD ExStyle = 0 , SHORT FontSize = DLG_FONT_SIZE >
struct DialogTraitsResizeT : public DialogTraitsT< Width, Height, DS_POPUP_RESIZE, ExStyle, FontSize >
{
};
//==================================================================================================
// 定义对话框模板的常用特征:子窗口,将对话框作为子窗口创建到其他窗口内部
template< SHORT Width = 360 , SHORT Height = 240 , DWORD ExStyle = 0 , SHORT FontSize = DLG_FONT_SIZE >
struct DialogTraitsWindowT : public DialogTraitsT< Width, Height, DS_CHILD_WINDOW, ExStyle, FontSize >
{
};
//==================================================================================================
// 内存对话框模板类,定义无标题内存模板
template< typename DialogTraitsT > class CDialogTemplateT : public DLGTEMPLATE
{
public:
CDialogTemplateT( )
{
cdit = x = y = 0;
wMenu = wClass = wTitle = 0;
wcscpy( szFontName , DLG_FONT_NAME );
wFontSize = DialogTraitsT::FONT_SIZE;
dwExtendedStyle = DialogTraitsT::EX_STYLE;
style = DialogTraitsT::STYLE;
cy = DialogTraitsT::HEIGHT;
cx = DialogTraitsT::WIDTH;
}
private:
// 没有菜单,默认模板窗口类,无标题,系统标准字体
WORD wMenu, wClass, wTitle, wFontSize;
WCHAR szFontName[ sizeof( DLG_FONT_NAME ) ];
};
//==================================================================================================
// 声明对话框模板函数的宏定义
#define DECLARE_DIALOG_TEMPLATE( DialogTraitsT ) \
static LPCDLGTEMPLATE GetDialogTemplate( ) \
{ \
static CDialogTemplateT< DialogTraitsT > dlgTemplate; \
return static_cast< LPCDLGTEMPLATE >( & dlgTemplate ); \
}
//==================================================================================================
// 声明非模式对话框的创建函数:可以创建基于内存模板的非模式对话框
#define DECLARE_DIALOG_CREATE_MODELESS( ) \
virtual BOOL Create( CWnd* pParentWnd = NULL ) \
{ \
return CreateIndirect( GetDialogTemplate() , pParentWnd ); \
}
//==================================================================================================
// 声明对话框的大小信息处理函数:可以限制对话框的最小尺寸为模板定义尺寸
#define DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT ) \
afx_msg void OnGetMinMaxInfo( MINMAXINFO* lpMMI /* != NULL */ ) \
{ \
CRect rcTrack( 0 , 0 , DialogTraitsT::WIDTH , DialogTraitsT::HEIGHT ); \
MapDialogRect( rcTrack ); CalcWindowRect( rcTrack ); \
lpMMI->ptMinTrackSize.y = rcTrack.Height(); \
lpMMI->ptMinTrackSize.x = rcTrack.Width(); \
}
//==================================================================================================
// 基于内存模板的对话框模板定义
template< typename DialogTraitsT = DialogTraitsDefaultT<> > class CDialogT : public CDialog
{
public:
typedef CDialogT< DialogTraitsT > FatherT;
DECLARE_DIALOG_TEMPLATE( DialogTraitsT );
public:
CDialogT( CWnd *pParentWnd = NULL ) : CDialog( UINT(0) , pParentWnd )
{
InitModalIndirect( GetDialogTemplate() , pParentWnd );
}
public:
DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT );
DECLARE_DIALOG_CREATE_MODELESS( );
DECLARE_MESSAGE_MAP()
};
BEGIN_TEMPLATE_MESSAGE_MAP( CDialogT , DialogTraitsT , CDialog )
ON_WM_GETMINMAXINFO( )
END_MESSAGE_MAP()
//==================================================================================================
// 声明网页对话框的构造函数:整形数值资源
#define DECLARE_HTML_DIALOG_CONSTRUCTOR_INT_RES( DialogT , Dialog ) \
DialogT( UINT nHtmlResID = 0 , CWnd *pParentWnd = NULL ) \
: Dialog( NULL , nHtmlResID , pParentWnd ) \
{ \
InitModalIndirect( GetDialogTemplate( ) , pParentWnd ); /* 使用内存模板 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_NO3DOUTERBORDER ; /* 消除浏览器内部的凹框 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_THEME ; /* 使用系统的桌面主题风格 */ \
m_bUseHtmlTitle = TRUE ; /* 使用网页标题作为对话框标题 */ \
}
//==================================================================================================
// 声明网页对话框的构造函数:字符串资源
#define DECLARE_HTML_DIALOG_CONSTRUCTOR_STR_RES( DialogT , Dialog ) \
DialogT( LPCTSTR szHtmlResID , CWnd *pParentWnd = NULL ) \
: Dialog( NULL , szHtmlResID , pParentWnd ) \
{ \
InitModalIndirect( GetDialogTemplate( ) , pParentWnd ); /* 使用内存模板 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_NO3DOUTERBORDER ; /* 消除浏览器内部的凹框 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_THEME ; /* 使用系统的桌面主题风格 */ \
m_bUseHtmlTitle = TRUE ; /* 使用网页标题作为对话框标题 */ \
}
//==================================================================================================
// 声明网页对话框的构造函数:整形数值和字符串资源
#define DECLARE_HTML_DIALOG_CONSTRUCTOR( DialogT , Dialog ) \
DECLARE_HTML_DIALOG_CONSTRUCTOR_INT_RES( DialogT , Dialog ) \
DECLARE_HTML_DIALOG_CONSTRUCTOR_STR_RES( DialogT , Dialog )
//==================================================================================================
// 声明网页对话框可以使用外部接口并且该接口安全
#define DECLARE_EXTERNAL_DISPATCH_CAN_ACCESS_AND_SAFE( ) \
virtual BOOL IsExternalDispatchSafe( ) { return TRUE; } \
virtual BOOL CanAccessExternal( ){ return TRUE; }
//==================================================================================================
// 基于内存模板的动态网页对话框模板定义:单页面网页对话框
template< typename DialogTraitsT = DialogTraitsResizeT< > > class CDHtmlDialogT : public CDHtmlDialog
{
public:
typedef CDHtmlDialogT< DialogTraitsT > FatherT;
DECLARE_DIALOG_TEMPLATE( DialogTraitsT );
public:
// 声明构造函数并保证使用外部控件时不提示安全控制消息
DECLARE_HTML_DIALOG_CONSTRUCTOR( CDHtmlDialogT , CDHtmlDialog );
DECLARE_EXTERNAL_DISPATCH_CAN_ACCESS_AND_SAFE( );
public:
DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT );
DECLARE_DIALOG_CREATE_MODELESS( );
DECLARE_MESSAGE_MAP( )
};
BEGIN_TEMPLATE_MESSAGE_MAP( CDHtmlDialogT , DialogTraitsT , CDHtmlDialog )
ON_WM_GETMINMAXINFO( )
END_MESSAGE_MAP()
//==================================================================================================
// 基于内存模板的动态网页对话框模板定义:单页面网页对话框
template< typename DialogTraitsT = DialogTraitsResizeT< 480 , 360 > >
class CMultiPageDHtmlDialogT : public CMultiPageDHtmlDialog
{
public:
typedef CMultiPageDHtmlDialogT< DialogTraitsT > FatherT;
DECLARE_DIALOG_TEMPLATE( DialogTraitsT );
public:
// 声明构造函数并保证使用外部控件时不提示安全控制消息
DECLARE_HTML_DIALOG_CONSTRUCTOR( CMultiPageDHtmlDialogT , CMultiPageDHtmlDialog );
DECLARE_EXTERNAL_DISPATCH_CAN_ACCESS_AND_SAFE( );
public:
DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT );
DECLARE_DIALOG_CREATE_MODELESS( );
DECLARE_MESSAGE_MAP( )
};
BEGIN_TEMPLATE_MESSAGE_MAP( CMultiPageDHtmlDialogT , DialogTraitsT , CMultiPageDHtmlDialog )
ON_WM_GETMINMAXINFO( )
END_MESSAGE_MAP()
#endif//__SHINE_ENERGY_TECHNOLOGY_GRAPHICS_PLATFORM_SOFTWARE_GROUP_MEMORY_DIALOG_TEMPLATE_DECLARES__
//==================================================================================================
// 基于内存对话框模板的对话框模板
// --------------------------------------------------------------------------------------------
// <1> 出现下列情况你可以使用该文件定义的模板:
// 1) 对话框很简单,该对话框上没有任何预设的控件
// 2) 使用对话框仅仅是作为一个模式窗口使用
// 3) 为了使用一个类,但该类只能放在对话框中
//
// <2> 使用这些模板类需要注意的事情:
// 1) 对话框的标题需要在继承类的适当函数里进行设置
// 2) 网页对话框的标题从网页中获取,即使用网页的 <TITLE></TITLE>
//
// --------------------------------------------------------------------------------------------
// 上海欣能信息科技发展有限公司 王志科 2008-10-31
//==================================================================================================
#ifndef __SHINE_ENERGY_TECHNOLOGY_GRAPHICS_PLATFORM_SOFTWARE_GROUP_MEMORY_DIALOG_TEMPLATE_DECLARES__
#define __SHINE_ENERGY_TECHNOLOGY_GRAPHICS_PLATFORM_SOFTWARE_GROUP_MEMORY_DIALOG_TEMPLATE_DECLARES__
#pragma once
//==================================================================================================
// 内存对话框模板类的特征定义类,该类作为内存对话框特征的模板参数
template< SHORT Width, SHORT Height, DWORD Style, DWORD ExStyle, SHORT FontSize > struct DialogTraitsT
{
enum ETraits{ WIDTH = Width, HEIGHT = Height, STYLE = Style, EX_STYLE = ExStyle, FONT_SIZE = FontSize };
};
//==================================================================================================
// 定义对话框模板的常用风格
CONST DWORD DS_POPUP_DIALOG = WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_MODALFRAME ;
CONST DWORD DS_POPUP_RESIZE = WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT | WS_THICKFRAME ;
CONST DWORD DS_CHILD_WINDOW = WS_CHILD | WS_VISIBLE | WS_TABSTOP | DS_SETFONT ;
//==================================================================================================
// 定义对话框模板的系统字体和标准大小
CONST WCHAR DLG_FONT_NAME[] = { L"MS Shell Dlg" };
CONST SHORT DLG_FONT_SIZE = 8 ;
//==================================================================================================
// 定义对话框模板的常用特征:不可调整大小的对话框,一般作为模态对话框使用
template< SHORT Width = 360 , SHORT Height = 240 , DWORD ExStyle = 0 , SHORT FontSize = DLG_FONT_SIZE >
struct DialogTraitsDefaultT : public DialogTraitsT< Width, Height, DS_POPUP_DIALOG, ExStyle, FontSize >
{
};
//==================================================================================================
// 定义对话框模板的常用特征:可调整大小的对话框
template< SHORT Width = 360 , SHORT Height = 240 , DWORD ExStyle = 0 , SHORT FontSize = DLG_FONT_SIZE >
struct DialogTraitsResizeT : public DialogTraitsT< Width, Height, DS_POPUP_RESIZE, ExStyle, FontSize >
{
};
//==================================================================================================
// 定义对话框模板的常用特征:子窗口,将对话框作为子窗口创建到其他窗口内部
template< SHORT Width = 360 , SHORT Height = 240 , DWORD ExStyle = 0 , SHORT FontSize = DLG_FONT_SIZE >
struct DialogTraitsWindowT : public DialogTraitsT< Width, Height, DS_CHILD_WINDOW, ExStyle, FontSize >
{
};
//==================================================================================================
// 内存对话框模板类,定义无标题内存模板
template< typename DialogTraitsT > class CDialogTemplateT : public DLGTEMPLATE
{
public:
CDialogTemplateT( )
{
cdit = x = y = 0;
wMenu = wClass = wTitle = 0;
wcscpy( szFontName , DLG_FONT_NAME );
wFontSize = DialogTraitsT::FONT_SIZE;
dwExtendedStyle = DialogTraitsT::EX_STYLE;
style = DialogTraitsT::STYLE;
cy = DialogTraitsT::HEIGHT;
cx = DialogTraitsT::WIDTH;
}
private:
// 没有菜单,默认模板窗口类,无标题,系统标准字体
WORD wMenu, wClass, wTitle, wFontSize;
WCHAR szFontName[ sizeof( DLG_FONT_NAME ) ];
};
//==================================================================================================
// 声明对话框模板函数的宏定义
#define DECLARE_DIALOG_TEMPLATE( DialogTraitsT ) \
static LPCDLGTEMPLATE GetDialogTemplate( ) \
{ \
static CDialogTemplateT< DialogTraitsT > dlgTemplate; \
return static_cast< LPCDLGTEMPLATE >( & dlgTemplate ); \
}
//==================================================================================================
// 声明非模式对话框的创建函数:可以创建基于内存模板的非模式对话框
#define DECLARE_DIALOG_CREATE_MODELESS( ) \
virtual BOOL Create( CWnd* pParentWnd = NULL ) \
{ \
return CreateIndirect( GetDialogTemplate() , pParentWnd ); \
}
//==================================================================================================
// 声明对话框的大小信息处理函数:可以限制对话框的最小尺寸为模板定义尺寸
#define DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT ) \
afx_msg void OnGetMinMaxInfo( MINMAXINFO* lpMMI /* != NULL */ ) \
{ \
CRect rcTrack( 0 , 0 , DialogTraitsT::WIDTH , DialogTraitsT::HEIGHT ); \
MapDialogRect( rcTrack ); CalcWindowRect( rcTrack ); \
lpMMI->ptMinTrackSize.y = rcTrack.Height(); \
lpMMI->ptMinTrackSize.x = rcTrack.Width(); \
}
//==================================================================================================
// 基于内存模板的对话框模板定义
template< typename DialogTraitsT = DialogTraitsDefaultT<> > class CDialogT : public CDialog
{
public:
typedef CDialogT< DialogTraitsT > FatherT;
DECLARE_DIALOG_TEMPLATE( DialogTraitsT );
public:
CDialogT( CWnd *pParentWnd = NULL ) : CDialog( UINT(0) , pParentWnd )
{
InitModalIndirect( GetDialogTemplate() , pParentWnd );
}
public:
DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT );
DECLARE_DIALOG_CREATE_MODELESS( );
DECLARE_MESSAGE_MAP()
};
BEGIN_TEMPLATE_MESSAGE_MAP( CDialogT , DialogTraitsT , CDialog )
ON_WM_GETMINMAXINFO( )
END_MESSAGE_MAP()
//==================================================================================================
// 声明网页对话框的构造函数:整形数值资源
#define DECLARE_HTML_DIALOG_CONSTRUCTOR_INT_RES( DialogT , Dialog ) \
DialogT( UINT nHtmlResID = 0 , CWnd *pParentWnd = NULL ) \
: Dialog( NULL , nHtmlResID , pParentWnd ) \
{ \
InitModalIndirect( GetDialogTemplate( ) , pParentWnd ); /* 使用内存模板 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_NO3DOUTERBORDER ; /* 消除浏览器内部的凹框 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_THEME ; /* 使用系统的桌面主题风格 */ \
m_bUseHtmlTitle = TRUE ; /* 使用网页标题作为对话框标题 */ \
}
//==================================================================================================
// 声明网页对话框的构造函数:字符串资源
#define DECLARE_HTML_DIALOG_CONSTRUCTOR_STR_RES( DialogT , Dialog ) \
DialogT( LPCTSTR szHtmlResID , CWnd *pParentWnd = NULL ) \
: Dialog( NULL , szHtmlResID , pParentWnd ) \
{ \
InitModalIndirect( GetDialogTemplate( ) , pParentWnd ); /* 使用内存模板 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_NO3DOUTERBORDER ; /* 消除浏览器内部的凹框 */ \
m_dwHostFlags |= DOCHOSTUIFLAG_THEME ; /* 使用系统的桌面主题风格 */ \
m_bUseHtmlTitle = TRUE ; /* 使用网页标题作为对话框标题 */ \
}
//==================================================================================================
// 声明网页对话框的构造函数:整形数值和字符串资源
#define DECLARE_HTML_DIALOG_CONSTRUCTOR( DialogT , Dialog ) \
DECLARE_HTML_DIALOG_CONSTRUCTOR_INT_RES( DialogT , Dialog ) \
DECLARE_HTML_DIALOG_CONSTRUCTOR_STR_RES( DialogT , Dialog )
//==================================================================================================
// 声明网页对话框可以使用外部接口并且该接口安全
#define DECLARE_EXTERNAL_DISPATCH_CAN_ACCESS_AND_SAFE( ) \
virtual BOOL IsExternalDispatchSafe( ) { return TRUE; } \
virtual BOOL CanAccessExternal( ){ return TRUE; }
//==================================================================================================
// 基于内存模板的动态网页对话框模板定义:单页面网页对话框
template< typename DialogTraitsT = DialogTraitsResizeT< > > class CDHtmlDialogT : public CDHtmlDialog
{
public:
typedef CDHtmlDialogT< DialogTraitsT > FatherT;
DECLARE_DIALOG_TEMPLATE( DialogTraitsT );
public:
// 声明构造函数并保证使用外部控件时不提示安全控制消息
DECLARE_HTML_DIALOG_CONSTRUCTOR( CDHtmlDialogT , CDHtmlDialog );
DECLARE_EXTERNAL_DISPATCH_CAN_ACCESS_AND_SAFE( );
public:
DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT );
DECLARE_DIALOG_CREATE_MODELESS( );
DECLARE_MESSAGE_MAP( )
};
BEGIN_TEMPLATE_MESSAGE_MAP( CDHtmlDialogT , DialogTraitsT , CDHtmlDialog )
ON_WM_GETMINMAXINFO( )
END_MESSAGE_MAP()
//==================================================================================================
// 基于内存模板的动态网页对话框模板定义:单页面网页对话框
template< typename DialogTraitsT = DialogTraitsResizeT< 480 , 360 > >
class CMultiPageDHtmlDialogT : public CMultiPageDHtmlDialog
{
public:
typedef CMultiPageDHtmlDialogT< DialogTraitsT > FatherT;
DECLARE_DIALOG_TEMPLATE( DialogTraitsT );
public:
// 声明构造函数并保证使用外部控件时不提示安全控制消息
DECLARE_HTML_DIALOG_CONSTRUCTOR( CMultiPageDHtmlDialogT , CMultiPageDHtmlDialog );
DECLARE_EXTERNAL_DISPATCH_CAN_ACCESS_AND_SAFE( );
public:
DECLARE_MIN_MAX_INFO_MESSAGE( DialogTraitsT );
DECLARE_DIALOG_CREATE_MODELESS( );
DECLARE_MESSAGE_MAP( )
};
BEGIN_TEMPLATE_MESSAGE_MAP( CMultiPageDHtmlDialogT , DialogTraitsT , CMultiPageDHtmlDialog )
ON_WM_GETMINMAXINFO( )
END_MESSAGE_MAP()
#endif//__SHINE_ENERGY_TECHNOLOGY_GRAPHICS_PLATFORM_SOFTWARE_GROUP_MEMORY_DIALOG_TEMPLATE_DECLARES__