首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TListView水平滚动结束时发出通知?

如何在TListView水平滚动结束时发出通知?
EN

Stack Overflow用户
提问于 2022-02-12 21:42:46
回答 1查看 267关注 0票数 0

在VCL应用程序中,当我用这个中介类代码结束TListView中的水平滚动时,我试图得到通知:

代码语言:javascript
复制
type  
  TListView = class(Vcl.ComCtrls.TListView)
  private
    procedure WMNotify(var AMessage: TWMNotify); message WM_NOTIFY; // used for other purposes
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
    procedure WMVScroll(var Msg: TWMHScroll); message WM_VSCROLL;
    procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
  protected
    procedure CreateWnd; override;  
  end;

implementation

procedure TListView.CNCommand(var Message: TWMCommand);
begin
   case Message.NotifyCode of
    EN_VSCROLL: CodeSite.Send('TListView.CNCommand: EN_VSCROLL'); // does not work
    EN_HSCROLL: CodeSite.Send('TListView.CNCommand: EN_HSCROLL'); // does not work
   end;
   inherited ;
end;

procedure TListView.WMHScroll(var Msg: TWMHScroll);
begin
   CodeSite.Send('TListView.WMHScroll: WM_HSCROLL'); // does work
   inherited;
end;

procedure TListView.WMVScroll(var Msg: TWMHScroll);
begin
   CodeSite.Send('TListView.WMVScroll: WM_VSCROLL'); // does work
   inherited;
end;

但是,只有在滚动时,WM_HSCROLLWM_VSCROLL才会不断地通知我生成大量消息。

但是我只需要在水平滚动结束时才得到通知!这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-13 00:06:48

对问题的评论是非常相关的。

首先,正如Remy所述,WM_HSCROLL消息告诉您操作是否完成:

代码语言:javascript
复制
procedure TListView.WMHScroll(var Msg: TWMHScroll);
begin
  inherited;
  if Msg.ScrollCode = SB_ENDSCROLL then
    ShowMessage('End scroll')
end;

但是,这只会让您知道水平滚动条启动的滚动操作何时完成。目前,这包括以下滚动条操作:

  • 拇指松开
  • 单击滚动条左或右按钮
  • 单击滚动条空区域(用于页面滚动)
  • 选定滚动条上下文菜单项

但是,还有许多其他方法可以滚动列表视图控件,这些方法与滚动条无关:

  • 使用鼠标的水平滚动轮(如果只有水平滚动条而没有垂直滚动条,则使用标准垂直滚轮)
  • 使用键盘的左右箭头键(或Ctrl+左/右为页面滚动)
  • 使用MultiSelect = True,使用鼠标创建一个选择矩形(开始拖动到任何列表视图项之外)

因此,只对WM_HSCROLL作出反应,就不会检测到这些滚动事件。几乎可以肯定的是,无论滚动位置如何更改,您都希望在滚动位置发生变化时做出反应。

而且,正如AmigoJack所写的,还不完全清楚“结束”是什么意思(除了在拖动滚动条拇指之后释放鼠标按钮)。例如,如果使用鼠标轮滚动,结果是单个大滚动操作还是几个小滚动操作?毕竟,在任何情况下,即使是拇指跟踪,控件在每一小步都会重新绘制自己。

所以你最好的选择就是

代码语言:javascript
复制
procedure TListView.CNNotify(var Message: TMessage);
begin
  inherited;
  if PNMHDR(Message.lParam).code = LVN_ENDSCROLL then
    // Scrolled
end;

文献资料称,

滚动操作结束时通知列表视图控件的父窗口。

请注意,文档表明,通知是在操作结束时发送的。尽管如此,您仍然会发现,当您拖动滚动条拇指时,每个小更新都会发送它。如前所述,这是合理的:滚动确实是在每一个这样的小步骤之后执行的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71096100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档