Winapi PtInRect与子窗口

Winapi PtInRect与子窗口,winapi,mfc,wtl,Winapi,Mfc,Wtl,我见过一些例子,人们使用DrawFrameControl和PtInRect(将鼠标位置测试到框架控件的矩形)来模拟控件(如按钮)的效果。为什么要这样做,而不是使用子窗口 使用此技术的一个示例是,停靠窗口的“关闭”按钮不是物理窗口 对于我正在编写的应用程序,我使用的是一个列表视图控件,它最多可以容纳1000个项目。每个项目将举行,让我们说,10个按钮。所有按钮都是自定义绘制的 使用PtInRect机制是否会被认为是一种更有效(更快)的方法?每个流程都有一个。为1000个项目中的每个项目创建10个按

我见过一些例子,人们使用
DrawFrameControl
PtInRect
(将鼠标位置测试到框架控件的矩形)来模拟控件(如按钮)的效果。为什么要这样做,而不是使用子窗口

使用此技术的一个示例是,停靠窗口的“关闭”按钮不是物理窗口

对于我正在编写的应用程序,我使用的是一个列表视图控件,它最多可以容纳1000个项目。每个项目将举行,让我们说,10个按钮。所有按钮都是自定义绘制的

使用
PtInRect
机制是否会被认为是一种更有效(更快)的方法?

每个流程都有一个。为1000个项目中的每个项目创建10个按钮的窗口不仅效率低下,而且不一定可行


回答您的问题:是的,通过自己绘制和点击测试来创建“虚拟”按钮是一个更好的解决方案。

使用单独的子窗口会带来一定的开销。每个子级都有自己的属性:窗口类、样式、窗口过程、位置、所属线程等。如果需要管理大量这样的子级,它们的许多属性很可能是相同的,从而浪费系统资源。将它们作为单独的窗口进行管理也可能变得更加困难:

  • 你可能会注意到绘画上的小故障。每个窗口都在某种程度上独立于其他窗口进行绘制,因此当有人在多个子窗口的顶部移动另一个窗口,然后将其移开时,根据您组织事物的方式,您可能会看到令人不快的中间状态,例如,在孩子重新绘制之前,背景被重新绘制,每个孩子的位置上都有可见的孔。也许能帮上忙

  • 无论何时需要重新定位这些子级,都需要使用函数族,否则会遇到类似的重新绘制问题

  • 所有这些孩子都需要单独的消息来操作

毕竟,模拟这些孩子可能更简单。我的感觉是,试图在列表视图的顶部放置10000个按钮将更难实现,并且会遇到上述视觉问题。将
DrawFrameControl
与所有者绘制列表视图项一起使用,很可能会使实现更简单,视觉效果更好

此外,正如@arx所指出的,您可以创建的窗口数量也有限制