- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メニューバーの高さの取得方法)
メニューバーの高さの取得方法
このQ&Aのポイント
- WinXP、SDKで開発しているVC5で、ウィンドウの大きさが変更された時に自動的にリサイズされる複数のウィンドウ内のメニューバーの高さを取得する方法について教えてください。
- 通常はGetSystemMetrics(SM_CYMENU)を使用してメニューバーの高さを取得しているのですが、画面の縮みによりメニューが複数行になった場合などはどのようにして高さを判別すればよいのでしょうか。
- 画面を縮めた際にメニューバーの高さが変わることを認識せず、下のほうのウィンドウが切れてしまう問題が発生しています。メニューバーの高さを正しく取得する方法について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・方法1としてメニューバーが折り返さないように制御。 WM_GETMINMAXINFOメッセージを処理します。 http://www.winapi-database.com/Message/WM/WM_GETMINMAXINFO.html→『WM_GETMINMAXINFO』 ・方法2はGetWindowRect()、GetClientRect()、GetSystemMetrics()を 組み合わせて計算するのはどうでしょうか。 (1)ウインドウ領域の取得 (2)クライアント領域の取得 (3)(ウインドウ領域の高さ)-(クライアント領域の高さ) (4)(3)-(キャプションの高さ) (5)(4)-(サイズ変更の高さ) (6)(5)が残ったメニューバーの高さになります。 ※ツールバーがある場合にはその高さも引きます。 サンプル: RECT rc1; RECT rc2; int height; GetWindowRect( hWnd, &rc1 ); GetClientRect( hWnd, &rc2 ); height = (rc1.bottom - rc1.top) - (rc2.bottom - rc2.top); height -= GetSystemMetrics( SM_CYCAPTION ); height -= GetSystemMetrics( SM_CYSIZEFRAME ); height:メニューバーの高さ
お礼
Oh-Orangeさま、アドバイスをありがとうございます。 頂いたサンプルを参考にしたところ、リサイズがうまくいくようになりました。 本当にありがとうございます。 メニューが複数行にならない制御もあるのですね。 とても勉強になりました。 私は丸一日悩んで結果が出なかった事でした… 非常に分かりやすい回答を頂き、本当に感謝です。 ありがとうございました。