CDHtmlDialogのポップアップメニューを無効にする方法 – プログラミング – Home

CDHtmlDialogのポップアップ...
 
通知
すべてクリア

[解決済] CDHtmlDialogのポップアップメニューを無効にする方法


Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

VS2005, VC++, MFC, SDIプログラムです。
本体からモードレスダイアログをオープンします。

この子ダイアログに CDHtmlDialog を使用しています。(画像貼り付けの目的で)
右クリックでマイメニューをポップアップしたいのですが、CDHtmlDialogであるため右
クリックすると既定のメニューが出て、マイメニューは出ません。
WEB上を調べたら、「既定のポップアップメニューを無効にする方法」というのがありま
した。ここです。
http://support.microsoft.com/kb/236312/ja(機会翻訳)
http://support.microsoft.com/kb/236312/en-us(英語)

しかし、あまりにも複雑・高等技術なので、初心者の自分の手に負えません。
もっと簡単に無効にする方法はないでしょうか?
CDHtmlDialogの子ダイアログの場合で、具体的なコードで教えて戴くと助かります。
よろしくお願いいたします。


引用未解決
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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;
}

こんな感じ。


返信引用
Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

subaru様、有り難うございます。
教えて戴いたコードを挿入することで、コンテキストメニューを簡単に無効にすること
ができました。
ところが、ON_WM_RBUTTONDOWN のメッセージが出ません。
WEB上を調べたら、「IEコントロールの右クリックメニューを実装する」というページが
ありました。
http://www.usefullcode.net/2009/03/ie_contextmenu.html
かなり大変です。
これからやってみますが、どうなることやら。
とりあえず、御礼まで。


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

>ところが、ON_WM_RBUTTONDOWN のメッセージが出ません。

コンテキストメニューは一般のウインドウであればWM_CONTEXTMENU、
タスクトレイからならWM_RBUTTONUPを処理する方が自然です。

>WEB上を調べたら、「IEコントロールの右クリックメニューを実装する」というページが
>ありました。

CDHtmlDialogを使う場合はIDocHostUIHandlerの実装は既にフレームワーク側で
用意されていると考えてください。
自作のメニューを出したいならオーバーライドしたShowContextMenuの実装に
その処理を書けばいいと思います。

また、デフォルトではショートカットキーが有効になっているようなので
CDHtmlDialog::TranslateAcceleratorをオーバーライドして
無効にしておいたほうがよさそうです。


返信引用
Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

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 のところが違っているのではないかと思います。
よろしくお願いいたします。


返信引用
Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

次のコードでも同じ結果です。(幅のない、それらしいものが出る)

CMenu menu;
menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU_GAZO));
menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, ppt->x, ppt->y, this);
menu.DestroyMenu();


返信引用
Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

補足します。
「幅のない、それらしいもの」というのは、まさしくポップアップメニューです。
幅が約1mm、高さがメニュー6行分の大きさです。
このメニューには6項目入れています。
各行をクリックすると、そのメニュー項目が実行されます。
問題は、幅が約1mmしかないということです。


返信引用
Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

出来ました!

メニューの書式を下記のように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;

と書くだけでいいでしょうか?

よろしくお願いいたします。


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

>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 を押してみれば反応しなければ大丈夫です。
たぶんそれでよかったかと。


返信引用
Ti Amo
 Ti Amo
(@Ti Amo)
ゲスト
結合: 16年前
投稿: 23
Topic starter  

subaruさん、ありがとうございました。
ショートカットキーの無効化もこれでOKです。
解決です。感謝感激です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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