首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TComboBox中禁用鼠标轮和键盘事件

在TComboBox中禁用鼠标轮和键盘事件
EN

Stack Overflow用户
提问于 2016-11-22 09:40:42
回答 2查看 683关注 0票数 0

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-22 17:12:50

您可以对ComboBox的WindowProc属性进行子类,以拦截和丢弃滚动和键盘窗口消息:

代码语言:javascript
复制
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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-11-22 11:15:07

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

要删除CloseUp处理程序中的焦点,仅将父窗体的Focused属性设置为NULL似乎是不够的。必须将焦点移到另一个控件。TEdit的副作用似乎最少。要对用户隐藏它,必须将宽度和高度设置为1,将AutoSizeTabStop设置为false。EnableVisible必须是真的。

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40738362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档