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 对话框所做的。)
目前我有一个选项卡控件附加到我的程序的主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 对话框所做的。)