【发布时间】:2015-04-04 05:01:33
【问题描述】:
目前,我在程序的主窗口中附加了一个选项卡控件。
但是,当我切换选项卡时,WM_NOTIFY 消息会发送到选项卡控件的父级,而不是选项卡控件本身。
有没有办法让选项卡控件的 WndProc 代替父控件接收和处理这些消息?
我正在使用原始的 win32 C API。没有 MFC 或任何类型的库
【问题讨论】:
目前,我在程序的主窗口中附加了一个选项卡控件。
但是,当我切换选项卡时,WM_NOTIFY 消息会发送到选项卡控件的父级,而不是选项卡控件本身。
有没有办法让选项卡控件的 WndProc 代替父控件接收和处理这些消息?
我正在使用原始的 win32 C API。没有 MFC 或任何类型的库
【问题讨论】:
你有两个选择。
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,所以我通常不建议这样做。不过,它确实有效。如果您为标签页执行此操作,切换页面就像隐藏一个控件并显示另一个控件一样简单! (事实上,这就是属性表对其子对话框所做的事情。)
【讨论】: