【问题标题】:Win32 API: process WM_* in tab control's wndproc instead of parent'sWin32 API:在选项卡控件的 wndproc 而不是父进程中处理 WM_*
【发布时间】:2015-04-04 05:01:33
【问题描述】:

目前,我在程序的主窗口中附加了一个选项卡控件。

但是,当我切换选项卡时,WM_NOTIFY 消息会发送到选项卡控件的父级,而不是选项卡控件本身。

有没有办法让选项卡控件的 WndProc 代替父控件接收和处理这些消息?

我正在使用原始的 win32 C API。没有 MFC 或任何类型的库

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    你有两个选择。

    1.子类化

    你可以subclass the tab control,这样你可以首先在那里处理消息,然后在你的父窗口中有一些类似的代码

    #define msgNOTIFY (WM_APP + 0x40)
    // ...
    case WM_NOTIFY:
        return SendMessageW(nm->hwndFrom, msgNOTIFY, wParam, lParam);
    

    这会将WM_NOTIFY 反弹回来。 WM_COMMAND 也一样。为了安全起见,我为这个重定向的WM_NOTIFY/WM_COMMAND 使用了单独的消息 ID;你可能不必(我不确定)。 If your controls move between windows, you'll also have to do this from all windows.

    2。使用中间人

    不要将选项卡控件直接放在窗口上,而是将其放在另一个控件中(最好是您自己创建的一个,它只会调整大小以适合子级),而不是放置在窗口上,并在那里处理消息.这样做的好处是避免了上面链接的重育问题,但是costs a window handle,所以我通常不建议这样做。不过,它确实有效。如果您为标签页执行此操作,切换页面就像隐藏一个控件并显示另一个控件一样简单! (事实上​​,这就是属性表对其子对话框所做的事情。)

    【讨论】:

    • 谢谢,但我无法真正更改父级的 wndproc,这就是我尝试在选项卡控件而不是父级中处理消息的原因。
    • 那你能不能不继承父类呢?
    • 这就是我想说的(我可能以错误的方式表达了自己)。我不能子类化它,或者更确切地说,我不能。因此,我试图找到一种无需子类化的方法。
    • 唯一的其他选择是将选项卡控件放在其他控件中,然后将 that 放在父窗口中。我不知道选项卡控件是否能很好地响应 reparenting,但它不太可能不会......
    • 是的,你是对的,这成功了。我不确定,但你能用它作为答案吗?我会接受的。
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多