由于要求点击关闭对话框按钮的时候对话框最小化,
我重载了WM_CLOSE消息,
但是我在另外一个线程结束后需要向主线程post一个消息来关闭他,
此时的WM_CLOSE已经被重载,
我就自己添加了一个#define WM_MYCLOSE WM_USER+100,
添加消息映射函数ON_MESSAGE(WM_MYCLOSE, OnMyselfClose),
函数定义为
void CXXXDlg::OnMyselfClose()
{
CDialog::OnClose();
}
但是在CXXXXApp::Thread1()
{
  ........  ::PostMessage(hWnd,WM_MYCLOSE,0,0);//hWnd为主对话框句柄
}
后不能关闭主对话框,请问是为什么?还有其他的方法吗?

解决方案 »

  1.   

    直接发送 WM_CLOSE 试试
      

  2.   

    忘了说了我重载的消息函数为:
    void CXXXXDlg::OnClose() 
    {
    ShowWindow(SW_HIDE);
    }
    所以直接发WM_CLOSE主对话框就隐藏了~
      

  3.   

    那就设置个标识位,需要关闭的时候,直接将标志位职位,然后发close消息!
    在OnClose() 中,用标志位判断是关闭还是隐藏!
      

  4.   

    Sorry,好像没有关掉进程,只是把对话框销毁了
      

  5.   

    还是用3#的方法,加个标志来判断。暴力的一点可以直接发送WM_QUIT消息,那么进程肯定是会退出的
      

  6.   

    void CXXXXDlg::OnClose()  
    {
    if(!m_bFlag)
    ShowWindow(SW_HIDE);
    else
    CDialog::OnClose();}
    m_bFlag是自己定义的一个BOOL,初始为false,如果需要关闭,那么,自己改成TRUE,然后发close消息!
      

  7.   

    消息发对的,因为我把重载的WM_CLOSE注释掉,进程结束就能关闭程序了,但是如果去点击对话框的关闭按钮也会退出了,不符合要求~!
      

  8.   

    m_bFlag在CXXXXDlg中申明为公有成员,初值为FALSE,然后我的线程在CXXXXApp中,需要关闭的时候:
    CXXXXApp::Thread1()
    {
      ........
      CXXXXDlg dlg;
      dlg.m_bFlag = TRUE;
      ::PostMessage(hWnd,WM_MYCLOSE,0,0);//hWnd为主对话框句柄
    }
    这样做的,还是不行
    我的重载函数在CXXXXDlg中
    void CXXXXDlg::OnClose()   
    {
    if(!m_bFlag)
    ShowWindow(SW_HIDE);
    else
    CDialog::OnClose();
    }
    尝试在DLG中添加静态公有成员变量,报错:
    unresolved external symbol "public: static int CXXXXDlg::m_ucFlags" (?m_ucFlags@CXXXXDlg@@2HA)
      

  9.   

    终于解决了用的“fandh”的方法,谢谢大家,谢谢fandh
      

  10.   

    还有个疑问就是为什么自己定义的消息用在那个postmessage里面没有响应?
      

  11.   

    我又检查了一遍,和顶楼写的一样,我是从WM_CLOSE里面copy进去的,应该不会错吧?
    唯一的区别是,WM_CLOSE的消息映射是ON_WM_CLOSE()
    而我的是ON_MESSAGE(WM_MYCLOSE, OnMyselfClose)。我改成ON_COMMAND也不对奇怪