首页 文章

子窗口没有收到WM_DESTROY?

提问于
浏览
1

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

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

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

case WM_DESTROY: delete(map, hwnd)

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

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

2 回答

  • 5

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

    当您看到父窗口被破坏时,自动删除所有子窗口时,subclassing controls是C类库包装器的一个非常标准的要求 . 最好不要发明自己的btw,这已经做了很多次了 .

  • 2

    那么如何在合适的时间从 Map 中删除这些子窗口?

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

    或者一种方式分发msg而不创建一个hwnd Map ?

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

相关问题