WinForms 组合框,如何在获得焦点时阻止它下降
本文关键字:焦点 组合 WinForms | 更新日期: 2023-09-27 18:36:25
我在通知上有一个组合框,下拉列表样式设置为DropDownList。
当用户单击组合框上的任意位置时,将打开其下拉列表。如果我使用任何其他下拉列表样式(下拉列表或简单),则情况并非如此,组合框仅在用户单击右侧箭头时打开。
我需要的是一个下拉列表样式设置为DropDownList的组合框,但仍然仅在单击右侧箭头时打开其下拉列表,而不是在单击组合框上的任何其他位置时打开其下拉列表,就像下拉列表样式为下拉列表或简单时一样。
如果你想知道我为什么要这个,我把绘图模式设置为OwnerDrawFixed,在DrawItem中,我画了组合框,让它看起来很正常,而不是这个下拉样式强加给我的丑陋的3d。所以我实际上有一个只读组合框,但没有丑陋的 3d 外观。
如果需要,我可以从 DrawItem 发布代码,但此代码对此行为没有任何影响,因为如果没有 drawitem 代码,组合框的反应完全相同。
我希望这个问题足够清楚。
我的好朋友谷歌来到了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);
}