windows - 有没有办法跟踪来自 TComboBox 的滚动条消息?

标签 windows delphi winapi combobox delphi-6

在我的扩展 TComboBox 类中,我覆盖了 ComboWndProc() 过程处理程序,但是我无法从列表的滚动条中检测到 CN_VSCROLL 和 WM_VSCROLL 消息(FListHandle).

我基本上想使用 winapi 实现无限滚动。
我想,为了做我想做的事,我基本上需要知道滚动条的轨迹条位置,所以当轨迹条触摸下行按钮时,我会向字符串添加更多数据。

这个想法很简单,也许很天真,但我可以从那里开始,看看我会遇到什么问题。

有可能做这样的事情吗?

有没有办法跟踪来自 TComboBox 的滚动条消息?

更重要的是:

  • 如果是,如何
  • 如果不是,为什么

最佳答案

您可以使用WM_VSCROLL,为此您必须继承组合框的列表框控件。 CN_VSCROLL 将不起作用,因为组合框的列表框部分不是 VCL 控件。

下面的例子基本上来自this answer Kobik,为了完整起见包含在这里。

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FComboListWnd: HWND;
    FComboListWndProc, FSaveComboListWndProc: Pointer;
    procedure ComboListWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Info: TComboBoxInfo;
begin
  ZeroMemory(@Info, SizeOf(Info));
  Info.cbSize := SizeOf(Info);
  GetComboBoxInfo(ComboBox1.Handle, Info);
  FComboListWnd := Info.hwndList;
  FComboListWndProc := classes.MakeObjectInstance(ComboListWndProc);
  FSaveComboListWndProc := Pointer(GetWindowLong(FComboListWnd, GWL_WNDPROC));
  SetWindowLong(FComboListWnd, GWL_WNDPROC, Longint(FComboListWndProc));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetWindowLong(FComboListWnd, GWL_WNDPROC, Longint(FSaveComboListWndProc));
  classes.FreeObjectInstance(FComboListWndProc);
end;

procedure TForm1.ComboListWndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_VSCROLL: OutputDebugString('scrolling');
  end;
  Message.Result := CallWindowProc(FSaveComboListWndProc,
      FComboListWnd, Message.Msg, Message.WParam, Message.LParam);
end;

关于windows - 有没有办法跟踪来自 TComboBox 的滚动条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877919/

相关文章:

c++ - WTL 子窗口事件处理

mysql - Delphi Firemonkey XE8 - 如何使用 DataSnap 正确发送/接收图像

delphi - 为什么 C++ Builder 和 Delphi 类名以字母 T 开头?

c++ - Windows API : Detecting when a driver install has finished

windows - mysqldump 是否返回我可以在批处理文件中使用的错误代码?

delphi - Delphi 中的动态赋值

winapi - 按 Esc 键关闭 TaskDialog

c - 遍历堆栈

windows - 在 Windows 上确定磁盘几何结构

python - 使用具有跨平台支持的 python 调整显示分辨率