メニューの高さを取得するには?


SANA  2003-10-17 04:11:33  No: 79833

メニューエディタで作成したメニューの高さを取得したいのですが、
どのようにすれば良いのでしょうか?
「メニュー名.height」みたいな感じでとれると思ってたのですが・・・。


フユ  2003-10-17 04:41:10  No: 79834

'「メニュー無し」の時

'Debug.Print "1:" & Form1.Height  '3600        全体の高さ

'Debug.Print "2:" & Form1.ScaleHeight  '3090   タイトルバーを除いた高さ

'「メニュー あり」の時

Debug.Print "#1:" & Form1.Height  '3900       全体の高さ

Debug.Print "#2:" & Form1.ScaleHeight  '3090  タイトルバーを除いた高さ

この事から 3900 - 3600 = 300 と思います。
また、 3600 - 3090 = 510        タイトルバーの高さ
       3900 - 3090 - 300 = 510  タイトルバーの高さ

私の環境では以上の結果でしたが、参考になれば幸いです。


たかみちえ  URL  2003-10-17 06:07:37  No: 79835

個々のメニューのサイズじゃないでしょうか?

  それは、Windowsが決めるので、そう簡単な話しじゃないでしょうけど…。
恐らく、システムで設定されたメニューのフォントサイズから計算できるんじゃないでしょうか?
  その計算方法はわかりませんけど…。
これだけ手がかりがあれば、検索すれば見つかるかもしれません。


よねKEN  2003-10-17 19:52:34  No: 79836

メニューの高さを求めて何をしたいか?にもよるでしょうけど、
フォームのクライアント領域を求めたいということなら、
フユさんの手がよいと思います。この方法ならウィンドウを小さくしたときに
メニューが2行にまたがった状態になっても大丈夫ですし。

純粋にメニューの高さを知るだけなら、
APIのGetSystemMetrics関数で定数SM_CYMENUを調べればわかります。
Googleで関数名や定数名をキーに検索してみてください。


SANA  2003-10-21 06:51:28  No: 79837

いろいろと返答をいただき、ありがとうございます。

すみません、「何をしたいか」ってことを書いていませんでした。
今、Windows2000の環境でEXEを作成したのですが、XPの環境に持っていくと
全体的にコントロールの位置が画面の下方向にずれでしまいました。
コントロールの位置をメインフォームのTOPから計算していたため、このような結果に・・・。
2000とXPでは初期値のメニュー、タイトルバーの高さが違うことや、Windowsの設定で自由に高さを変えれることに気が付いて今回このような質問をさせていただきました。

Windowsで設定した「メニューのサイズ」を取得するにはAPIを使うのが最善の方法でしょうか??


たかみちえ  URL  2003-10-21 08:29:47  No: 79838

詳しくは確か、この掲示板か、隣の初心者掲示板で、以前書いた気がしますけど、
何らかのコンテナコントロール(ピクチャーボックスなど)に入れておくと、
いざ問題が起こったときにも対処が楽ですよ。
  もし、フォームのリサイズで、Top位置を調べて再配置しているのなら(あなたの文を読む限り、そうしているんだと思いますけど)、なおさらです。
  中のボタンなどの位置情報は、ピクチャーボックスの右上からの座標になるので、計算が楽ですし、フォームの非クライアント領域(フォームやメニューバーのある部分)を考慮せずにすみます。

  さて、メニュー、タイトルバー抜き(クライアント領域)のサイズを得るには、
APIにGetClientRectというAPIがあるので、それを使えば、わかります。


batchman  2003-10-21 18:15:43  No: 79839

こんな風にして、フォームのクライアント領域を伸縮してみてはどうでしょう?

Private Sub Form_Resize()

    Const BASE_HEIGHT = 3480

    'フォームのスケールモードはTwipsで、
    'BASE_HEIGHTはそれぞれのフォームで値が変わりますが...
    If Me.WindowState <> vbMinimized Then

        Me.Height = Me.Height + BASE_HEIGHT - Me.ScaleHeight
    End If

End Sub


SANA  2003-10-21 20:41:46  No: 79840

いろいろとアドバイスありがとうございます。

ちょっと試してみたのですが、ユフさんの「Form1.ScaleHeight」で
取得できる値はメニューあり/なしでも変わらないってことは
フォームからタイトルバーとメニューの高さを取り除いた高さが取得
できると考えてよろしいのでしょうか??
「ScaleHeight」プロパティのヘルプを調べたのですが、
いまいちわかりませんでした・・・。


神流美咲  2003-10-21 21:28:18  No: 79841

私もコントロールがずれ込む経験はしたことがありますが、一番きれいに整ったのはよねKENさんの方法でした
やはりGetSystemMetricsで取得して(もちろんVB6以前ならTwipに変換します)整える方法が良いかと・・・。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加