我见过人们使用DrawFrameControl
和PtInRect
(鼠标位置被测试到框架控件的矩形)的情况,以模拟控件的效果(像一个按钮)。你为什么要这样做,而不是使用子窗口?
使用此技术的示例是this docking framework,其中停靠窗口的关闭按钮不是物理窗口。
对于我正在写的应用程序,我使用的列表视图控件最多可容纳1000个项目。每个项目都会保留,比方说10个按钮。所有按钮都是自定义绘制的。
为此使用PtInRect
机制是否会被认为是一种更有效(更快)的方法?
答案 0 :(得分:6)
每个流程都有一个limit of about 10,000 window handles。在1,000个项目中的每个项目上创建10个按钮的窗口不仅效率低下,而且也不一定是可能的。
回答你的问题:是的,创建"虚拟"通过绘画和点击测试自己的按钮是一个更好的解决方案。
答案 1 :(得分:3)
具有单独的子窗口会带来一定的开销。每个子节点都有自己的属性:窗口类,样式,窗口过程,位置,拥有线程等。如果你需要管理大量这样的子节点,它们的许多属性很可能是相同的,浪费系统资源。将它们作为单独的窗口管理也可能变得更加困难:
您可能会注意到绘画故障。每个窗口在某种程度上独立于其他窗口绘制,因此当有人在多子窗口顶部移动另一个窗口然后将其移开时,根据您组织事物的方式,您可能会看到令人不快的中间状态,例如背景被重绘,其中可见孔洞儿童重绘前每个孩子的位置。 CS_PARENTDC可能有助于此。
每当您需要重新定位这些孩子时,您需要使用DeferWindowPos系列功能,否则会遇到类似的重新绘制问题。
所有这些孩子都需要单独的消息来操纵。
毕竟,模拟这些孩子可能更简单。我的感觉是,尝试在列表视图上放置10000个按钮将更难实现,并且将遭受上述视觉问题。将DrawFrameControl
与所有者绘制的列表视图项一起使用,很可能会让您更简单的实现,并获得更好的视觉效果。
除了@arx指出的,你可以创建的窗口数量有限制。