只读的组合框

介绍 和很多人一样,

  

我也在寻找只读组合盒。大多数可用的代码示例都是复杂的,有一些错误,或者不是我们想要的那种只读的。所以我去寻找一个简单的解决方案,使用Windows消息保持下拉菜单关闭。正如您将在本文中看到的,代码非常简单。 使用的代码 从组合框继承类并覆盖可以修改类值的事件。在events下,您可以检查combobox是否为只读,以及块或忽略输入。 隐藏,收缩,复制Code

// =============================================
// Author: KC
// Create date: 03/05/07
// Description: ReadOonly ComboBox
// =============================================
    class RoComboBox : System.Windows.Forms.ComboBox
    {
        private bool readOnly;
        public bool ReadOnly
        {
            get { return readOnly;}
            set { readOnly = value;}
        }
        protected override void  
            OnKeyDown(System.Windows.Forms.KeyEventArgs e)
        {
            if (readOnly)
                e.Handled = true;
             base.OnKeyDown(e);
        }
        protected override void 
            OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
        {
            if (readOnly)
                e.Handled = true;
            base.OnKeyPress(e);
        }
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            // WM_LBUTTONDOWN && WM_LBUTTONDBLCLK
            if ((m.Msg != 0x201 && m.Msg != 0x203) || !readOnly)
                base.WndProc(ref m);
        }
    }

那么,这段代码是干什么的呢? 它添加了一个私有字段和一个名为ReadOnly的属性。 隐藏,复制Code

private bool readOnly;
       public bool ReadOnly
       {
           get { return readOnly;}
           set { readOnly = value;}
       }

覆盖按键和按键;检查属性ReadOnly是否为真并设置为已处理。然后按键将不会修改组合框的值。 隐藏,复制Code

protected override void
    OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
    if (readOnly)
        e.Handled = true;
     base.OnKeyDown(e);
}

protected override void
    OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
    if (readOnly)
        e.Handled = true;
    base.OnKeyPress(e);
}

您必须做的最后一件事是阻止鼠标,以防止下拉菜单打开。您可以通过重写combobox的WndProc并检查Windows消息的类型来实现这一点。当设置属性ReadOnly时,阻塞鼠标按钮。 隐藏,复制Code

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    // WM_LBUTTONDOWN && WM_LBUTTONDBLCLK
    if ((m.Msg != 0x201 && m.Msg != 0x203) || !readOnly)
        base.WndProc(ref m);
}

的兴趣点 如果你想知道更多关于Windows消息的信息,或者为它们寻找一些常量值,请访问http://www.pinvoke.net/default.aspx/Constants.WM 历史 原始版本发布于:2007年5月7日 本文转载于:http://www.diyabc.com/frontweb/news349.html

原文地址:https://www.cnblogs.com/Dincat/p/13438309.html