我在Windows上工作,我选择了c ++作为语言。我的应用程序是一个win32应用程序,我不使用MFC类,而仅使用本机API。
我的主窗口包含一个Tab控件,其中有一个Listview控件。我试图对两个控件都进行子类化,但是即使我遵循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 );
}
列表视图具有Tab控件作为父控件。
最佳答案
像TCN_SELCHANGE
这样的值不是消息类型,它们本身不会发送到控件。它们是通知(N
代表“通知”)。控件使用WM_NOTIFY
或WM_COMMAND
之类的消息将通知发送给父级。您不能通过子类化控件来拦截它们。
如果要更改父级处理这些通知的方式,则需要对父级进行子类化。
关于c++ - 子窗口C的子类化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35275030/