如何在WIN32 API中“通知”父窗口有关子窗口“列表框”控件的“滚动事件”?

Posted

技术标签:

【中文标题】如何在WIN32 API中“通知”父窗口有关子窗口“列表框”控件的“滚动事件”?【英文标题】:How to "notify" parent window about "scroll event" of child window "list box" control in WIN32 API? 【发布时间】:2013-08-15 12:32:45 【问题描述】:

如何“通知”父窗口关于其子窗口“列表框”控件的“滚动事件”,每次在WIN32 API中向上或向下滚动?

我正在尝试使用 WIN32 API 制作一个字典。我创建了一个父窗口,然后在里面创建了一个子窗口列表框控件。

我想从数据库中一次将“50个单词列表”添加到列表框控件中,这样应用程序在启动过程中根本不需要花费时间。

然后,我想跟踪 "滚动条位置""SCROLLINFO" 结构的 "nPos" 值) 当用户向上或向下滚动单词列表时,我可以调用一个函数,当列表框几乎向上滚动到底部时,它会在列表框的末尾再添加 50 个单词。

主窗口程序函数中,在“switch”语句中,我使用了“WM_VSCROLL”窗口消息,希望能抓住孩子窗口列表框控件的滚动事件。子窗口列表框控件具有"LBS_NOTIFY" 样式。但一切都是徒劳的!列表框控件的滚动事件未通知其父窗口。父窗口在其子窗口列表框控件的滚动事件的 "WM_VSCROLL" 消息中也没有做任何事情。

请帮助我,指导我,用代码示例向我展示如何“通知”父窗口关于其子窗口的“滚动事件”,a “列表框”控件,在WIN32 API中每次向上或向下滚动。

【问题讨论】:

【参考方案1】:

滚动消息仅发送到实际正在滚动的窗口,在本例中为 ListBox。 LBS_NOTIFY 仅适用于少数选择消息,不包括滚动消息。您必须通过 SetWindowLongPtr(GWL_WNDPROC)SetWindowSubclass() 对 ListBox 进行子类化,并让您的子类过程捕获滚动消息并根据需要将信息转发到父窗口。

【讨论】:

非常感谢您的回复。我还在这里找到了一个非常有用的链接:***.com/questions/239866/…

以上是关于如何在WIN32 API中“通知”父窗口有关子窗口“列表框”控件的“滚动事件”?的主要内容,如果未能解决你的问题,请参考以下文章

Win32API 消息机制

如何在 win32API 中更改静态窗口的背景颜色? [复制]

WIN32 API 中 WM_MOUSEHOVER 上的弹出窗口 - 如何关闭它?

Win32 API 打开新窗口

WPF OpenFileDialog 与 Win32 父窗口;窗口关闭时没有重新获得焦点

perl win32 api 如何遍历已打开窗口,获得每个窗口的标题内容