子窗口没有收到WM_DESTROY?

1 windows winapi message

我将winapi CreateWindowEx打包成一个简单的类.由于每个窗口共享一个相同的wndProc(hwnd,msg,wparam,lparam),我将CreateWindowEx创建的每个窗口放入一个映射以分发msg,如下所示:

wndProc(hwnd, msg, wparam, lparam){
    if(map[hwnd]!=nil){
        switch(msg){
            map[hwnd].wndProc(...)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次窗口或其父窗口被销毁时,将其从地图中删除:

case WM_DESTROY: delete(map, hwnd)
Run Code Online (Sandbox Code Playgroud)

但是像按钮这样的东西不会收到WM_DESTROY.我在WM_NOTIFY和WM_COMMAND打印了所有的消息,但我注意到了.

那么如何在合适的时间从地图中删除这些子窗口呢?或者一种方式分发msg而不创建一个hwnd地图?

Han*_*ant 6

他们当然得到这个信息.但是他们的窗口程序在Windows内部,而不在程序内部.所以你永远不会看到它.您可以在MSDN文档中阅读的内容,请注意WM_DESTROY如何获得任何特殊处理.也不会生成父窗口可以看到的通知.

当您看到父窗口被销毁时,如果不自动删除所有子窗口,则子类化控件是C++类库包装器的一个非常标准的要求.最好不要发明自己的btw,这已经做了很多次了.