当我使用 时TComboBox
,用户可以通过单击控件并用鼠标选择项目来选择项目,或者他们可以将光标悬停在控件上并使用滚轮,或者在选择控件时可以使用键盘。
如何禁用鼠标滚轮和键盘事件,以便用户在想要更改值时始终必须单击控件?我想防止他们意外更改值。如果这是不可能的TComboBox
,还有其他一些我可以使用的组合框控件吗?
对于按键,我尝试禁用 KeyDown 事件上的组合框,但选择仍然改变。TComboBox
似乎没有鼠标滚轮的事件。
当我使用 时TComboBox
,用户可以通过单击控件并用鼠标选择项目来选择项目,或者他们可以将光标悬停在控件上并使用滚轮,或者在选择控件时可以使用键盘。
如何禁用鼠标滚轮和键盘事件,以便用户在想要更改值时始终必须单击控件?我想防止他们意外更改值。如果这是不可能的TComboBox
,还有其他一些我可以使用的组合框控件吗?
对于按键,我尝试禁用 KeyDown 事件上的组合框,但选择仍然改变。TComboBox
似乎没有鼠标滚轮的事件。
您可以继承 ComboBox 的WindowProc
属性来拦截和丢弃滚动和键盘窗口消息:
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);
}
}
更改值要求组合框具有焦点。因此,一种可能的解决方法是在用户选择一个值后调用 CloseUp 事件处理程序中的焦点。但是,这并不能完全禁用事件。用户仍然可以使用 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();
}
}