取出
TComboBox
并将其放在 TScrollBox
上。在OnMouseWheel
的TScrollBox
事件中,垂直滚动条的位置调整如下:
void __fastcall TForm1::ScrollBox1MouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
TPoint &MousePos, bool &Handled)
{
ScrollBox1->VertScrollBar->Position = ScrollBox1->VertScrollBar->Position - WheelDelta;
Handled = true;
}
如果
TComboBox
的下拉列表展开,并且用鼠标滚轮滚动到 TComboBox
之外,TComboBox
会移动,但下拉列表仍保持在之前的位置。
我发现了一个老式的 Windows 10 操作系统表单,那里的
TComboBox
显示了相同的行为,所以这似乎是默认的。
一个简单的方法就是将
DroppedDown
事件中的 TComboBox
的 OnMouseWheel
属性设置为 false。然而,在实际应用中TComboBox
是未知的。所以你必须在 TComboBox
的控制列表中搜索相应的 TScrollBox
。
理想情况下,当您单击
TComboBox
之外的某些内容(隐藏下拉列表)时,行为应该类似于默认行为。不幸的是,我无法弄清楚这是如何在 VCL 中实现的。
您知道如何实现这一点吗?
正如您已经注意到的,如果 TComboBox 失去焦点,它会关闭其下拉列表,因此您可以使用语法将焦点切换到 ScrollBox,例如使用
ScrollBox1->SetFocus;