繁体   English   中英

子窗口没有收到 WM_DESTROY?

[英]Child windows does not receive WM_DESTROY?

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

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

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

case WM_DESTROY: delete(map, hwnd)

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

那么如何在正确的时间从地图中删除这些子窗口呢? 或者一种在不创建 hwnd 映射的情况下分发 msg 的方法?

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

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

那么如何在正确的时间从地图中删除这些子窗口呢?

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

或者一种在不创建 hwnd 映射的情况下分发 msg 的方法?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM