网上看了很多关于模态非模态对话框的定义 
   1)模态对话框显示后不能对父窗口进行操作  
   2)调用后不立即返回 
   3)拥有独立的消息循环,系统在user32.dll中定义的INT_PTR DialogBox(
  HINSTANCE hInstance,  // handle to module
  LPCTSTR lpTemplate,   // dialog box template
  HWND hWndParent,      // handle to owner window
  DLGPROC lpDialogFunc  // dialog box procedure
);
MSDN中说DialogBox创建一个模态对话框,但是如果把参数hWndParent设置为NULL,就是非模态对话框效果一样,此时创建的能叫模态对话框吗?
问题1:到底什么是模态对话框?问题2:既然模态对话框可以实现非模态对话框的功能,那非模态还有使用的必要性吗?问题3:MFC封装模态和非模态对话时是如何传递参数HWND hWndParent的?问题4:CreateDialog参数HWND hWndParent的意义,感觉有没有都是一样的?

解决方案 »

  1.   

    归根到底,都是CreateWindowEx!
      

  2.   

    建议楼主如果没看过《Windows程序设计》第五版的话,真的值得一看。
    里面说的很清楚了。
      

  3.   

    1)模态对话框显示后不能对父窗口进行操作  
      2)调用后不立即返回 
      3)拥有独立的消息循环,系统在user32.dll中定义的 
    这3个都是模态对话框的特征。问题2:既然模态对话框可以实现非模态对话框的功能,那非模态还有使用的必要性吗? 当然有。像文本文档的查找窗口就是非模态的,如果是模态的您觉得方便吗?
      

  4.   

    DialogBox创建一个模态对话框,但是如果把参数hWndParent设置为NULL,效果和非模态的完全一样呀?
    不知道danxuezx所说方便是指哪方面的?
      

  5.   

    假如有A,B,C三个对话框,B为模态,C为非模态的。
    在A中弹出B,则如果B不关闭不能对A进行操作。如果此时想不关闭B还要对A进行操作就得使用C。就像txt中查找对话框一样,当您打开它后您还可以在A中复制要查找的内容,如果查找对话框是模态的话那么要么手key要么先复制好再打开查找对话框。
      

  6.   

    说的简单一点,模态的是domodal()出来的,此时不能操作父窗口,
    非模态的是是NEW出来,然后showindwo显示出来,此时可以操作父窗口
      

  7.   

    问题4:CreateDialog参数HWND hWndParent的意义,感觉有没有都是一样的
    没人回答吗?
      

  8.   

    DialogBox创建一个模态对话框,但是如果把参数hWndParent设置为NULL,效果和非模态的完全一样呀?不一样,模态的参数hWndParent设置为NULL,当主窗口获取焦点的时候,dialog就在主窗口下面了。
    而createdialog创建的非模态对话框,当主窗口获取焦点后,dialog还是浮在主窗口上方。这就是查找替换对话框的为什么要用非模态的。
      

  9.   

    // hWndParent是指Dialogbox的父窗口
    // 模态的表现都是针对父窗口的。
    // 设为NULL不知道是指没有父窗口还是父窗口为桌面,这个没试过。
      

  10.   

    问题1:到底什么是模态对话框?
    调用一个函数后显示一个对话框,函数内部处理消息循环,对话框关闭后函数返回,通过返回值告诉调用者操作结果。模态对话框会禁用其父窗口,返回时恢复。问题2:既然模态对话框可以实现非模态对话框的功能,那非模态还有使用的必要性吗?
    非模态对话框创建后立即返回,由调用者处理消息循环。对话框功能只是给开发者提供方便,无论模态还是非模态,都可以自己写代码来实现。模态与非模态是常用的两种形式。问题3:MFC封装模态和非模态对话时是如何传递参数HWND hWndParent的? 
    对于CDialog类,由构造函数的参数指定模态的父窗口,非模态的父窗口由Create函数的参数指定,如果参数为0,则自动取主窗口作为父窗口(如果不想设置父窗口,要指定GetDesktopWindow)。问题4:CreateDialog参数HWND hWndParent的意义,感觉有没有都是一样的?
    系统会保持窗口始终显示在其Parent的前面。
      

  11.   

    自己下载一个电子版:http://www.google.cn/search?hl=zh-CN&newwindow=1&q=Windows%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1+%E7%AC%AC%E4%BA%94%E7%89%88+CHM+%E4%B8%8B%E8%BD%BD&aq=f&oq=
      

  12.   

    MSDN中说DialogBox创建一个模态对话框,但是如果把参数hWndParent设置为NULL,就是非模态对话框效果一样,此时创建的能叫模态对话框吗? 
    -----------------------------1)模态对话框显示后不能对父窗口进行操作  
    2)调用后不立即返回 
    3)拥有独立的消息循环,系统在user32.dll中定义的hWndParent设置为NULL,就是没有父窗口,但是还是模态对话框,因为还是符合上面3个特征,你不能对不存在的父窗口进行操作。
      

  13.   

    1、MSDN上说模态对话框用必须要用EndDialog销毁,但是我用DestroyWindow好象也可以呀?
    2、请大家说说IsDialogMessage怎么用呀?
      

  14.   

    1、要用EndDialog销毁,因为关闭对话框还需要结束对话框内部的消息循环并带回返回值。
    2、在自己的消息循环中,从消息队列取出消息后调用IsDialogMessage,如果该函数返回FALSE,则继续执行循环中的后续代码,如果函数返回非0值,则说明消息已被处理,应continue执行下一次循环。
      

  15.   

    呵呵,经过我多次测试,终于搞明白其中的一点原理了。
    总结下,说的不对的地方请大家指教。
    1、对话框和用自定义窗口类所创建的窗口没有本质区别,只是将窗口类的定义换成了对话框资源
    2、非模态对话框和使用自己定义窗口类所创建的窗口表现行为基本一致
    3、模态对话框创建时会使用EnableWindow将父窗口禁用,然后在EndDialog中恢复父窗口
    4、其实不是必须使用EndDialog销毁模态对话框的,使用DestroyWindow也是可以的,但是要在DialogBox返回后使用EnableWindow恢复父窗口
    5、如果要在对话框的窗口过程中恢复父窗口,通过GetParent获取句柄总会失败(我也不知道为什么),要将父窗口的句柄设为全局的才可以在对话框的窗口过程中恢复父窗口
    6、模态对话框可以当做非模态对话框使用,只要使用EnableWindow将父窗口恢复即可,反之非模态对话框无法当做模态对话框使用
      

  16.   

    对话框与普通窗口的主要区别是,对话框根据资源模板自动创建窗口中的控件,而普通窗口需要自己创建控件。
    模态对话框要用EndDialog销毁,因为模态对话框要有返回值。更重要的是,MSDN中明确指出要用EndDialog,而没有提DestroyWindow,这意味着MS不保证DestroyWindow可以正常结束模态对话框,如果遇到问题,MS没有责任也不需提供支持。开发人员应极力避免使用undocumented的方法。
    对话框的窗口过程中可以用GetParent获取父窗口。
    模态对话框不能当作非模态对话框使用,因为模态对话框使用自己的消息循环,在窗口关闭时才返回。反之,非模态对话框加上消息循环及相应的处理,可以实现模态对话框的效果。