我是如此打开窗口的:
CMainDlg dlg;
MainWin=&dlg;
dlg.DoModal(); 我点窗口上的红叉,能关闭窗口(调用了成员函数OnClose()),并且 DoModal()函数能执行结束。
但是我使用SendMessage函数发送WM_CLOSE消息:
::SendMessage(MainWin->m_hWnd,WM_CLOSE,0,0);窗口是消失了,但是好像没有调用成员函数OnClose(),DoModal()函数也没有执行结束!请问这是什么原因?

解决方案 »

  1.   

    对话框界面,使用 EndDialog 函数关闭。
      

  2.   

    此窗口是一线程中创建的:void OpenWindow()
    { AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMainDlg dlg;
    MainWin=&dlg;
    dlg.DoModal();
    }我需要在另一线程中关闭这个窗口,所以应该只能用发送消息的方式来关闭此窗口。
      

  3.   

    窗口消息了,那么就应该触发了OnClose消息,你可以在OnClose消息中EndDialog等结束对话框...
      

  4.   

    问题就是窗口消失了,但是OnClose()函数并没有被执行。
      

  5.   

    创建的线程就是这个:
    void OpenWindow()
    { AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMainDlg dlg;
    MainWin=&dlg;
    dlg.DoModal(); 
    }很简单的,目的就是打开一个窗口。
      

  6.   

    ::SendMessage(MainWin->m_hWnd,WM_CLOSE,0,0);
    -----------------------------------
    你这个是从哪里发出来的?应该不在CMainDlg类对象关联的对话框中吧
      

  7.   

    不在,其实这些程序都在一个DLL中,载入DLL时,创建那个线程来打开窗口。卸载DLL的时候需要关闭窗口并让线程自然结束。
      

  8.   

    是不是应该用PostMessage,记得应放消息队列
      

  9.   

    EndDialog()是最好的方法。不要在外部调用CDialog::OnOK()或者是CDialog::OnCancel();除非你是重载了按钮IDOK或者是IDCANCEL的事件,在成员函数OnOK()或是OnCancel()里面可以调用基类的相应函数。如果你不是通过上述途径而是通过外部函数来调用的话,比如
    void myExit()
    {
       CDialog::OnOK();
    }
    也就是说你不是在CMyDialog::IDOK()中调用的,那只会让该窗口被隐藏,而并不是销毁。我前两条也在搞这个,我还是用来WinProc(),让线程给该函数发消息,然后在里面使用CDialog::IDOK(),结果发现内存有泄漏-_-!一查MSDN才明白了。直接使用EndDialog()就再也不会泄露了:)
      

  10.   

    都没有作用,一样的情况。
    啊,我的项目是MFC DLL,我是在theApp析构函数中向窗口发消息,但是似乎窗口已经早已没有响应了。
      

  11.   

    是否能在析构theApp之前,处理这些事情呢?
      

  12.   

    就事论事:)
    WM_CLOSE消息只是一个后置附加处理消息,WN_DESTROY才是销毁窗口的消息。
    或者DestroyWindow方法。关闭按钮触发的是WM_SYSCOMMAND消息,消息的某参数值为SC_CLOSE。
      

  13.   

    WM_CLOSE消息缺少参数撒
    wParam lParam为0肯定出问题的
    你看看人家ms响应关闭时 这两个参数是不为0 的 
      

  14.   

    ...在WindowProc函数中都捕捉不到WM_CLOSE消息...
    如果是点窗口上的红叉,就能捕捉到。
      

  15.   

    小P你是用Win32SDK开发程序,不是用MFC?WM_CLOSE消息本来就是无参数的,某人在误导,呵呵:)我上面说反了,是我记错了,WM_DESTROY才是后置处理。还是用DestroyWindow吧,发WM_CLOSE消息这个实在是不大可靠。
      

  16.   

    ::SendMessage(MainWin->m_hWnd,WM_CLOSE,0,0);
    如果是在创建对话框的线程当中,因为DoModal()会阻塞线程继续执行,所以该语句不会执行。如果在外部的线程执行,那这个变量MainWin是个什么参量呢?局部的?全局的?还是?我记得线程最好是用LPVOID类型来传递句柄或者指针的。
      

  17.   

    我可能搞错了。我遇到的问题是DoModal()创建线程A,然后线程A来退出该窗口。这时线程A给对话框发送消息,让对话框执行EndDialog()就完成了。但是你的问题是线程创建了对话框,相当于对话框是线程的局部变量了,这个问题可能是不太好解决呀,这时候这个线程会阻塞,只能通过其它线程来结束它。但是这个对话框变量是局部变量,如果传递窗口地址的话感觉好像不太合理呀?关注下了。我觉得干脆就用非模态对话框模拟吧,把其它窗口都给隐藏了,只有这个窗口退出了,其它窗口就显示出来了,这不就相当于模态了吗:)
      

  18.   

    建议还是把关键代码贴出来,只看到创建很难判断的,关键是看你在什么地方SendMessage的
      

  19.   

    从设计角度说,从外部强制关闭一个模态对话框,这已经违背了模态对话框的设计初衷。
    模态(Modal)的意义就在于“阻断(Block)”,模态对话框就是要自己关闭自己。