お世話になっております。
ポップアップメニューのメッセージ処理について
質問があります。
いま、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)です。
よろしくお願いいたします。
TPM_NONOTIFY|TPM_RETURNCMD を使います。
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);
}
ありがとうございました。