【问题标题】:Disable text selection and edit for ComboBox禁用 ComboBox 的文本选择和编辑
【发布时间】:2018-07-05 15:25:56
【问题描述】:

如何防止使用ComboBoxStyle.DropDown(不是DropDownList!)设置对ComboBox 进行任何编辑和选择尝试? 我覆盖OnKeyDown 并剪切任何键盘输入,但鼠标选择事件仍然有效并且插入符号可见。

【问题讨论】:

  • ComboBox 控件包含一个 Edit 控件(编辑发生的地方)。您无权直接访问此控件。但是,您可以发送EM_SETREADONLY = 0x00CF 消息,使其成为只读。这具有将编辑控件的背景颜色更改为灰色的缺点。顺便说一句,您没有指定语言。
  • 我尝试在 OnKeyDown (PostMessage(new HandleRef(this, Handle), 0x00CF, (IntPtr)1, IntPtr.Zero);) 发送此消息,但没有任何改变。我也需要白色背景,而不是灰色。

标签: c# winforms combobox


【解决方案1】:

我可以向您推荐两种(简单)方法来将 ComboBox 文本设置为只读。

使用 SendMessage
在这种情况下,ComboBox 底层 Edit 控件设置为只读,并且 - 如前所述 - 它的背景颜色使用非活动/禁用颜色 (LTGRAY_BRUSH) 绘制。
与将TextBox 控件的ReadOnly 属性设置为true 相同。

[DllImport("User32.dll")]
internal static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("User32.dll", SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, uint uMsg, int wParam, int lParam);

private const uint EM_SETREADONLY = 0x00CF;

private void Form1_Load(object sender, EventArgs e)
{
    IntPtr EditHandle = FindWindowEx(comboBox1.Handle, IntPtr.Zero, "Edit", null);
    SendMessage(EditHandle, EM_SETREADONLY, 1, 0);
}

使用 Control KeyDown 事件放弃任何按键
在这种情况下,ComboBox 背景颜色当然不会改变,但可能会出现不希望的行为,具体取决于其使用情况。

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = true;
}

更新

隐藏插入符号的方法(无需子类化或继承):
在这里,我再次使用FindWindowEx。您可以将IntPtr EditHandle 分配给类范围变量,并在Form Load 事件中获取一次编辑控件句柄。

[DllImport("user32")]
internal static extern bool HideCaret(IntPtr hWnd);

[DllImport("user32")]
internal static extern bool ShowCaret(IntPtr hWnd);

private void comboBox1_MouseUp(object sender, MouseEventArgs e)
{
    comboBox1.Select(0, 0);
    IntPtr EditHandle = FindWindowEx(comboBox1.Handle, IntPtr.Zero, "Edit", null);
    HideCaret(EditHandle);
}

【讨论】:

  • 谢谢。但是闪烁的光标仍然可见,我们也可以摆脱插入符号吗?
  • @Igor Strelkov 查看更新。但是,鉴于您的要求,看起来您确实需要一个 DropDownList。
  • @IgorStrelkov 只需使用EnableWindow(EditHandle, False)。如果您想保持颜色不变,您需要使用正确的画笔和/或使用SetBkColor() 回复WM_CTLCOLOR* 消息。
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多