请问如何在关闭父窗口同时关闭子窗口

时间:2021-01-02 23:53:28

    各位大神,帮帮看看我这个程序吧。
    下面是代码链接:
     http://download.csdn.net/detail/keyboard330/4481626
     我想在关闭父窗口同时关闭子窗口。

     程序现在是个sdi程序,点击按钮,会生成子窗口。
     要是先关闭子窗口,在关闭主窗口,程序正常退出。
     要是生成子窗口后,直接关闭主窗口,程序在任务管理器里还有,没真正退出。
     当只点击一个按钮时,会生成一个子窗口,跟踪程序,消息WM_DESTROY对应的函数执行了,WM_QUIT也发出去了,消息循环也退出了,可程序在任务管理器里还是有。(这里我最想不明白!!!)
       当点击两个按钮,并直接关闭主窗口时,显示一个消息循环退出了,另一个没退出。
   
       会在C:\Program Files文件夹下生成err_log.txt文件。

       多谢各位了^_^

7 个解决方案

#1


我试着在视类WM_CLOSE对应的函数中调用DestroyWindow函数,销毁子窗口,可还是没用。

#2


好吧,我贴代码,这是单击按钮后的响应函数。
 

bool sign_far_shown;
child_window child_1;
void Cchild_01View::OnBnClickedButtonChild0()
{
// TODO: Add your control notification handler code here
if (sign_far_shown)
{
return;
}
sign_far_shown = true;

HWND _hwnd_frame = m_hWnd;
int sign_dialog = 1;
HANDLE himage_1 = NULL;
// retrive_pic_handle(pic_far, len_pic_far, himage_1, sign_dialog);
child_1.show_window(_hwnd_frame, m_hWnd, himage_1, sign_dialog);
}

#3


看到你的代码,我只想到一个字:乱
遇到这样的代码,实在是没有心思看

但是我可以猜一下:把child_01变量放到类Child_view里边
主窗口退出会卸载类,但由于child_01不是他的成员所以得以保留,theApp发现仍然有函数可以处理消息所以没有退出。
另外,如果想以回调函数方式处理消息,应该重载theApp.Run()。

#4


    多谢回复,也没人指导,所以代码实在不规范^_^
    我有一点不明白,就是明明WM_QUIT消息都发出去了,child_1.show_window()函数的消息循环也结束了(这个函数也随之退出),为什么程序没退出。
    有什么书籍能参考一下一下么?
    

#5


     我看一本书,就是在一个.h和.cpp文件封装好一个类,然后win32主程序里只用声明一个全局类变量,就可以通过调用类中的函数,来实现相关功能。我也想那样写,所以有child_window child_1;
并没有把child_1写为Child_view中的变量(child_window是我自己写的一个类)。

#6


qq874774259
多谢回答了,分给你了,虽然不是我最想要的答案,但还是一个方向^_^

#7


   我查了好多资料,都说可以在关闭主窗口时,自己先销毁子窗口,在关闭主窗口,再关闭主窗口。我试过,都不行啊。
     最后,折衷了一下,在关闭主窗口时,我先判断,还有没有子窗口,若有,就提示先关闭子窗口,再关闭主窗口,若没有子窗口,则程序退出。
     虽然与我最初想要的效果不一样,但与TerminateThread()、TerminateProcess()相比,我宁愿要安全。
     希望对其他也碰到类似问题的朋友,有所帮助。
     
     最后说一句,结贴的赶脚真好 请问如何在关闭父窗口同时关闭子窗口

#1


我试着在视类WM_CLOSE对应的函数中调用DestroyWindow函数,销毁子窗口,可还是没用。

#2


好吧,我贴代码,这是单击按钮后的响应函数。
 

bool sign_far_shown;
child_window child_1;
void Cchild_01View::OnBnClickedButtonChild0()
{
// TODO: Add your control notification handler code here
if (sign_far_shown)
{
return;
}
sign_far_shown = true;

HWND _hwnd_frame = m_hWnd;
int sign_dialog = 1;
HANDLE himage_1 = NULL;
// retrive_pic_handle(pic_far, len_pic_far, himage_1, sign_dialog);
child_1.show_window(_hwnd_frame, m_hWnd, himage_1, sign_dialog);
}

#3


看到你的代码,我只想到一个字:乱
遇到这样的代码,实在是没有心思看

但是我可以猜一下:把child_01变量放到类Child_view里边
主窗口退出会卸载类,但由于child_01不是他的成员所以得以保留,theApp发现仍然有函数可以处理消息所以没有退出。
另外,如果想以回调函数方式处理消息,应该重载theApp.Run()。

#4


    多谢回复,也没人指导,所以代码实在不规范^_^
    我有一点不明白,就是明明WM_QUIT消息都发出去了,child_1.show_window()函数的消息循环也结束了(这个函数也随之退出),为什么程序没退出。
    有什么书籍能参考一下一下么?
    

#5


     我看一本书,就是在一个.h和.cpp文件封装好一个类,然后win32主程序里只用声明一个全局类变量,就可以通过调用类中的函数,来实现相关功能。我也想那样写,所以有child_window child_1;
并没有把child_1写为Child_view中的变量(child_window是我自己写的一个类)。

#6


qq874774259
多谢回答了,分给你了,虽然不是我最想要的答案,但还是一个方向^_^

#7


   我查了好多资料,都说可以在关闭主窗口时,自己先销毁子窗口,在关闭主窗口,再关闭主窗口。我试过,都不行啊。
     最后,折衷了一下,在关闭主窗口时,我先判断,还有没有子窗口,若有,就提示先关闭子窗口,再关闭主窗口,若没有子窗口,则程序退出。
     虽然与我最初想要的效果不一样,但与TerminateThread()、TerminateProcess()相比,我宁愿要安全。
     希望对其他也碰到类似问题的朋友,有所帮助。
     
     最后说一句,结贴的赶脚真好 请问如何在关闭父窗口同时关闭子窗口