我在Windows上工作,我选择了c ++作为语言。我的应用程序是一个win32应用程序,我不使用MFC类,而仅使用本机API。

我的主窗口包含一个Tab控件,其中有一个Listview控件。我试图对两个控件都进行子类化,但是即使我遵循msdn指南,它也无法正常工作。

我使用的功能是:
SetWindowLongGetWindowLong
因此我更改了孩子的程序,但似乎主窗口捕获了控件发送的每条消息(通过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_NOTIFYWM_COMMAND之类的消息将通知发送给父级。您不能通过子类化控件来拦截它们。

如果要更改父级处理这些通知的方式,则需要对父级进行子类化。

关于c++ - 子窗口C的子类化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35275030/

10-10 13:21