如何检查组合框下拉列表是向上还是向下显示

本文关键字:显示 下拉列表 何检查 检查 组合 | 更新日期: 2023-09-27 18:23:49

我有从combobox继承的控件(实现了C#、.Net 2.0)。它有过滤和其他功能。为了保持UI的正确性,当筛选期间的项目数量下降时,下拉列表会更改其大小以适应剩余的项目数量(这是由NativeMethods.SetWindowPos(…)完成的)。

有没有办法检查下拉列表是向上还是向下(字面上)显示的——不是检查它是否打开,而是检查它是打开的,而是向上还是向下?

欢呼,jbk

如何检查组合框下拉列表是向上还是向下显示

ComboBox有两个事件(DropDownDropDownClosed),它们在下拉部分打开和关闭时激发,因此您可能希望将处理程序附加到它们以监视控件的状态。

或者,还有一个布尔属性(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)
    {
         ....
    }