在TCOMBOBOX中禁用鼠标车轮和键盘事件



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

如何禁用鼠标车轮和键盘事件,以便用户在要更改值时始终必须单击控件?我想防止他们偶然更改价值。如果TComboBox不可能,是否还有其他我可以使用的组合框控件?

对于按键按下,我尝试禁用键盘事件上的组合框,但是选择仍然更改。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);
    }
}

更改值要求组合框具有焦点。因此,可能的解决方法是删除特写事件处理程序中的焦点,在用户选择一个值之后,它被称为。但是,这并不能完全禁用事件。用户仍然可以使用TAB键选择控件,并以这种方式获得焦点。

要删除特写处理程序中的焦点,似乎不足以将父表格的 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();
    }
}

相关内容

  • 没有找到相关文章

最新更新