100分求教(急!在线等待!):怎么关闭父窗口的所有子窗口,举个例子父窗口是view 视图,在视图中我创建了多个非模式对话框,做为子窗口但是我在视图的析够函数中,我想关闭所有的对话框,怎么做?望高手不吝赐教!,谢谢!

解决方案 »

  1.   

    EnumChildWindows或FindWindowEx找出所有子窗口逐一关闭。
      

  2.   

    TCHAR szClass[256];
    HWND hwndChild = ::GetWindow(hwndParent, GW_CHILD);
    while (hwndChild)
    {
    ::GetClassName(hwndChild, szClass, 255);
    if (_tcscmp(szClass, _T("#32770")) == 0)
    {
    ::PostMessage(hwndChild, WM_CLOSE, 0, 0);
    }
    hwndChild = ::GetNextWindow(hwndChild, GW_HWNDNEXT);
    }
      

  3.   

    还是在WM_DESTROY消息中关闭吧,因为你在析构函数关闭做这个操作的时候,该View窗口的对应的窗口句柄已经释放掉了,那么也就不能正确枚举出该view的所有子窗口了,EnumChildWindows应该是可以的
      

  4.   

    BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
    {
    if (hwnd != (HWND)lParam)
    SendMessage(hwnd, WM_CLOSE, 0, 0);
    return TRUE;
    }
    EnumThreadWindows(GetCurrentThreadId(), EnumThreadWndProc, (LPARAM)m_hWnd);
      

  5.   

    写错了,更正一下:
    BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
    {
    if (GetParent(hwnd) == (HWND)lParam)
    SendMessage(hwnd, WM_CLOSE, 0, 0);
    return TRUE;
    }
      

  6.   

    这样写更好一些,上面的写法不能删除Overlapped窗口。
    BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
    {
    if (GetWindowLong(hwnd, GWL_HWNDPARENT) == (long)lParam)
    SendMessage(hwnd, WM_CLOSE, 0, 0);
    return TRUE;
    }
      

  7.   

     HWND hwndChild = ::GetWindow(hwndParent, GW_CHILD);
        while (hwndChild)
        {
             ::PostMessage(hwndChild, WM_DESTROY, 0, 0);
              hwndChild = ::GetNextWindow(hwndChild, GW_HWNDNEXT);
        }
      

  8.   

    BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam)
    {
        if (GetWindowLong(hwnd, GWL_HWNDPARENT) == (long)lParam)
            SendMessage(hwnd, WM_CLOSE, 0, 0);
        return TRUE;
    }这种方法我试了下,但是整个窗口都关闭了,我要的效果是,主框架mainfram下的两个视图cview1和cview2窗口不销毁,在两个视图切换的时候
    只销毁,视图cview2中所有的非模式对话矿,
    上面的方法,把整个窗口都关闭了,而7楼的方法,我也试了下,结果遍历对话矿的时候找不到对话矿的指针,郁闷,求救啊效果出来了 马上送分,还要麻烦大家了!~
      

  9.   

    EnumThreadWindows的最后参数给cview2的句柄。
      

  10.   

    首先非常感谢cnzdgs 热情的帮助,我试了下也失败了,能发给我个demo么? 
      

  11.   

    做demo比较麻烦,还是从你的代码来分析比较容易。
    目前的问题可能是你创建子窗口时指定的父窗口不是cview2;也可能是你给的cview2的句柄不对。如果自己找不出问题可以把相关代码贴出来,或者整个打包上传。
      

  12.   

    呵呵我找到了方法了 ,我在创建非模式对话框的时候我把指针定义成数组型的,
    创建的时候动态创建个数,删除的时候动态删除就可以了
    虽然是自己找的方法,但是还的感谢大家的帮助,尤其是cnzdgs 满天星,这位大虾帮了我很多,也给了不少建议
    感谢大家散分喽!~~~~~~~~~~~