2016-11-22 132 views
0

當我使用TComboBox時,用戶可以通過單擊控件並選擇並使用鼠標選擇項目,或者可以將光標懸停在控件上並使用滾輪選擇項目,或者可以使用鍵盤當選擇控件時。禁用TComboBox中的鼠標滾輪和鍵盤事件

如何禁用鼠標滾輪和鍵盤事件,以便用戶可以隨時單擊控件,當他們想改變的價值?我想防止他們意外改變價值。如果這是不可能的TComboBox,有一些其他組合框控件,我可以用?

對於按鍵,我試圖禁用KeyDown事件組合框,但選擇仍然改變。 TComboBox似乎沒有鼠標滾輪事件。

+0

你可能只是想設置'Style'屬性'csDropDownList'。我想你會需要重寫組合類或手動處理所有事件以達到所需的行爲。 – 2016-11-22 09:54:40

+0

@RawN Style屬性已經'CsDropDownList',但似乎並沒有影響到鼠標和鍵盤的行爲。 –

回答

3

你也可以繼承的組合框的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); 
    } 
} 
0

變更值組合框具有焦點。因此,可能的解決方法是在CloseUp事件處理程序中刪除焦點,該處理程序在用戶選擇值後調用。但是,這並不能完全禁用事件。用戶仍然可以使用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(); 
    } 
}