加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2010-08-10 21:26:27)
标签:

vc/mfc

动态

设置

对话框风格

ws_child

ws_popup

ws_overlapped

转换

分类: 软件开发

一般而言,对话框风格的设置有几种方式,以下介绍其中两种。

第一种:

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);

 

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有