VS2005, VC++, MFC, SDIプログラムです。
本体からモードレスダイアログをオープンします。
この子ダイアログに CDHtmlDialog を使用しています。(画像貼り付けの目的で)
右クリックでマイメニューをポップアップしたいのですが、CDHtmlDialogであるため右
クリックすると既定のメニューが出て、マイメニューは出ません。
WEB上を調べたら、「既定のポップアップメニューを無効にする方法」というのがありま
した。ここです。
http://support.microsoft.com/kb/236312/ja(機会翻訳)
http://support.microsoft.com/kb/236312/en-us(英語)
しかし、あまりにも複雑・高等技術なので、初心者の自分の手に負えません。
もっと簡単に無効にする方法はないでしょうか?
CDHtmlDialogの子ダイアログの場合で、具体的なコードで教えて戴くと助かります。
よろしくお願いいたします。
CDHtmlDialog::ShowContextMenuをオーバーライドして
戻り値をS_OKにするだけでよいようです。
http://msdn.microsoft.com/ja-jp/library/zb367x73(VS.80).aspx
>CDHtmlDialogの子ダイアログの場合で、具体的なコードで教えて戴くと助かります。
>よろしくお願いいたします。
STDMETHOD(ShowContextMenu)(DWORD dwID, POINT * ppt, IUnknown * pcmdtReserved,
IDispatch * pdispReserved)
{
return S_OK;
}
こんな感じ。
subaru様、有り難うございます。
教えて戴いたコードを挿入することで、コンテキストメニューを簡単に無効にすること
ができました。
ところが、ON_WM_RBUTTONDOWN のメッセージが出ません。
WEB上を調べたら、「IEコントロールの右クリックメニューを実装する」というページが
ありました。
http://www.usefullcode.net/2009/03/ie_contextmenu.html
かなり大変です。
これからやってみますが、どうなることやら。
とりあえず、御礼まで。
>ところが、ON_WM_RBUTTONDOWN のメッセージが出ません。
コンテキストメニューは一般のウインドウであればWM_CONTEXTMENU、
タスクトレイからならWM_RBUTTONUPを処理する方が自然です。
>WEB上を調べたら、「IEコントロールの右クリックメニューを実装する」というページが
>ありました。
CDHtmlDialogを使う場合はIDocHostUIHandlerの実装は既にフレームワーク側で
用意されていると考えてください。
自作のメニューを出したいならオーバーライドしたShowContextMenuの実装に
その処理を書けばいいと思います。
また、デフォルトではショートカットキーが有効になっているようなので
CDHtmlDialog::TranslateAcceleratorをオーバーライドして
無効にしておいたほうがよさそうです。
subaruさん、色々有り難うございます。
次のコードを書いたのですが、うまくいきません。
幅のない、それらしいものが出ます。
STDMETHOD(ShowContextMenu)(DWORD dwID, POINT * ppt, IUnknown * pcmdtReserved,
IDispatch * pdispReserved)
{
HINSTANCE hInst;
hInst = (HINSTANCE)::GetWindowLong(m_hWnd, GWL_HINSTANCE);
HMENU hMenu;
hMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU_GAZO));
::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, ppt->x, ppt->y,
0, m_hWnd, (RECT*)NULL);
::DestroyMenu(hMenu);
return S_OK;
}
hInst のところが違っているのではないかと思います。
よろしくお願いいたします。
次のコードでも同じ結果です。(幅のない、それらしいものが出る)
CMenu menu;
menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU_GAZO));
menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, ppt->x, ppt->y, this);
menu.DestroyMenu();
補足します。
「幅のない、それらしいもの」というのは、まさしくポップアップメニューです。
幅が約1mm、高さがメニュー6行分の大きさです。
このメニューには6項目入れています。
各行をクリックすると、そのメニュー項目が実行されます。
問題は、幅が約1mmしかないということです。
出来ました!
メニューの書式を下記のように2段にして、(従来は1段)
CMenu menu;
menu.LoadMenu(IDR_MENU_GAZO);
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, ppt->x, ppt->y, this);
としました。
IDR_MENU_GAZO MENU
BEGIN
POPUP ポップアップメニュー
BEGIN
MENUITEM 追加, ID_GAZO_TSUIKA
MENUITEM ・・・, ・・・・
MENUITEM ・・・, ・・・・
・・・・
END
END
menu.DestroyMenu(); というコードは必要でしょうか?
ショートカットキーを無効にするコードは、
STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID * pguidCmdGroup,
DWORD nCmdID) return S_OK;
と書くだけでいいでしょうか?
よろしくお願いいたします。
>menu.DestroyMenu(); というコードは必要でしょうか?
メニューの破棄はいるけど CMenu のデストラクターで
DestroyMenuが呼ばれるのでどっちでもいいんじゃないかな。
>ショートカットキーを無効にするコードは、
>
>STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID * pguidCmdGroup,
> DWORD nCmdID) return S_OK;
>
>と書くだけでいいでしょうか?
E_NOTIMPL でない場合は S_OK か S_FALSE のどちらかを返すので
やってみて Ctrl+N や Ctrl+P を押してみれば反応しなければ大丈夫です。
たぶんそれでよかったかと。
subaruさん、ありがとうございました。
ショートカットキーの無効化もこれでOKです。
解決です。感謝感激です。