メニューの幅 – プログラミング – Home

通知
すべてクリア

メニューの幅


TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

CMenuで作成したメニュー(右クリックで表示されるメニュー)の幅を
取得することはできないのでしょうか?

探してみたのですが、わからないので教えてください。


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

何のために必要なのでしょうか?


返信引用
かもねぎ
 かもねぎ
(@かもねぎ)
ゲスト
結合: 17年前
投稿: 61
 

これ使うと取得できるようです

GetMenuItemRect

指定されたメニュー項目を囲む長方形を取得します。

BOOL GetMenuItemRect(
HWND hWnd, // メニューを保持しているウィンドウのハンドル
HMENU hMenu, // メニューのハンドル
UINT uItem, // メニュー項目の位置
LPRECT lprcItem // 境界長方形
);


返信引用
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

aetosさん
カスタムメニューを作成していて、サブメニューの表示位置が
画面サイズより出て表示される場合は画面右端に合わせて表示したいのですが。
(標準なメニューの動作)

そうなると開く位置からメニューのサイズを取得して
画面サイズよりでる場合は、右端にあわせて表示するという処理が必要になるかと。

かもねぎさん
ありがとうございます。
GetMenuItemRectは試してみましたが、表示後しか取得できないようで
表示前に取得する方法はないでしょうか?


返信引用
...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

#CMenuを使った事が無いから嘘かも。。

メニュー表示時にWM_INITMENUメッセージが捕まえられるのなら、
ここでGetMenuItemRect()を呼べばいいと思う。


返信引用
かもねぎ
 かもねぎ
(@かもねぎ)
ゲスト
結合: 17年前
投稿: 61
 

取得できるんだけど・・・

BOOL On_InitDialog ( HWND hDlg )
{
hMenu = LoadMenu ( hInst, MAKEINTRESOURCE ( IDR_MENU1 ) ) ;
hSubMenu = GetSubMenu ( hMenu, 0 ) ;

RECT rc ;
GetMenuItemRect ( hDlg, hMenu, 0, &rc ) ;

TCHAR Buf [ 256 ] ;
wsprintf ( Buf, TEXT ( 幅 = %d, 高さ = %d ),
rc.right - rc.left, rc.bottom - rc.top ) ;
OutputDebugString ( Buf ) ;
return TRUE ;
}


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

カスタムメニューということはWM_DRAWITEMのハンドラで
DRAWITEMSTRUCTの内容から調べるのが普通なのでは?


返信引用
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

・・・さん
ありがとうございます。
開く前に幅を取得してTrackPopupMenuの引数の位置を渡してやりたいのですが
WM_INITMENUだとすでに開いてしまっているような。。
TrackPopupMenuを使用した後に表示位置を変えれる方法があればいけそうですが、
後で位置を変更する方法がわかりません。

かもねぎさん
ありがとうございます。
私の方では、動的にメニューを作成してその後GetMenuItemRectでRECTを
取得し、TrackPopupMenuで表示させようとすると一回目は正常な値が取れません。
何かしたらの値は返ってきますがそれが間違って?いるようです。

LoadMenuにすると取得可能なのかもしれないです。。
よくわからないですが。。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

メニューのアイテムの描画の話じゃなかったのねorz
ところでTrackPopupMenuでポップアップしたメニューが
スクリーンの外へ出ないような処理はわざわざ実装しなくても
自動的に行われるものではないでしょうか。


返信引用
TERU
 TERU
(@TERU)
ゲスト
結合: 19年前
投稿: 28
Topic starter  

subaruさん
回答ありがとうございます。
外へ出ることはないのですが、画面ぎりぎりでボタンを押したときに
ボタンのLeft位置からコンテキストメニューを開くようにすると
Left位置から左側にメニューが表示され通常のOSの動作とは異なってしまうのです。

通常メニューが表示しきれない場合は、画面の端からから表示されるようです。

なので、表示する幅が分かれば表示する位置をメニューの右端が画面の端に
合わさるように表示することが可能なのですが、幅が取得できない場合があるので
困っているんです。。


返信引用
かもねぎ
 かもねぎ
(@かもねぎ)
ゲスト
結合: 17年前
投稿: 61
 

どんなメニューなんだろう・・
情報は大切。
小出しではなく、最初に欲しいかも。
でないと・・憶測で答えないといけなくなるかも。
時間の無駄ね。
そこんとこ。よろしくです。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>外へ出ることはないのですが、画面ぎりぎりでボタンを押したときに
>ボタンのLeft位置からコンテキストメニューを開くようにすると
>Left位置から左側にメニューが表示され通常のOSの動作とは異なってしまうのです。

これは通常のOSの動作ではないんでしょうか???

>通常メニューが表示しきれない場合は、画面の端からから表示されるようです。

たしかにOffice製品などアプリケーションによってはこのような表示になるようですね。。。
どのように実現されているのかは知りませんが、そのようなアプリでも
タイトルバーやコモンダイアログ内でのコンテキストメニューは
Left位置から左側に表示となっているような。。。


返信引用
けい
 けい
(@けい)
ゲスト
結合: 22年前
投稿: 15
 

ステータスバーを作るときに
ウィンドウ・スタイルとして SBARS_SIZEGRIP を指定すると
ステータスバーの右下にサイズ変更のための斜線ハンドルがつきますが、

IE とか notepad.exe とかでは斜線ハンドルではなく
点々のハンドルがついています。

どうしたら点々のハンドルがついたステータスバーを作ることができるでしょうか?


返信引用
けい
 けい
(@けい)
ゲスト
結合: 22年前
投稿: 15
 


新規質問のつもりで間違ってレスをつけてしまいました。
管理者様、削除をお願いいたします。
申し訳ありません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました