我可以向您推荐两种(简单)方法来将 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);
}