为什么ComboBox在设置DroppedDown时会隐藏光标?

时间:2009-07-07 15:37:04

标签: c# winforms combobox

让我们创建WinForms应用程序(我在Windows Vista上运行Visual Studio 2008,但似乎所描述的情况几乎发生在从Win98到Vista的本地或托管代码中)。

写下这样的代码:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class Form1 : Form
    {
        private readonly Button button1 = new Button();
        private readonly ComboBox comboBox1 = new ComboBox();
        private readonly TextBox textBox1 = new TextBox();

        public Form1() {
            SuspendLayout();
            textBox1.Location = new Point(21, 51);
            button1.Location = new Point(146, 49);
            button1.Text = "button1";
            button1.Click += button1_Click;
            comboBox1.Items.AddRange(new[] {"1", "2", "3", "4", "5", "6"});
            comboBox1.Location = new Point(21, 93);
            AcceptButton = button1;
            Controls.AddRange(new Control[] {textBox1, comboBox1, button1});
            Text = "Form1";
            ResumeLayout(false);
            PerformLayout();
        }

        private void button1_Click(object sender, EventArgs e) {
            comboBox1.DroppedDown = true;
        }
    }
}

然后,运行app。将鼠标光标放在窗体上,不要再触摸鼠标。开始在TextBox中键入内容 - 光标将因此而隐藏。当您按Enter键 - 事件抛出和ComboBox将被删除。但是现在光标即使移动也不会出现!只有当你点击某个地方时才会出现。

There我发现了对这个问题的讨论。但是没有好的解决方案......

有什么想法? :)

5 个答案:

答案 0 :(得分:30)

我能够解决这个问题:

comboBox1.DroppedDown = true;
Cursor.Current = Cursors.Default;

答案 1 :(得分:5)

我在Delphi应用程序上遇到了这个问题。正如建议here我刚刚在任何DropDown事件之后添加SendMessage(ComboBox1.Handle, WM_SETCURSOR, 0, 0)并且它有效。

答案 2 :(得分:1)

首先,这是一个非常模糊的环境,我无法想象它是一个有用的界面动作。

这似乎是一个错误导致程序化下拉列表在构成下拉控件的一部分的文本框中开始编辑,因此有效地双重隐藏光标。打破它...

我怀疑每个hide都会存储光标的状态并在退出时恢复它。

文本框已存储实际的光标状态并将其隐藏。

下拉列表会导致存储隐藏状态并将光标设置为隐藏状态。当你移动光标时,它可能会恢复它,但它保存到隐藏状态,因此光标保持隐藏状态。

点击表单似乎会强制重置那种情况,不知道为什么会这样,但这是我的2合计价值。

答案 3 :(得分:1)

事实上我能够以这种方式解决这个问题:

#region Dirty methods :)
#pragma warning disable 169
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

private const int MOUSEEVENTF_ABSOLUTE = 0x8000;
private const int MOUSEEVENTF_MOVE = 0x1;
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
#pragma warning restore 169
#endregion

private void button1_Click(object sender, EventArgs e) {
   Point oldCursorPos = Cursor.Position; // save pos
   Point a = comboBox1.Parent.PointToScreen(comboBox1.Location);
   a.X += comboBox1.Width - 3;
   a.Y += comboBox1.Height - 3;
   Cursor.Position = a;
   // simuate click on drop down button
   mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
   Cursor.Position = oldCursorPos; // restore pos
}

但这不是我想要的解决方案:( 这是一个拐杖而不是解决方案。

答案 4 :(得分:-1)

这是一组奇怪的情况,其中组合框是DropDownList类型,您可以在代码中调用组合框上的DroppedDown方法,无论它是否具有焦点。

光标将在表单后面消失。如果单击表单,光标将返回,但组合框将关闭,因此效果不佳。

我可以确认此代码在不关闭组合框列表的情况下修复了该问题。

cbo_VisitorTypes.DroppedDown = true;
Cursor.Current = Cursors.Default;