模态对话框:运行当前对话框时,程序将会暂停执行,知道我们关闭该模态对话框,此时不能点击非活动的对话框
创建模态对话框 CDialog::DoModal
————————
#include "TestDlg.h"
CTestDlg dlg; //并不知道CTestDlg是什么类,所以必须包含其所在的头文件
dlg.DoModal(); //调用一个模态对话框
模态对话框的关闭:CDialog::EndDialog
非模态对话框的创建 CDialog::Create
————————
CTestDlg dlg;
dlg.Create(IDD_DIALOG1,this); //第二个参数为父窗口的指针,this表示其父窗口为view类
dlg.ShowWindow(SW_SHOW); //DoModal中已经包含了ShowWindow了
————
但此时窗口仍无法显示,因为dlg是一个局部变量,许将其定义为成员变量,或是定义为一个指针,在堆上定义一个内存。
CTestDlg *pDlg=new CTestDlg;
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
————————
当点击Button "Add" 时,在对话框窗口中动态添加一个新的按钮
1. 首先响应"Add"按钮的单击事件,在CW中添加一个函数
先定义一个CButton对象:在CTestDlg类上东键右键添加一个成员变量CButton,Private,再编辑代码
————————
{
m_btn.Create("文本",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123); //参数含义详见MSDN
}
————
此时,再次点击"Add"按钮时,会重复创建窗口,会报错。此时可以:
a) 在CTestDlg中添加一个BOOL型的变量m_bIsCreate来判断是否已经创建窗口,
先在CTestDlg中将m_bIsCreate=FALSE,然后在OnBtnAdd()函数中判断
——
{
if(m_bIsCreate==FALSE)
{
m_btn.Create("文本",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);
m_bIsCreate=TRUE;
}
else
{
m_btn.DestroyWindow();
m_bIsCreate=FALSE;
}
}
——
b) 定义一个局部的变量来判断
——
{
static BOOL bIsCreate=FALSE;
if(bIsCreate==FALSE)
{
m_btn.Create("文本",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);
bIsCreate=TRUE;
}
else
{
m_btn.DestroyWindow();
bIsCreate=FALSE;
}
}
——
c) 最简单的方式:对于从CWnd派生的类,其内部都有一个成员变量m_hWnd,保存了窗口的句柄,当对象和窗口相关联时,句柄有值,当对象没有和任何窗口相关联时,句柄为空。
{
if(!m_btn.m_hWnd) //通过判断其句柄是否有值,来决定是否要创建窗口
{
m_btn.Create("文本",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);
}
else
{
m_btn.DestroyWindow();
}
}