2012-02-08 3 views
3

У меня есть контроль (реализованный C#, .Net 2.0), который наследуется от combobox. У него есть фильтрация и прочее. Чтобы сохранить пользовательский интерфейс вправо, когда количество элементов во время фильтрации падает, выпадающий список меняет свой размер, чтобы соответствовать количеству оставшихся элементов (это делается с помощью NativeMethods.SetWindowPos (...)).Как проверить, раскрывается ли список выпадающих списков вверх или вниз?

Есть ли способ проверить, раскрывается ли раскрывающийся список вверх или вниз (буквально) - не проверять, открыт ли он, он открыт, но в каком направлении, вверх или вниз?

веселит, ЖКИ

+0

Вам также нужно GetWindowRect(), чтобы выяснить, где он находится. –

+0

Да, я нашел ответ, но мне нужно подождать 8 часов, чтобы опубликовать его, потому что у него не менее 100 баллов :) Вскоре получите ручки для комбо и выпадающего списка, получите прямоугольник от них и сравните оба. – jotbek

ответ

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; 
     } 
    } 

И DROPDOWNLIST из выпадающего списка:

/// <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

выпадающий список имеет два события (DropDown и DropDownClosed), которые запускаются, когда выпадающая часть открывается и закрывается, так что вы можете прикрепить обработчики к ним следить за состоянием управления.

В качестве альтернативы существует также логическое свойство (DroppedDown), которое должно указывать текущее состояние.

+0

Да, но на самом деле я хотел бы знать, раскрывается ли раскрывающееся меню вверх или вниз (буквально). Я имею в виду, что я знаю, когда раскрывается комбо, но он может показывать вверх или вниз, зависит от позиции combobox на экране. – jotbek

+0

О, вы имеете в виду, отображается ли раскрывающийся список выше или ниже текстового поля? –

+0

Да, точно. :) – jotbek

1

ComboBoxes открыт вниз или вверх в зависимости от пространства, которое они должны открыть: если у них есть доступное пространство под ними, они будут открываться вниз, как обычно, если они не откроются.

Таким образом, вам просто нужно проверить, есть ли у них достаточно места, чтобы их знали. Попробуйте этот код:

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"); 
} 
Смежные вопросы