Отключение колесика мыши и событий клавиатуры в TComboBox

Когда я использую TComboBoxПользователь может выбрать элемент, щелкнув элемент управления и выбрав элемент с помощью мыши, или может навести курсор на элемент управления и использовать колесо прокрутки, или они могут использовать клавиатуру, когда элемент управления выбран.

Как я могу отключить события колеса мыши и клавиатуры, чтобы пользователю всегда приходилось нажимать на элемент управления, когда он хочет изменить значение? Я хочу предотвратить случайное изменение их стоимости. Если это невозможно с TComboBoxесть какой-нибудь другой элемент управления со списком, который я мог бы использовать?

Для нажатия клавиши я попытался отключить поле со списком на событии KeyDown, но выбор все еще меняется. TComboBox Похоже, нет событий для колеса мыши.

2 ответа

Решение

Вы можете создать подкласс 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);
    }
}

Изменение значения требует, чтобы поле со списком имело фокус. Поэтому возможный обходной путь - удалить фокус в обработчике событий CloseUp, который вызывается после того, как пользователь выбрал значение. Однако это не полностью отключает события. Пользователь по-прежнему может выбрать элемент управления с помощью клавиши табуляции и таким образом получить фокус.

Чтобы убрать фокус в обработчике CloseUp, кажется, что этого недостаточно для установки Focused свойство родительской формы для NULL, Вы должны переместить фокус на другой элемент управления. TEdit кажется, имеет меньше побочных эффектов. Чтобы скрыть это от пользователя, вы должны установить ширину и высоту в 1, и AutoSize а также TabStop ложно. 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();
    }
}
Другие вопросы по тегам