CMenuで作成したメニュー(右クリックで表示されるメニュー)の幅を
取得することはできないのでしょうか?
探してみたのですが、わからないので教えてください。
何のために必要なのでしょうか?
これ使うと取得できるようです
GetMenuItemRect
指定されたメニュー項目を囲む長方形を取得します。
BOOL GetMenuItemRect(
HWND hWnd, // メニューを保持しているウィンドウのハンドル
HMENU hMenu, // メニューのハンドル
UINT uItem, // メニュー項目の位置
LPRECT lprcItem // 境界長方形
);
aetosさん
カスタムメニューを作成していて、サブメニューの表示位置が
画面サイズより出て表示される場合は画面右端に合わせて表示したいのですが。
(標準なメニューの動作)
そうなると開く位置からメニューのサイズを取得して
画面サイズよりでる場合は、右端にあわせて表示するという処理が必要になるかと。
かもねぎさん
ありがとうございます。
GetMenuItemRectは試してみましたが、表示後しか取得できないようで
表示前に取得する方法はないでしょうか?
#CMenuを使った事が無いから嘘かも。。
メニュー表示時にWM_INITMENUメッセージが捕まえられるのなら、
ここでGetMenuItemRect()を呼べばいいと思う。
取得できるんだけど・・・
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 ;
}
カスタムメニューということはWM_DRAWITEMのハンドラで
DRAWITEMSTRUCTの内容から調べるのが普通なのでは?
・・・さん
ありがとうございます。
開く前に幅を取得してTrackPopupMenuの引数の位置を渡してやりたいのですが
WM_INITMENUだとすでに開いてしまっているような。。
TrackPopupMenuを使用した後に表示位置を変えれる方法があればいけそうですが、
後で位置を変更する方法がわかりません。
かもねぎさん
ありがとうございます。
私の方では、動的にメニューを作成してその後GetMenuItemRectでRECTを
取得し、TrackPopupMenuで表示させようとすると一回目は正常な値が取れません。
何かしたらの値は返ってきますがそれが間違って?いるようです。
LoadMenuにすると取得可能なのかもしれないです。。
よくわからないですが。。
メニューのアイテムの描画の話じゃなかったのねorz
ところでTrackPopupMenuでポップアップしたメニューが
スクリーンの外へ出ないような処理はわざわざ実装しなくても
自動的に行われるものではないでしょうか。
subaruさん
回答ありがとうございます。
外へ出ることはないのですが、画面ぎりぎりでボタンを押したときに
ボタンのLeft位置からコンテキストメニューを開くようにすると
Left位置から左側にメニューが表示され通常のOSの動作とは異なってしまうのです。
通常メニューが表示しきれない場合は、画面の端からから表示されるようです。
なので、表示する幅が分かれば表示する位置をメニューの右端が画面の端に
合わさるように表示することが可能なのですが、幅が取得できない場合があるので
困っているんです。。
どんなメニューなんだろう・・
情報は大切。
小出しではなく、最初に欲しいかも。
でないと・・憶測で答えないといけなくなるかも。
時間の無駄ね。
そこんとこ。よろしくです。
>外へ出ることはないのですが、画面ぎりぎりでボタンを押したときに
>ボタンのLeft位置からコンテキストメニューを開くようにすると
>Left位置から左側にメニューが表示され通常のOSの動作とは異なってしまうのです。
これは通常のOSの動作ではないんでしょうか???
>通常メニューが表示しきれない場合は、画面の端からから表示されるようです。
たしかにOffice製品などアプリケーションによってはこのような表示になるようですね。。。
どのように実現されているのかは知りませんが、そのようなアプリでも
タイトルバーやコモンダイアログ内でのコンテキストメニューは
Left位置から左側に表示となっているような。。。
ステータスバーを作るときに
ウィンドウ・スタイルとして SBARS_SIZEGRIP を指定すると
ステータスバーの右下にサイズ変更のための斜線ハンドルがつきますが、
IE とか notepad.exe とかでは斜線ハンドルではなく
点々のハンドルがついています。
どうしたら点々のハンドルがついたステータスバーを作ることができるでしょうか?
↑
新規質問のつもりで間違ってレスをつけてしまいました。
管理者様、削除をお願いいたします。
申し訳ありません。