Win32 API: 在选项卡控件的 wndproc 而不是父控件中处理 WM_*

Win32 API: process WM_* in tab control's wndproc instead of parent's

目前我有一个选项卡控件附加到我的程序的主window。

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

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

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

你有两个选择。

1.子类化

你可以 subclass the tab control 所以你 可以 首先在那里处理消息,然后在你的 parent window 中有一些代码

#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。使用中间人

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