新浪博客

VC/MFC 动态设置(创建)对话框的风格

2010-08-10 21:26阅读:
一般而言,对话框风格的设置有几种方式,以下介绍其中两种。
第一种:
CWnd::ModifyStyle();或者 CWnd::ModifyStyleEx();
不过笔者发现,当WS_POPUP类型的对话框创建成功后,使用ModifyStyle(WS_POPUP,WS_CHILD)的效果不尽如人意,所以如果要实现对话框基本风格的改变,可采用以下第二种方法来实现对话框风格的动态设置(创建)。

以下是动态设置对话框风格的测试代码,可实现WS_CHILD,WS_POPUP和OVERLAPPED风格的相互转换。
/// 自定义的对话框风格--Added by 华仔103 2010-08-10
enum WINDOW_STYLE
{
/// WS_POPUP对话框风格
WS_POPUP_WIN,
/// WS_CHILD对话框风格
WS_CHILD_WIN,
/// OVERLAPPED对话框风格
WS_OVERLAPPED_WIN,
};

/// 对话框测试类DlgtextDlg.h--Added by 华仔103 2010-08-10
#define BASE_TEXT_DLG CDialog
class CDlgtextDlg : public BASE_TEXT_DLG
{
public:
/// 标准的构造函数
CDlgtextDlg(CWnd* pParent = NULL);
/// 重载构造函数
CDlgtextDlg(WINDOW_STYLE nWindowStyle,CWnd* pParent = NULL);
/// 设置窗口类型
void SetWindowStyle(WINDOW_STYLE nWindowStyle);
/// 资源ID值
enum { IDD = IDD_DLGTEXT_DIALOG };
protected:
WINDOW_STYLE m_nWindowSyle;///< 对话框类型值,默认为WS_POPUP_WIN
};

/// 对话框测试类DlgtextDlg.cpp--Added by 华仔103 2010-08-10
#include 'DlgtextDlg.h'
/// 默认构造函数
CDlgtextDlg::CDlgtextDlg(CWnd* pParent )
: BASE_TEXT_DLG(CDlgtextDlg::IDD, pParent)
, m_nWindowSyle(WS_POPUP_WIN)
{
}
/// 重载构造函数
CDlgtextDlg::CDlgtextDlg(WINDOW_STYLE nWindowStyle,CWnd* pParent )
{
CDlgtextDlg::CDlgtextDlg(pParent);
m_nWindowSyle = nWindowStyle;
}
/// 设置窗口类型
void CDlgtextDlg::SetWindowStyle(WINDOW_STYLE nWindowStyle)
{
m_nWindowSyle = nWindowStyle;
}
/// 重载基类的PreCreateWindow函数,实现对话框风格的自定义
BOOL CDlgtextDlg::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
switch(m_nWindowSyle)
{
case WS_POPUP_WIN:
{
cs.style &= ~WS_CHILD;/// 删除WS_CHILD风格
cs.style &= ~WS_OVERLAPPED;/// 删除WS_OVERLAPPED风格
cs.style |= WS_POPUP;/// 使用WS_POPUP风格
}
break;
case WS_CHILD_WIN:
{
cs.style &= ~WS_POPUP;/// 删除WS_POPUP风格
cs.style &= ~WS_OVERLAPPED;/// 删除WS_OVERLAPPED风格
cs.style |= WS_CHILD;/// 使用WS_CHILD风格
}
break;
case WS_OVERLAPPED_WIN:
{
cs.style &= ~WS_CHILD;/// 删除WS_CHILD风格
cs.style &= ~WS_POPUP;/// 删除WS_POPUP风格
cs.style |= WS_OVERLAPPED;/// 使用WS_OVERLAPPED风格
}
break;
default: ;
}
/// 根据设置的风格准备创建对话框
return BASE_TEXT_DLG::PreCreateWindow(cs);
}

调用方式一:
#include 'DlgtextDlg.h'
static CDlgtextDlg s_textDlg(WS_CHILD_WIN);
s_textDlg.Create(CDlgtextDlg::IDD);
CWnd* pParent = NULL;/// 传入你所需要的父窗口
s_textDlg.SetParent(pParent);

调用方式二:
#include 'DlgtextDlg.h'
CDlgtextDlg m_textDlg;
/// 设置对话框风格
m_textDlg.SetWindowStyle(WS_CHILD_WIN);
/// 创建非模态对话框
m_textDlg.Create(CDlgtextDlg::IDD);
CWnd* pParent = NULL;/// 传入你所需要的父窗口
m_textDlg.SetParent(pParent);

/// 其他类型的对话框风格可举一反三。

我的更多文章

下载客户端阅读体验更佳

APP专享