子类化子窗口c ++

时间:2016-02-08 16:56:43

标签: c++ winapi

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

我的主窗口包含一个Tab控件,其中有一个Listview控件。我试图对控件进行Subclass,但即使我遵循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 );
}

listview具有Tab控件的父级。

1 个答案:

答案 0 :(得分:0)

TCN_SELCHANGE之类的值不是消息类型,也不会自行发送给控件。它们是通知(N代表"通知")。控件通过WM_NOTIFYWM_COMMAND等消息将通知发送给父级。您不能通过继承控件来拦截它们。

如果要更改父处理这些通知的方式,则需要将父类作为子类。