1.模态与非模态对话框
模态对话框创建
CTestDlg dlg;
dlg.DoModal();
非模态对话框的创建
CTestDlg *pDlg =new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
这里第一个参数是对话框资源的ID和或话框模板的名称。
第二个参数是对话框的父窗口。
这里需要注意以下几点
1. Create创建非模态对话框要用ShowWindow才会显示出来。
2. 这里用指针是因为要在堆上分配内存,在堆上分配内存是整个程序的生命周期一致的。这样做又会遇到一个问题,当这个函数体结速时,生命周期结束了,指针变量被销毁了。所指向的内存丢失了。
解决方法有两种:
一. 将指针变量声明为类的成员变量。在类的析构函数里,用delete函数释方指向的那块内存。
二. 在CTestDlg中重载PostNcDestory函数,释放this指针指向的内存,delete this;
3. 如果用的是局部变量,在函数结束时会销毁局部变量。CTestDlg 被销毁了当然不会显示出来。还有一种解决方法是声明为类的成员变量。这样生命周期跟类一致。
4. 为什以模态对话框的可以用局部变量呢?这是因为模态对话框的实现机制,在弹出对话框后,创建模态对话框的函数被中止了,模态对话框关闭后,才继续执行创建函数体其它部份。
5. 对于非模态对话框,如果有ID值为IDOK或IDCANCEL的按钮就必须重写OnOK和OnCancel函数,在重写的函数中调用DestoryWindow函数销毁销口。因为基类虚函数OnOk按钮最终调用的EndDialog函数只会隐藏非模态窗口,但会销毁模态窗口。
2.动态创建按钮
知识点:按钮这类消息属于通告消息。
m_btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);
这里需要注意一下如果没有指定WS_VISIBLE随后一定要ShowWindow按钮才会显示出来。
但这样会有一个出现问题,因为用一个按钮动态的创建了另一个按钮后新创建的窗口就会与按钮相关联,已经绑定在一起了,再次创建就会出现问题。如何解决呢?
static BOOL m_bIsCreated=FALSE;//只在第一次分配内存时赋值了,以后都不会重新赋值。
if(m_bIsCreated==FALSE)
{
m_btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);
m_bIsCreated=TRUE;
}