我有從組合框繼承的控件(實現C#,.Net 2.0)。它有過濾和其他東西。爲了保持用戶界面的正確性,當篩選過程中的項目數量下降時,下拉列表將更改其大小以適應剩餘項目的數量(由NativeMethods.SetWindowPos(...)完成)。如何檢查組合框下拉列表是向上還是向下顯示?
是否有任何方法檢查下拉列表是否顯示上或下(字面上) - 不檢查它是否打開,是否打開,但在哪個方向上,向上或向下?
歡呼聲,JBK
我有從組合框繼承的控件(實現C#,.Net 2.0)。它有過濾和其他東西。爲了保持用戶界面的正確性,當篩選過程中的項目數量下降時,下拉列表將更改其大小以適應剩餘項目的數量(由NativeMethods.SetWindowPos(...)完成)。如何檢查組合框下拉列表是向上還是向下顯示?
是否有任何方法檢查下拉列表是否顯示上或下(字面上) - 不檢查它是否打開,是否打開,但在哪個方向上,向上或向下?
歡呼聲,JBK
所以我找到了答案:
在這裏,我們有兩個手柄,以組合框:
/// <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)
{
....
}
組合框有兩個事件時,下拉部分打開和關閉被解僱(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");
}
您還需要GetWindowRect()來找出它在哪裏。 – 2012-02-08 12:37:11
是的,我找到了答案,但我需要等待8小時才能發佈,因爲沒有至少100分:)剛剛獲取組合和下拉的句柄,從它們中獲取矩形,並比較兩者。 – jotbek 2012-02-08 12:46:49