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个是菜单的实现函数,我想问的是,为何创建模态对话框不需要句柄,而创建模态对话框则需要句柄?
明白的请详解,分我全给你一人,谢谢了。

解决方案 »

  1.   

    上面这2个是菜单的实现函数,我想问的是,为何创建模态对话框不需要句柄,而创建模态对话框则需要句柄?
    ===========
    你没有看懂上面的代码,不存在创建模态对话框不要句柄,创建非模态对话框要句柄一说。
    非模态对话框,如果你不用DestroyWindow销毁对话框的话,关闭它,其实只是将非模态对话框隐藏起来了。
    所以if(!m_Mydlg.m_hWnd)这句的主要目的是判断一下,非模态对话框m_Mydlg到底存不存在,如果没有这个对话框,则用Create创建它,如果存在,说明这个非模态对话框只是被隐藏起来了,那么调用ShowWindow显示它就行了。而对于模态对话框关闭即是销毁。
      

  2.   

    模态非模态对话框都关联了窗口句柄成员m_hWnd,这个成员与一个窗口相关联,如果没有与窗口关联,该值为NULL。
      

  3.   

    红猪的意思是不是,先用m_Mydlg.Create(IDD_DIALOG1);创建一个对话框,这时候他是隐藏的,但是一用m_Mydlg.ShowWindow(SW_SHOW);就显示了,他不像m_Mydlg.DoModal();那样一句话就搞定了,我的理解为第2个函数其实和第一个函数本质上不一样,第一个函数自动完成了创建销毁,而第二个函数则是要给你一个错觉?意思就是第一个函数是全自动的,第二个函数是半自动的且没有自己销毁功能。
      

  4.   

    非模态对话框用Create出来后并不能显示出来,必须要调用ShowWindow才能显示。而模态对话框通过DoModal之后就能显示出来了。
    另外,非模态对话框要完全销毁的话,必须要调用DestroyWindow才行。
    下面这段代码的含义如下:
    先用if(!m_Mydlg.m_hWnd)判断句柄是否存,如果存在,说明,非模态对话框已经创建好了,所以下面就不用创建了,直接用ShowWindow显示就得了。如果不存在句柄,说明非模态对话框尚未建立好,那么先用Create创建,然后才能用ShowWindow显示。这样做的原因是,有时候非模态对话框没显示出来只是隐藏起来了,对话框是存在的,不用再Create了,直接显示就行了。
      

  5.   

    楼上的基本上是对的,我就不重复了,我给你的是不一样的感受:我来简单而通俗的给你讲解一下:首先,在你问这个问题的时候,肯定是你误会代码的意思了。
    你是看到 m_Mydlg.Create(IDD_DIALOG1);  再看模态对话框直接DoModal才这样子问的吧?其实前者是发现非模态对话框不存在的时候调用的函数,而且里面的IDD_DIALOG1也不叫句柄,而是叫ID,你看后面显示非模态对话框的时候用m_Mydlg.ShowWindow(SW_SHOW); 不也没有用ID了吗?这不就和前面的非模态对话框一致了吗?都是没有用ID.至于这里对非模态对话框要判断一下,而模态则没有判断,我想给的解释是这样的:模态对话框在显示的时候,其父窗口是无法继续往下运行的,只有它一个能运行,也就是它的父窗口不能控制它的死,当然能控制它的生了,因为他是父窗口调用函数显示出来的。但非模态对话框就不一样了,应为很有可能在某一次的时候,该非模态对话框被父窗口销毁了,则在下次显示的时候因为找不到对话框来显示而出现莫名其妙的错误。所以在每次显示之前要判断一下,因为极有可能窗口已经被父窗口销毁了。相信楼主现在已经明白了吧?