我在Windows上工作,我选择c ++作为语言。我的应用程序是一个win32应用程序,我没有使用MFC类,只使用本机API。
我的主窗口包含一个Tab控件,其中有一个Listview控件。我试图对控件进行Subclass,但即使我遵循msdn指南它也无法正常工作。
我使用的功能是:
SetWindowLong
和GetWindowLong
所以我改变了孩子的程序,但似乎主窗口捕获控制发送(通过WM_NOTIFY)和每个WM消息的每个消息。我认为它可能涉及焦点,但我不知道如何实现这种情况:一个子控件,它是另一个子控件的父级。
我已经以这种方式创建了Tab控件。 代码:
hwndTab = CreateWindow(WC_TABCONTROL, "",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0, rcClient.right, rcClient.bottom,
winHandle, NULL, hInst, NULL);
OldUserTabProc = (WNDPROC)GetWindowLong(hwndTab, GWL_WNDPROC);
SetWindowLong(hwndTab, GWL_WNDPROC, (LONG_PTR)UserTabProc);
这里是Tab控制程序
LRESULT CALLBACK UserTabProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch ( message )
{
case WM_LBUTTONDOWN:
break;
case WM_RBUTTONUP:
break;
case TCN_SELCHANGE:
{
userCurrentTab = TabCtrl_GetCurSel( userTab );
break;
}
case TCN_SELCHANGING:
{
break;
}
};
return CallWindowProc( OldUserTabProc, hWnd, message, wParam, lParam );
}
listview具有Tab控件的父级。
答案 0 :(得分:0)
TCN_SELCHANGE
之类的值不是消息类型,也不会自行发送给控件。它们是通知(N
代表"通知")。控件通过WM_NOTIFY
或WM_COMMAND
等消息将通知发送给父级。您不能通过继承控件来拦截它们。
如果要更改父处理这些通知的方式,则需要将父类作为子类。