12:33 2012-10-26
对话框类一
对话框与windows通用控件一样,本质上也是窗口,只不过是特殊的窗口。
===========================================================================================
模态对话框
创建
CDialog::DoModal
销毁
CDialog::EndDialog
===========================================================================================
非模态对话框:
1.1、CDialog::Create 创建非模态对话框
MSDN:
Call Create to create a modeless dialog box using a dialog-box template from a resource
实例:
CDlg102601Dlg *pDlg = new CDlg102601Dlg();
if(pDlg != NULL)
{
BOOL ret = pDlg->Create(IDD_ABOUTBOX,this);
if (!ret)
{
AfxMessageBox("Error Creating Dialog");
}
// 注意显示 类似通用按键需要显示
pDlg->ShowWindow(SW_SHOW);
}
1.2、非模态对话框的退出
1.2.1、 在对话框退出时的销毁
映射 WM_DESTROY消息 处理:释放指针
WM_DESTROY
afx_msg void OnDestroy( );
方式一:调用delete函数强行删除自身对象
void CDlg102601Dlg::OnDestroy()
{
CDialog::OnDestroy();
delete this;
}
void CDlg102601Dlg::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
说明:
DestroyWindow函数的调用将触发 WM_DESTROY 消息,执行OnDestroy()函数
1.2.2 通过父窗口销毁
void CDlg102601Dlg::OnDestroy()
{
CDialog::OnDestroy();
// 向父窗口发送消息,将自身的指针作为一个参数发送
PostMessage(WM_DELETE_DLG,this);
}
在删除函数中删除
LRESULT CDlg102601Dlg::OnDeleteDlg(WPARAM wParam,LPARAM lParam)
{
delete (CDlg102601Dlg*)wParam;
return 0;
}
在退出 ONOK ONCANCEL中 执行 DestroyWindow函数
===========================================================================================
13:51 2012-10-26
对话框类二
非模态对话框和模态对话框的区别
1、对话框对象的声明
2、对话框的启动
3、对话框的显示
4、对话框的删除
转载:
一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需
设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话
框是否具有Visible风格。
二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变
量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可
访问对话框对象。
三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在
。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断
用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返
回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框
对象,而不能以局部变量的形式来构建之。
四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用
CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调
用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框
。
五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象
。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中
完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
{delete this; //删除对象}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框
对象了。
六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情
况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激
活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值
,以表明对话框对象已不存在了。
===========================================================================================