|
要创建非模态对话框,侧需要利用CDialog 类的 Create 成员函数。该函数具有以下两种形式的声明:
"BOOL Create(LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create(UNIT nIDTemplate, CWnd* pParentWnd = NULL); |
返回值:
如果对话框创建和初始化成功,则返回非零值,否则为0。
参数:
lpszTemplateName 包含一个对话框模板资源的名称。
nIDTemplate 包含对话框模板资源的ID号。
pParentWnd 指向含有对话框的父窗口对象的指针。如果为NULL,对话框对象的父窗口设置为应用的主窗口。
当创建对话框后,Create成员函数应立即返回。在父窗口中创建之后,如果要求对话框出现,则使用模板中的WS_VISIBLE风格。否则,必须调用ShowWindow。
还有一个问题就是不可以把对话框对象声明为局部对象,因为程序会按顺序执行下去,当这个对象的生命周期也就结束了,它就会销毁与之相关联的对话框资源。解决这个问题,可以将它定义为指针,在堆上分配内存。我们知道,在堆上分配的内存,与程序的整个生命周期是一致的,当然这里是指程序中不主动销毁的情况。
"CTestDlg *pDlg = new CTestDlg;
pDlg->Create(IDD_DIAL0G1,this);
pDlg->ShowWindow(SW_SHOW); |
我们定义的pDlg这个指针变量是一个局部对象,这样当它的生命周期结束时,它所保荐的内存地址就丢失了,那么在程序中也就无法再引用到它所指向的那块内存了。
那么我们时候来释放这块内存空间呢?
我们可以在CTestDlg 类中重载 PostNcDestroy 虚函数,释放this指针所指向的内存。通常的非模态对话框是用类的指针通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。
非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。 如果OnOk需要关闭对话框也要进行重载,方法类似。
以下是相关示例代码:
" //对话框中:
void CTestDlg::OnCancel()
{
DestroyWindow();
}
void CTestDlg:ostNcDestroy()
{
CDialog:ostNcDestroy();
delete this;
} |
|
|