void CMainFrame::OnModedlg()
{
// TODO: Add your command handler code here
m_Mydlg.DoModal(); //显示模态对话框
}void CMainFrame::OnModelessdlg()
{
// TODO: Add your command handler code here
if(!m_Mydlg.m_hWnd) //判断句柄是否存在
{
m_Mydlg.Create(IDD_DIALOG1); //如果不存在则创建
}
m_Mydlg.ShowWindow(SW_SHOW); //显示非模态对话框
}
上面这2个是菜单的实现函数,我想问的是,为何创建模态对话框不需要句柄,而创建模态对话框则需要句柄?
明白的请详解,分我全给你一人,谢谢了。
{
// TODO: Add your command handler code here
m_Mydlg.DoModal(); //显示模态对话框
}void CMainFrame::OnModelessdlg()
{
// TODO: Add your command handler code here
if(!m_Mydlg.m_hWnd) //判断句柄是否存在
{
m_Mydlg.Create(IDD_DIALOG1); //如果不存在则创建
}
m_Mydlg.ShowWindow(SW_SHOW); //显示非模态对话框
}
上面这2个是菜单的实现函数,我想问的是,为何创建模态对话框不需要句柄,而创建模态对话框则需要句柄?
明白的请详解,分我全给你一人,谢谢了。
===========
你没有看懂上面的代码,不存在创建模态对话框不要句柄,创建非模态对话框要句柄一说。
非模态对话框,如果你不用DestroyWindow销毁对话框的话,关闭它,其实只是将非模态对话框隐藏起来了。
所以if(!m_Mydlg.m_hWnd)这句的主要目的是判断一下,非模态对话框m_Mydlg到底存不存在,如果没有这个对话框,则用Create创建它,如果存在,说明这个非模态对话框只是被隐藏起来了,那么调用ShowWindow显示它就行了。而对于模态对话框关闭即是销毁。
另外,非模态对话框要完全销毁的话,必须要调用DestroyWindow才行。
下面这段代码的含义如下:
先用if(!m_Mydlg.m_hWnd)判断句柄是否存,如果存在,说明,非模态对话框已经创建好了,所以下面就不用创建了,直接用ShowWindow显示就得了。如果不存在句柄,说明非模态对话框尚未建立好,那么先用Create创建,然后才能用ShowWindow显示。这样做的原因是,有时候非模态对话框没显示出来只是隐藏起来了,对话框是存在的,不用再Create了,直接显示就行了。
你是看到 m_Mydlg.Create(IDD_DIALOG1); 再看模态对话框直接DoModal才这样子问的吧?其实前者是发现非模态对话框不存在的时候调用的函数,而且里面的IDD_DIALOG1也不叫句柄,而是叫ID,你看后面显示非模态对话框的时候用m_Mydlg.ShowWindow(SW_SHOW); 不也没有用ID了吗?这不就和前面的非模态对话框一致了吗?都是没有用ID.至于这里对非模态对话框要判断一下,而模态则没有判断,我想给的解释是这样的:模态对话框在显示的时候,其父窗口是无法继续往下运行的,只有它一个能运行,也就是它的父窗口不能控制它的死,当然能控制它的生了,因为他是父窗口调用函数显示出来的。但非模态对话框就不一样了,应为很有可能在某一次的时候,该非模态对话框被父窗口销毁了,则在下次显示的时候因为找不到对话框来显示而出现莫名其妙的错误。所以在每次显示之前要判断一下,因为极有可能窗口已经被父窗口销毁了。相信楼主现在已经明白了吧?