我在 Windows 上工作,我选择了 C++ 作为语言。我的应用程序是一个 win32 应用程序,我没有使用 MFC 类,而只使用 native API。
我的主窗口包含一个 Tab 控件,其中有一个 Listview 控件。我尝试对这两个控件进行子类化,但即使我遵循 msdn 指南,它也不起作用。
我使用的函数是:
SetWindowLong
和 GetWindowLong
所以我改变了 child 的程序,但似乎主窗口捕获了控制发送的每条消息(通过 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 控件。
最佳答案
像 TCN_SELCHANGE
这样的值不是消息类型,它们不会发送到控件本身。它们是通知(N
代表“通知”)。控件使用 WM_NOTIFY
或 WM_COMMAND
等消息将通知发送给父级。您不能通过子类化控件来拦截它们。
如果你想改变父级处理这些通知的方式,你需要继承父级。
关于c++ - 子类化子窗口 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35275030/