c++ - 子类化子窗口 C++

标签 c++ winapi

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

我的主窗口包含一个 Tab 控件,其中有一个 Listview 控件。我尝试对这两个控件进行子类化,但即使我遵循 msdn 指南,它也不起作用。

我使用的函数是: SetWindowLongGetWindowLong 所以我改变了 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_NOTIFYWM_COMMAND 等消息将通知发送给父级。您不能通过子类化控件来拦截它们。

如果你想改变父级处理这些通知的方式,你需要继承父级。

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

相关文章:

c++ - _di_IXMLNode 中不需要的 xmlns =""

c++ - 从可变参数模板中解压参数

c++ - 在每个主机线程(多线程 CPU)上创建一个 cuda 流

c - 无法使用 GCC 从 MSDN 编译 Win32 应用程序示例

c++ - 使用 SHGetPathFromIDList 将 PIDL 转换为文件路径

c++ - 将类型 T 的多态包装器转换为类型 U?

c++ - 与 glfw3 链接时出错

windows - 坏扇区的 Writefile、Readfile 代码错误

c++ - 如何逐步遍历目录树?

windows - Windows 从休眠状态恢复时如何运行任意代码?