【问题标题】:Disabling mouse wheel and keyboard events in TComboBox在 TComboBox 中禁用鼠标滚轮和键盘事件
【发布时间】:2016-11-22 09:40:42
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能只想将Style 属性设置为csDropDownList。我认为您需要覆盖组合类或手动处理所有事件才能实现所需的行为。
  • @RawN Style 属性已经是CsDropDownList,但这似乎不会影响鼠标和键盘的行为。

标签: c++builder tcombobox


【解决方案1】:

您可以继承 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);
    }
}

【讨论】:

    【解决方案2】:

    更改值要求组合框具有焦点。因此,一种可能的解决方法是移除 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多