有这样一个问题:
  我有一个主对话框,按下主对话框上的一个按钮后弹出子对话框。现在我鼠标左键单击主对话框的客户区以及非客户区,能够去掉子对话框,这应该是很容易的,在主对话框中接受WM_LBUTTONDOWN和WM_NCLBUTTONDOWN消息后将指向子对话框的指针delete掉就ok了。
  但现在的情况是,我希望能够鼠标左键单击主对话框以外的区域也能够实现将子对话框消去,在对话框以外的单击左键对话框应该是接受不到消息的,除非是用SetCapture()来捕获鼠标,可是具体的操作我一直没法实现;或者说是否有其他可用的方法,向各位请教了。

解决方案 »

  1.   

    你是想在子对话框变为非活动状态的时候将其关闭吧?只要在子对话框中响应WM_ACTIVATE消息,判断状态为WA_INACTIVE时,自己关闭就可以了。
      

  2.   

    前段时间我正好也遇到同样的问题  在类向导的在class info中,把Advanced Options的Message filter设为Window,然后再回到Message Maps,就可以看到WM_ACTIVATE消息。双击WM_ACTIVATE,就可以加载OnActivate。void CNomodal::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
    {
    CDialog::OnActivate(nState, pWndOther, bMinimized); if(WA_INACTIVE  == nState) //增加一行 
    {
      this->ShowWindow(SW_HIDE);//当你单击鼠标是在对话框外,隐藏对话框 
    }
    // TODO: Add your message handler code here

    }
      

  3.   

    用SetCapture()将鼠标捕获到主对话框,在主对话框响应鼠标点击事件,检查当前点击事件的鼠标坐标,如果不在子对话框范围内就消隐子对话框
      

  4.   

    我试过了,用SetCapture()确实可以完成一部分的功能,但是却有不少缺点,比如它在捕获鼠标后的下一次单击只能是响应LButtonDown来判断是否在子对话框范围,而不能实现其他任何功能。但还是谢谢你能够提供我这样一种思路。马上给分。