- PR -

VB.NET コンボボックスについて

1
投稿者投稿内容
ゆうか
ベテラン
会議室デビュー日: 2004/04/01
投稿数: 62
投稿日時: 2004-04-04 18:59
MaxDropDownItemsというプロパティがありますが
例えば、MaxDropDownItemsを100にした場合
リストが画面いっぱいになってしまい
リストの下のほうの項目が選択できません。
自動的に制御したり出来ないものなんでしょうか?

各画面でコンボボックスの位置が違うんですが
MaxDropDownItemsの値をなるべく大きくし
リストを画面いっぱいに表示したいのですが...。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-05 08:37

  1. Control.TopとControl.Leftを、Control.PointToScreenメソッドで画面座標に変換する
  2. Screen.GetWorkingAreaメソッドで、画面範囲を取得する
  3. 画面範囲とコントロールの画面座標から、表示可能範囲を計算する
  4. コントロールに表示しているFont.Heightから、フォントの高さを取得する
  5. 表示可能範囲とフォントの高さから、表示できる行数を計算する

こんなところかな?
ゆうか
ベテラン
会議室デビュー日: 2004/04/01
投稿数: 62
投稿日時: 2004-04-05 11:11
ありがとうございますm(__)m
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-05 11:47
かなり誤差が出るけど。。。
コード:
// comboBoxの画面座標を求める
Point cbx = new Point(this.comboBox1.Left, this.comboBox1.Top);
Point srcPt = comboBox1.PointToScreen(cbx);
// ディスプレイの画面範囲を求める
System.Drawing.Rectangle wa = Screen.GetWorkingArea(this);
// 画面範囲-画面座標で、表示可能範囲を求める
int h = wa.Height - srcPt.Y;
// フォントの高さで割って、行数を求める
// 1以下ならば1とする
comboBox1.MaxDropDownItems = (h / comboBox1.Font.Height > 1 ?
 h / comboBox1.Font.Height : 1);

ゆうか
ベテラン
会議室デビュー日: 2004/04/01
投稿数: 62
投稿日時: 2004-04-05 11:58
ご丁寧にありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-05 12:18
引用:

Jittaの書き込み (2004-04-05 11:47) より:
コード:
// comboBoxの画面座標を求める
Point cbx = new Point(this.comboBox1.Left, this.comboBox1.Top);
Point srcPt = comboBox1.PointToScreen(cbx);
// ディスプレイの画面範囲を求める
System.Drawing.Rectangle wa = Screen.GetWorkingArea(this);
// 画面範囲-画面座標で、表示可能範囲を求める
int h = wa.Height - srcPt.Y;
// フォントの高さで割って、行数を求める
// 1以下ならば1とする
comboBox1.MaxDropDownItems = (h / comboBox1.Font.Height > 1 ?
 h / comboBox1.Font.Height : 1);




 不思議???

comboBox1.PointToScreen(cbx)だと、スクリーンが1280×1024なのに、コントロールの左上のY座標が1024をオーバーしてしまう。
 これを、this.PointToScreen(cbx)に変更すると、スクリーン内に収まるが…なぜ?



 ちなみに、「画面をオーバーします」。なぜかというと、計算をコンボボックスの「左上座標」で計算しているから。「左下座標」で計算する為には…
1

スキルアップ/キャリアアップ(JOB@IT)