如何检查组合框下拉列表是向上还是向下显示
本文关键字:显示 下拉列表 何检查 检查 组合 | 更新日期: 2023-09-27 18:23:49
我有从combobox继承的控件(实现了C#、.Net 2.0)。它有过滤和其他功能。为了保持UI的正确性,当筛选期间的项目数量下降时,下拉列表会更改其大小以适应剩余的项目数量(这是由NativeMethods.SetWindowPos(…)完成的)。
有没有办法检查下拉列表是向上还是向下(字面上)显示的——不是检查它是否打开,而是检查它是打开的,而是向上还是向下?
欢呼,jbk
ComboBox有两个事件(DropDown
和DropDownClosed
),它们在下拉部分打开和关闭时激发,因此您可能希望将处理程序附加到它们以监视控件的状态。
或者,还有一个布尔属性(DroppedDown
),它应该告诉您当前状态。
组合框根据它们必须打开的空间向下或向上打开:如果它们下面有可用空间,它们将像往常一样向下打开,如果没有,它们将向上打开。
所以你只需要检查它们下面是否有足够的空间就可以知道。试试这个代码:
void CmbTestDropDown(object sender, EventArgs e)
{
Point p = this.PointToScreen(cmbTest.Location);
int locationControl = p.Y; // location on the Y axis
int screenHeight = Screen.GetBounds(new Point(0,0)).Bottom; // lowest point
if ((screenHeight - locationControl) < cmbTest.DropDownHeight)
MessageBox.Show("it'll open upwards");
else MessageBox.Show("it'll open downwards");
}
所以我找到了一个答案:
这里我们有combobox的两个句柄:
/// <summary>
/// Gets a handle to the combobox
/// </summary>
private IntPtr HwndCombo
{
get
{
COMBOBOXINFO pcbi = new COMBOBOXINFO();
pcbi.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(pcbi);
NativeMethods.GetComboBoxInfo(this.Handle, ref pcbi);
return pcbi.hwndCombo;
}
}
和下拉列表的组合框:
/// <summary>
/// Gets a handle to the combo's drop-down list
/// </summary>
private IntPtr HwndDropDown
{
get
{
COMBOBOXINFO pcbi = new COMBOBOXINFO();
pcbi.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(pcbi);
NativeMethods.GetComboBoxInfo(this.Handle, ref pcbi);
return pcbi.hwndList;
}
}
现在,我们可以从句柄中获取矩形:
RECT comboBoxRectangle;
NativeMethods.GetWindowRect((IntPtr)this.HwndCombo, out comboBoxRectangle);
和
// get coordinates of combo's drop down list
RECT dropDownListRectangle;
NativeMethods.GetWindowRect((IntPtr)this.HwndDropDown, out dropDownListRectangle);
现在我们可以检查:
if (comboBoxRectangle.Top > dropDownListRectangle.Top)
{
....
}