gpt4 book ai didi

c# - 在 C# win 表单中,如何滚动数百个项目

转载 作者:行者123 更新时间:2023-12-03 03:02:03 25 4
gpt4 key购买 nike

是否存在允许用户滚动 Windows 窗体容器中数百或数千个项目的通用设计?示例:编写一个电子邮件客户端,用户会得到平滑滚动超过 10,000 条消息“行”的印象,每封电子邮件对应一个消息“行”,但这些肯定直到显示之前才真正呈现。类似地,滚动一个巨大的图像必须将其平铺成更小的部分,但是呈现该图像的代码是如何组织的?

最佳答案

它是 Windows 设计方式固有的,不需要 3 个字母或特殊模式。

无论其风格如何,GUI 程序都会在需要执行操作时从 Windows 获取消息。消息不会按照其生成的顺序进行处理。有三个基本的“优先事项”:

  • 重要消息直接投递,winapi底层函数是SendMessage()
  • 用户输入首先存储在队列中,底层的winapi函数是PostMessage()
  • 某些消息是从窗口状态合成的,并且仅在不需要处理上述两种消息类型时才生成。

消息按上述顺序处理。首先发送已发送的消息,如果没有待处理的消息,则程序开始清空消息队列。如果为空,则调度合成消息。绘画属于第三类。程序仅在不需要执行任何其他操作时才会收到 WM_PAINT 消息。

所以基本的事件链是控件从消息队列中检索鼠标消息并检测到它是针对滚动条的。它计算滚动条 slider 的新位置并调用 InvalidateRect() winapi 函数来指示需要绘制窗口。与 Winforms 中的 Invalidate() 方法功能相同。内部窗口状态被更新以标记需要绘制来重新绘制该矩形。这一切都非常快,没有发生实际的绘画。

当程序检索下一条消息时,现在会发生两件基本的事情。当用户不断滚动时,它可能又是一条鼠标消息。处理方式与上面完全相同,除了更改拇指位置之外,窗口没有任何反应。

或者没有新消息要处理,用户停止滚动,现在轮到类别#3 合成消息。 Windows 注意到窗口需要重新绘制并传递 WM_PAINT 消息。

除此之外还有一些实现细节,更高版本的 Windows 默认情况下打开“拖动时显示窗口内容”系统选项。这使得用户在拖动拇指时更容易看到他在做什么,它故意生成额外的窗口油漆。总而言之,操作系统和程序都很好地支持在 ListView 中包含数以万计的项目。当然不是用户。

关于c# - 在 C# win 表单中,如何滚动数百个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18199791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com