ポップアップメニューのメッセージ処理について – プログラミング – Home

ポップアップメニューのメッセージ処理に...
 
通知
すべてクリア

[解決済] ポップアップメニューのメッセージ処理について


Aquarium
 Aquarium
(@Aquarium)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

お世話になっております。

ポップアップメニューのメッセージ処理について
質問があります。

いま、DLL(MFC)内に下記のようなクラスがあります。
このDLLを呼び出しているアプリケーションの
メインウィンドウ内で右クリックされると
このクラスのメンバ函数 SetContextMenu() に
OnRButtonDown()の引数と右クリックがされた
ウィンドウのハンドルが渡されてきます。
そしてその函数内でポップアップメニューを表示しています。

class CDrawTool
{
CDrawTool(){};
~CDrawTool(){};

//nFlags, pointはOnRButtonの引数,
//hWndはポップアップメニューの所持ウィンドウのハンドル
void SetContextMenu(UINT nFlags, CPoint point, HWND hWnd)
}

void CDrawTool::SetContextMenu(UINT nFlags, CPoint point, HWND hWnd)
{
HDC hDC = GetDC(hWnd);
CDC * pDC = CDC::FromHandle(hDC);

ClientToScreen(hWnd, &point);

CMenu menu;

menu.CreatePopupMenu();

menu.AppendMenu(MF_STRING, ID_DELETE, 削除(&D));
menu.AppendMenu(MF_STRING, ID_PROPERTY, プロパティ(&P));
menu.AppendMenu(MF_SEPARATOR, NULL, ");
menu.AppendMenu(MF_STRING, 0, キャンセル);

menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
               point.x, point.y, CWnd::FromHandle(hWnd));

menu.DeleteMenu(MF_STRING, ID_DELETE);
menu.DeleteMenu(MF_STRING, ID_PROPERTY);
menu.DeleteMenu(MF_SEPARATOR, NULL);
menu.DeleteMenu(MF_STRING, 0);

ReleaseDC(hWnd, hDC);
}

汎用的に使われるDLLなので、函数の呼び出し元のアプリケーションに
メッセージ処理をさせずにDLL内で選択されたメニューの
処理を実行したいのでのですが、そのためにはどうしたらよいのでしょうか。

どうぞご教授ください。

開発環境はWinXP pro VC++6.0 SP5 DLL(MFC)
呼び出し元のアプリケーションは EXE(MFC)です。

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


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

TPM_NONOTIFY|TPM_RETURNCMD を使います。


返信引用
Aquarium
 Aquarium
(@Aquarium)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

dairygoodsさん、ご返事ありがとうございます。

ご教授いただいたTPM_NONOTIFY|TPM_RETURNCMDを使用したところ、
選択されたメニューを取得でき、DLL内で処理をすることができました。

void CDrawTool::SetContextMenu(UINT nFlags, CPoint point, HWND hWnd)
{
HDC hDC = GetDC(hWnd);
CDC * pDC = CDC::FromHandle(hDC);

ClientToScreen(hWnd, &point);

CMenu menu;

menu.CreatePopupMenu();

menu.AppendMenu(MF_STRING, ID_DELETE, 削除(&D));
menu.AppendMenu(MF_STRING, ID_PROPERTY, プロパティ(&P));
menu.AppendMenu(MF_SEPARATOR, NULL, ");
menu.AppendMenu(MF_STRING, 0, キャンセル);

DWORD dwRetCode = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON |
TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y,
CWnd::FromHandle(hWnd));

menu.DeleteMenu(MF_STRING, ID_DELETE);
menu.DeleteMenu(MF_STRING, ID_PROPERTY);
menu.DeleteMenu(MF_SEPARATOR, NULL);
menu.DeleteMenu(MF_STRING, 0);

switch(dwRetCode){
case ID_DELETE:
//削除処理
break;
case ID_PROPERTY:
//プロパティ
    break;
default:
//キャンセル
    break;
}

ReleaseDC(hWnd, hDC);
}

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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