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

本文关键字:焦点 组合 WinForms | 更新日期: 2023-09-27 18:36:25

我在通知上有一个组合框,下拉列表样式设置为DropDownList。

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

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

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

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

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

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

我的好朋友谷歌来到了resque,这段代码似乎解决了我的问题:

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);
    }