winforms组合框,如何在获得焦点时阻止它下降

winforms combobox, how to stop it from dropping down when getting focus

我在 winform 上有一个组合框,dropdownstyle 设置为 DropDownList。

当用户单击组合框上的任意位置时,其下拉列表将打开。 如果我使用任何其他下拉样式(DropDown 或 Simple),则情况并非如此,只有当用户单击右侧的箭头时,组合框才会打开。

我需要的是一个将 dropdownstyle 设置为 DropDownList 的组合框,但仍然只在单击右侧箭头时打开其下拉列表,而不是在单击组合框上的其他任何地方时打开,就像 dropdownstyle 为 DropDown 时一样或简单。

如果您想知道我为什么要这个,我将 DrawMode 设置为 OwnerDrawFixed 并在 DrawItem 中绘制组合框,这样它看起来很正常,而不是这种下拉样式强加给我的丑陋 3d。所以我实际上有一个只读组合框,但没有丑陋的 3d 外观。

如果需要,我可以 post 来自 DrawItem 的代码,但此代码对此行为没有任何影响,因为没有 drawitem 代码,组合框的反应完全相同。

我希望这个问题足够清楚。

我的好朋友Google救了我,这段代码似乎解决了我的问题:

const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONDBLCLK = 0x0203;

protected override void WndProc(ref Message m)
    {
        // only open dropdownlist when the user clicks on the arrow on the right, not anywhere else...
        if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONDBLCLK)
        {
            int x = m.LParam.ToInt32() & 0xFFFF;
            if (x >= Width - SystemInformation.VerticalScrollBarWidth)
                base.WndProc(ref m);
            else
            {
                Focus();
                Invalidate();
            }
        }
        else
            base.WndProc(ref m);
    }