- public partial class Form1 : Form, IMessageFilter
- {
- public Form1()
- {
- InitializeComponent();
- Application.AddMessageFilter(this);
- }
- private GcComboBox _cbx;
- private void Form1_Load(object sender, EventArgs e)
- {
- GcComboBox cbx = new GcComboBox();
- _cbx = cbx;
- cbx.ListColumns.Add(new ListColumn("ID"));
- cbx.ListColumns.Add(new ListColumn("Name"));
- cbx.Items.Add(new ListItem("", ""));
- cbx.Items.Add(new ListItem("010", "010:A"));
- cbx.Items.Add(new ListItem("020", "020:B"));
- cbx.Items.Add(new ListItem("030", "030:C"));
- cbx.Items.Add(new ListItem("040", "040:D"));
- this.Controls.Add(cbx);
- cbx.DropDownStyle = ComboBoxStyle.DropDownList;
- }
- public bool PreFilterMessage(ref Message m)
- {
- if (m.Msg == 0x0100) // WM_KEYDOWN
- {
- if (_cbx.Focused || _cbx.DroppedDown)
- {
- // Add your customized logic here.
- return true;
- }
- }
- return false;
- }
- }
复制代码 GcComboBoxCell和标准的ComboBox/ListBox的策略一样,仅匹配首字母。
如果你有匹配前序多个字符的需求,看样子只能通过MessageFilter过滤掉部分的KeyDown事件。
使用InputMan写的代码示例如上所示。
希望能用的上。
注意:因为MessageFilter是针对整个Application的,所以,使用起来要比较小心。必须精确判断当前正在处理消息的是GcComboBoxCellEditor,并且已经DroppedDown了。 |