技术文章 > VC无模式对话框

VC无模式对话框

2018-05-22 21:27

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料:
原作者姓名 monkeycd
介绍
在学习的过程中得到了网上很多人的帮助,我也想尽一点自己的绵薄之力。希望对初学者有帮助。本文将阐述无模式对话框的一些特点以及用法,
请大家多多指点。

正文
一、模式与无模式对话框
它们都是由CDialog类派生的,不同在于,当显示一个模式对话框时,WINDOWS禁止了到对话框父窗口的用户输入。相反,当显示一个无模式对话框时,允许用户输入到对话框父窗口。无模式对话框的生成周期要求比较长,一般和父窗口的生成周期相同。
二、无模式对话框的创建。
用无模式对话框时,一般先在父级窗口类中定义一个无模式对话框类的指针,再在父级窗口类的构造函数中或者在菜单命令中动态地为该指针分配空间并显示对话框,最后在父级窗口类的析构函数中释放动态分配的空间。我们可以用两个CDialog::Create()函数的一个来显示对话框。
BOOL Create(LPCTSTR lpszTemlateName,CWnd * pParentWnd=NULL);
BOOL Create(UINT nIDTemplate ,CWnd * pParentWnd=NULL);
三、一个例子
本例通过一个简易的运算器来说明无模式对话框的创建和消亡。
1、 建立工程
建立一个SDI应用程序,加入一个对话框资源,建立CModelessDlg类加入三个文本框,分别为IDC_FIRST,IDC_SECOND,IDC_RESULT,在类中增加成员变量,依次为Float 型的m_first,m_second,m_result再在对话框中加入一个组合框在组合框中加入四个RADIO BUTTON ,属性分别为加,减,乘,初。对加法的那个RADIO设置为GROUP并作为成员变量Int m_add。
2、 设置变量
在视图中构造对话框指针,CModelessDlg * m_pdlg;
在菜单中新建一个菜单项ID 为ID_MODELESS,
在视图中建立菜单的函数。OnModeless();
在对话框中加入按钮为IDC_Calculate
3、 程序实现
程序段如下:
void CModelessView::OnModeless()
{
if(m_pdlg->GetSafeHwnd()==0)//同样的窗体只显示一个
{ // TODO: Add your command handler code here
m_pdlg->Create(IDD_DIALOG2);//创建无模式对话框
}
m_pdlg->ShowWindow(SW_SHOW);
}
双击按钮加入如下代码:
void CModelessDlg::OnCalculate()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_nadd==0)
m_result=m_first+m_second;
if(m_nadd==1)
m_result=m_first-m_second;
if(m_nadd==2)
m_result=m_first*m_second;
if(m_nadd==3)
m_result=m_first/m_second;
UpdateData(FALSE);//保证数据的显示
}
下面是视图的构造函数和析构函数
CModelessView::CModelessView()
{
// TODO: add construction code here
m_pdlg=new CModelessDlg(this);
}
CModelessView::~CModelessView()
{
delete m_pdlg;
}
4、 改进
在无模式对话框中改变OK和CANCEL 按钮和回车,ESC键的联系。
做法如下:
1、 用ClassWizard映射IDOK按钮到OnOk虚函数。
2、 利用对话框编辑器改变OK按钮的ID。并去掉Default Button的复选标记。
3、 用ClassWizard创建一个OnCLICKOk函数。
void CModelessDlg::OnOK()
{
// TODO: Add extra validation here
//空的以达到使回车和OK 分开
}
void CModelessDlg:: OnCLICKOk ()//起到原来的OnOk函数的作用
{
// TODO: Add your control notification handler code here
CDialog::OnOK();
}
同理可以改变Esc和Cancel的结合。
5、
请指点

正文完