子窗口没有收到WM_DESTROY?

我把winapi的CreateWindowEx打包成一个简单的类。 由于每个共享同一个wndProc(hwnd,msg,wparam,lparam)的窗口,我把CreateWindowEx创build的每个窗口都放到一个映射中来发布msg,如下所示:

wndProc(hwnd, msg, wparam, lparam){ if(map[hwnd]!=nil){ switch(msg){ map[hwnd].wndProc(...) } } } 

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

 case WM_DESTROY: delete(map, hwnd) 

但是button之类的东西不会收到WM_DESTROY。 我在WM_NOTIFY和WM_COMMAND中打印了所有的信息,但我注意到了。

那么我怎样才能在合适的时间从地图上删除这些子窗口呢? 或者一种方式分发味精而不创build一个hwnd地图?

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

当您看到父窗口被破坏时,自动删除所有的子窗口, 子类化控件是C ++类库封装器的一个非常标准的要求。 最好不要发明自己的顺便说一句,这已经做了很多次了。

那么我怎样才能在合适的时间从地图上删除这些子窗口呢?

您必须使用SetWindowLongPtr(GWL_WNDPROC)SetWindowSubClass()创建您创建的每个窗口的子类,然后您将收到所有WM_DESTROY消息。

或者一种方式分发味精而不创建一个hwnd地图?

像ATL和VCL这样的框架通过为每个窗口动态地分配一个thunk并把对象指针放在thunk中来处理这个问题,然后使用think作为窗口过程。 这样,每当调用一个thunk时,它就会直接将消息传递给它的关联对象。