2012-02-08 39 views
3

私はコンボボックスから継承するコントロール(C#、.Net 2.0実装)を持っています。それはフィルタリングと他のものがあります。 UIの権利を維持するために、フィルタリング中のアイテムの量が減少すると、ドロップダウンリストのサイズが左のアイテムの数に合わせて変更されます(これはNativeMethods.SetWindowPos(...)によって行われます)。コンボボックスのドロップダウンリストが表示されているかどうかを確認する方法はありますか?

ドロップダウンリストが上下に現れているかどうかを確認する方法はありますか?それは開いているか、開いているか、どちらの方向、上向きまたは下向きになっているかをチェックしませんか?

歓声、JBK

+0

をあなたはそれがどこにあるかを見つけるために)(GetWindowRectをも必要となります。 –

+0

はい私は答えを見つけましたが、少なくとも100ポイント持っていないので、投稿するのに8時間待つ必要があります:)すぐにコンボとドロップダウンにハンドルを取得し、それらから矩形を取得し、両方を比較します。 – 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; 
     } 
    } 

そしてコンボボックスのドロップダウンリストに:

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

コンボボックスを2つのイベントのドロップダウン部分が開閉したときに起動されている(DropDownDropDownClosed)を持っているので、あなたがコントロールの状態を監視するために、それらにハンドラをアタッチすることができます。

また、現在の状態を示すブール値のプロパティ(DroppedDown)もあります。

+0

はい、実際はドロップダウンが上下に現れているかどうかを知りたいと思います。私はコンボが公開されたときを知っていることを意味しますが、画面上のコンボボックスの位置に依存して上下に表示されます。 – jotbek

+0

ああ、ドロップダウンリストの部分がテキストフィールドの上か下に表示されているかどうか? –

+0

はい、正確です。 :) – jotbek

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"); 
} 
関連する問題