2012-02-08 66 views
3

我有從組合框繼承的控件(實現C#,.Net 2.0)。它有過濾和其他東西。爲了保持用戶界面的正確性,當篩選過程中的項目數量下降時,下拉列表將更改其大小以適應剩餘項目的數量(由NativeMethods.SetWindowPos(...)完成)。如何檢查組合框下拉列表是向上還是向下顯示?

是否有任何方法檢查下拉列表是否顯示上或下(字面上) - 不檢查它是否打開,是否打開,但在哪個方向上,向上或向下?

歡呼聲,JBK

+0

您還需要GetWindowRect()來找出它在哪裏。 – 2012-02-08 12:37:11

+0

是的,我找到了答案,但我需要等待8小時才能發佈,因爲沒有至少100分:)剛剛獲取組合和下拉的句柄,從它們中獲取矩形,並比較兩者。 – jotbek 2012-02-08 12:46:49

回答

1

所以我找到了答案:

在這裏,我們有兩個手柄,以組合框:

/// <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) 
    { 
     .... 
    } 
3

組合框有兩個事件時,下拉部分打開和關閉被解僱(DropDownDropDownClosed),所以你可能希望處理程序附加到他們監視控制的狀態。

另外,還有一個布爾屬性(DroppedDown)應該告訴你當前的狀態。

+0

是的,但實際上我想知道是否顯示下拉菜單(字面意思)。我的意思是我知道何時組合顯示,但它可以顯示上或下取決於組合框在屏幕上的位置。 – jotbek 2012-02-08 12:19:27

+0

噢,你的意思是下拉列表部分顯示在文本字段的上面還是下面? – 2012-02-08 12:30:23

+0

是的,確切地說。 :) – jotbek 2012-02-08 12:40:15

1

組合框向下或向上開放,取決於他們必須打開的空間:如果他們在他們下面有可用空間,他們會像往常一樣向下開放,否則他們會向上打開。

所以你只需要檢查他們是否有足夠的空間在他們下面知道。試試這個代碼:

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"); 
} 
相關問題