PtInRect与子窗口

3
我曾经看到人们使用 DrawFrameControlPtInRect(在鼠标位置测试框架控件的矩形)来模拟拥有控件(如按钮)的效果。为什么要这样做,而不使用子窗口呢?
一个使用这种技术的例子是 这个停靠框架,其中停靠窗口的关闭按钮不是一个物理窗口。
对于我正在编写的应用程序,我正在使用一个列表视图控件,它将容纳多达1000个项目。每个项目将包含,假设,10个按钮。所有按钮都是自定义绘制的。
对于这个问题,是否考虑使用 PtInRect 机制会更有效率(更快)?
2个回答

6
每个进程有大约10,000个窗口句柄的限制。为1,000个项目上的每个按钮创建窗口不仅效率低下,而且可能不可行。
回答你的问题:是的,通过自己绘制和命中测试来创建“虚拟”按钮是一个更好的解决方案。

3
拥有单独的子窗口会带来一定的开销。每个子窗口都有自己的属性:窗口类、样式、窗口过程、位置、所属线程等等。如果您需要管理大量这样的子窗口,它们的许多属性很可能是相同的,浪费系统资源。同时,将它们作为单独的窗口进行管理也可能变得更加困难:
- 您可能会注意到绘图问题。每个窗口在某种程度上都是相互独立的,因此当其他窗口移动到覆盖您的多子窗口并将其移开时,根据您组织事物的方式,您可能会看到不愉快的中间状态,例如背景被重新绘制,每个子窗口的位置处出现可见的空洞,然后子窗口才重新绘制。CS_PARENTDC 可能有所帮助。
- 每当需要重新定位这些子窗口时,您需要使用 DeferWindowPos 函数族,否则将遇到类似的重绘问题。
- 所有这些子窗口都需要单独的消息来进行操作。

毕竟,模拟这些孩子可能会更简单。我认为,试图在列表视图顶部放置10000个按钮将更难实现,并且会遭受上述视觉问题的困扰。使用具有所有者绘制列表视图项的DrawFrameControl可能会使您拥有更简单的实现和更好的视觉效果。

此外,正如@arx所指出的那样,您可以创建的窗口数量是有限的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接