メニューエディタで作成したメニューの高さを取得したいのですが、
どのようにすれば良いのでしょうか?
「メニュー名.height」みたいな感じでとれると思ってたのですが・・・。
'「メニュー無し」の時
'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 タイトルバーの高さ
私の環境では以上の結果でしたが、参考になれば幸いです。
個々のメニューのサイズじゃないでしょうか?
それは、Windowsが決めるので、そう簡単な話しじゃないでしょうけど…。
恐らく、システムで設定されたメニューのフォントサイズから計算できるんじゃないでしょうか?
その計算方法はわかりませんけど…。
これだけ手がかりがあれば、検索すれば見つかるかもしれません。
メニューの高さを求めて何をしたいか?にもよるでしょうけど、
フォームのクライアント領域を求めたいということなら、
フユさんの手がよいと思います。この方法ならウィンドウを小さくしたときに
メニューが2行にまたがった状態になっても大丈夫ですし。
純粋にメニューの高さを知るだけなら、
APIのGetSystemMetrics関数で定数SM_CYMENUを調べればわかります。
Googleで関数名や定数名をキーに検索してみてください。
いろいろと返答をいただき、ありがとうございます。
すみません、「何をしたいか」ってことを書いていませんでした。
今、Windows2000の環境でEXEを作成したのですが、XPの環境に持っていくと
全体的にコントロールの位置が画面の下方向にずれでしまいました。
コントロールの位置をメインフォームのTOPから計算していたため、このような結果に・・・。
2000とXPでは初期値のメニュー、タイトルバーの高さが違うことや、Windowsの設定で自由に高さを変えれることに気が付いて今回このような質問をさせていただきました。
Windowsで設定した「メニューのサイズ」を取得するにはAPIを使うのが最善の方法でしょうか??
詳しくは確か、この掲示板か、隣の初心者掲示板で、以前書いた気がしますけど、
何らかのコンテナコントロール(ピクチャーボックスなど)に入れておくと、
いざ問題が起こったときにも対処が楽ですよ。
もし、フォームのリサイズで、Top位置を調べて再配置しているのなら(あなたの文を読む限り、そうしているんだと思いますけど)、なおさらです。
中のボタンなどの位置情報は、ピクチャーボックスの右上からの座標になるので、計算が楽ですし、フォームの非クライアント領域(フォームやメニューバーのある部分)を考慮せずにすみます。
さて、メニュー、タイトルバー抜き(クライアント領域)のサイズを得るには、
APIにGetClientRectというAPIがあるので、それを使えば、わかります。
こんな風にして、フォームのクライアント領域を伸縮してみてはどうでしょう?
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
いろいろとアドバイスありがとうございます。
ちょっと試してみたのですが、ユフさんの「Form1.ScaleHeight」で
取得できる値はメニューあり/なしでも変わらないってことは
フォームからタイトルバーとメニューの高さを取り除いた高さが取得
できると考えてよろしいのでしょうか??
「ScaleHeight」プロパティのヘルプを調べたのですが、
いまいちわかりませんでした・・・。
私もコントロールがずれ込む経験はしたことがありますが、一番きれいに整ったのはよねKENさんの方法でした
やはりGetSystemMetricsで取得して(もちろんVB6以前ならTwipに変換します)整える方法が良いかと・・・。
ツイート | ![]() |