Отключение колесика мыши и событий клавиатуры в 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();
}
}