在 TComboBox 中禁用鼠标滚轮和键盘事件
Disabling mouse wheel and keyboard events in TComboBox
当我使用 TComboBox
时,用户可以 select 通过单击控件并使用鼠标 select 和项目来 select 项目,或者他们可以将光标悬停在控件上并使用滚动滚轮,或者他们可以在 selected 控件时使用键盘。
如何禁用鼠标滚轮和键盘事件,以便用户在想要更改值时始终必须单击控件?我想防止他们意外更改值。如果 TComboBox
无法做到这一点,我可以使用其他组合框控件吗?
对于按键,我尝试在 KeyDown 事件中禁用组合框,但 selection 仍然发生变化。 TComboBox
似乎没有鼠标滚轮事件。
更改值要求组合框具有焦点。因此,一种可能的解决方法是移除 CloseUp 事件处理程序中的焦点,该事件处理程序在用户 selected 一个值后调用。但是,这并不能完全禁用事件。用户仍然可以 select 使用 Tab 键控制控件,并以此方式获得焦点。
要在 CloseUp 处理程序中移除焦点,将父窗体的 Focused
属性 设置为 NULL
似乎还不够。您必须将焦点移至另一个控件。 TEdit
似乎副作用最少。要对用户隐藏它,您必须将宽度和高度设置为 1,并将 AutoSize
和 TabStop
设置为 false。 Enable
和 Visible
必须为真。
void __fastcall TForm1::ComboBox1CloseUp(TObject *)
{
// Remove focus from this control to prevent changing value
// when drop down list is closed
if (OtherControl->CanFocus()) {
OtherControl->SetFocus();
}
}
您可以子类化 ComboBox 的 WindowProc
属性 以拦截和丢弃滚动和键盘 window 消息:
private:
TWndMethod PreviousWndProc;
__fastcall TMyForm::TMyForm(TComponent *Owner)
{
PreviousWndProc = ComboBox1->WindowProc;
ComboBox1->WindowProc = &ComboBoxWndProc;
}
void __fastcall TMyForm::ComboBoxWndProc(TMessage &Message)
{
if (
((Message.Msg < WM_KEYFIRST) || (Message.Msg > WM_KEYLAST))
&& (Message.Msg != WM_MOUSEWHEEL)
)
{
PreviousWndProc(Message);
}
}
当我使用 TComboBox
时,用户可以 select 通过单击控件并使用鼠标 select 和项目来 select 项目,或者他们可以将光标悬停在控件上并使用滚动滚轮,或者他们可以在 selected 控件时使用键盘。
如何禁用鼠标滚轮和键盘事件,以便用户在想要更改值时始终必须单击控件?我想防止他们意外更改值。如果 TComboBox
无法做到这一点,我可以使用其他组合框控件吗?
对于按键,我尝试在 KeyDown 事件中禁用组合框,但 selection 仍然发生变化。 TComboBox
似乎没有鼠标滚轮事件。
更改值要求组合框具有焦点。因此,一种可能的解决方法是移除 CloseUp 事件处理程序中的焦点,该事件处理程序在用户 selected 一个值后调用。但是,这并不能完全禁用事件。用户仍然可以 select 使用 Tab 键控制控件,并以此方式获得焦点。
要在 CloseUp 处理程序中移除焦点,将父窗体的 Focused
属性 设置为 NULL
似乎还不够。您必须将焦点移至另一个控件。 TEdit
似乎副作用最少。要对用户隐藏它,您必须将宽度和高度设置为 1,并将 AutoSize
和 TabStop
设置为 false。 Enable
和 Visible
必须为真。
void __fastcall TForm1::ComboBox1CloseUp(TObject *)
{
// Remove focus from this control to prevent changing value
// when drop down list is closed
if (OtherControl->CanFocus()) {
OtherControl->SetFocus();
}
}
您可以子类化 ComboBox 的 WindowProc
属性 以拦截和丢弃滚动和键盘 window 消息:
private:
TWndMethod PreviousWndProc;
__fastcall TMyForm::TMyForm(TComponent *Owner)
{
PreviousWndProc = ComboBox1->WindowProc;
ComboBox1->WindowProc = &ComboBoxWndProc;
}
void __fastcall TMyForm::ComboBoxWndProc(TMessage &Message)
{
if (
((Message.Msg < WM_KEYFIRST) || (Message.Msg > WM_KEYLAST))
&& (Message.Msg != WM_MOUSEWHEEL)
)
{
PreviousWndProc(Message);
}
}