在TComboBox

时间:2016-11-22 09:40:42

标签: c++builder tcombobox

当我使用TComboBox时,用户可以通过单击控件并使用鼠标选择项目来选择项目,或者他们可以将光标悬停在控件上并使用滚轮,或者他们可以在控件使用时使用键盘地选择。

如何禁用鼠标滚轮和键盘事件,以便用户在想要更改值时始终必须单击控件?我想阻止他们意外地改变价值。如果使用TComboBox无法做到这一点,是否还有其他一些我可以使用的组合框控件?

对于按键,我尝试在KeyDown事件上禁用组合框,但选择仍然会更改。 TComboBox似乎没有鼠标滚轮的事件。

2 个答案:

答案 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,将AutoSizeTabStop设置为false。 EnableVisible必须为真。

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();
    }
}