Win32 API:在制表符控件的wndproc而不是父级中处理WM_ *

时间:2015-04-04 05:01:33

标签: c winapi

目前,我的程序主窗口附有一个标签控件。

但是,当我切换标签时,WM_NOTIFY消息将发送到标签控件的父级,而不是标签控件本身。

有没有办法让标签控件的WndProc接收并处理这些消息而不是父节点?

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

1 个答案:

答案 0 :(得分:2)

您有两种选择。

<强> 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,所以我通常不建议这样做。但它确实有效。如果你为标签页执行此操作,切换页面就像隐藏一个控件并显示另一个控件一样简单! (事实上​​,这就是属性表对子对话框的作用。)