当我使用TComboBox
时,用户可以通过单击控件并使用鼠标选择项目来选择项目,或者他们可以将光标悬停在控件上并使用滚轮,或者他们可以在控件使用时使用键盘地选择。
如何禁用鼠标滚轮和键盘事件,以便用户在想要更改值时始终必须单击控件?我想阻止他们意外地改变价值。如果使用TComboBox
无法做到这一点,是否还有其他一些我可以使用的组合框控件?
对于按键,我尝试在KeyDown事件上禁用组合框,但选择仍然会更改。 TComboBox
似乎没有鼠标滚轮的事件。
答案 0 :(得分:3)
您可以将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);
}
}
答案 1 :(得分:0)
更改值需要组合框具有焦点。因此,可能的解决方法是在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();
}
}