在VCL应用程序中,当我用这个中介类代码结束TListView中的水平滚动时,我试图得到通知:
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_HSCROLL和WM_VSCROLL才会不断地通知我生成大量消息。
但是我只需要在水平滚动结束时才得到通知!这个是可能的吗?
发布于 2022-02-13 00:06:48
对问题的评论是非常相关的。
首先,正如Remy所述,WM_HSCROLL消息告诉您操作是否完成:
procedure TListView.WMHScroll(var Msg: TWMHScroll);
begin
inherited;
if Msg.ScrollCode = SB_ENDSCROLL then
ShowMessage('End scroll')
end;但是,这只会让您知道水平滚动条启动的滚动操作何时完成。目前,这包括以下滚动条操作:
但是,还有许多其他方法可以滚动列表视图控件,这些方法与滚动条无关:
MultiSelect = True,使用鼠标创建一个选择矩形(开始拖动到任何列表视图项之外)因此,只对WM_HSCROLL作出反应,就不会检测到这些滚动事件。几乎可以肯定的是,无论滚动位置如何更改,您都希望在滚动位置发生变化时做出反应。
而且,正如AmigoJack所写的,还不完全清楚“结束”是什么意思(除了在拖动滚动条拇指之后释放鼠标按钮)。例如,如果使用鼠标轮滚动,结果是单个大滚动操作还是几个小滚动操作?毕竟,在任何情况下,即使是拇指跟踪,控件在每一小步都会重新绘制自己。
所以你最好的选择就是
procedure TListView.CNNotify(var Message: TMessage);
begin
inherited;
if PNMHDR(Message.lParam).code = LVN_ENDSCROLL then
// Scrolled
end;据文献资料称,
滚动操作结束时通知列表视图控件的父窗口。
请注意,文档表明,通知是在操作结束时发送的。尽管如此,您仍然会发现,当您拖动滚动条拇指时,每个小更新都会发送它。如前所述,这是合理的:滚动确实是在每一个这样的小步骤之后执行的。
https://stackoverflow.com/questions/71096100
复制相似问题