• 締切済み

右クリックメニューについて

VC++2005のMFCでダイアログベースアプリを作成しています。 右クリック動作を行ったタイミングでOnContextMenu関数を呼び出し、処理を行いたいのですが、作成した方法が悪いのか、 (イベントの追加で自動生成する方法が分からず、他ソースのOnContextMenu関数部をコピー) 右クリックしても関数内に入ってくれません。 コンパイルは通っており、コピー元のソースでは検知されているのですが。。。 何か解決法について心当たりのある方おられましたら、お手数ですがご教授お願い致します。 下記は問題箇所のソースです。 【メッセージマップ】 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) ON_WM_CONTEXTMENU() END_MESSAGE_MAP() 【OnContextMenu関数】 void CTestDlg::OnContextMenu(CWnd* /*pWnd*/, CPoint point ){ AfxMessageBox("右クリック検知しました"); } 【ヘッダ部】 afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint point ); ※なお、右クリックする場所はダイアログ上に作成したツリービューの上となっています。

みんなの回答

回答No.1

 こんにちは。 >>【メッセージマップ】 >>BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) >>ON_WM_CONTEXTMENU() >>END_MESSAGE_MAP()  メッセージマップする場所を間違えているのではないでしょうか。  此れですと、CAboutDlgのメッセージマップ追加になってしまうのではないでしょうか。  BEGIN_MESSAGE_MAP(CTestDlg, CDialog)  //その他  ON_WM_CONTEXTMENU()//取り敢えずココに入れる  END_MESSAGE_MAP()  BEGIN_MESSAGE_MAP(CTestDlg, CDialog)と成っている所を探して見て下さい。

zigen8513
質問者

お礼

該当箇所に移動したところ動作しました! コンストラクタなど上部箇所を全て折りたたんでいたので気づきませんでした。。。 どうもありがとうございました!

関連するQ&A

  • 左ダブルクリックについて

    アプリの中から動的に新規にウィンドウを作っています。 新規に作ったウィンドウのクライアント領域を左ダブルクリックした時に、メッセージボックスを出そうとしましたが、何も出てきません。 左クリックであればうまく行きます。 (右でも同様の現象) どうしてこうなるのでしょうか? お分かりの方アドバイスお願いします。 ************************* CMyWnd::CMyWnd( CWnd* parent,int i) { } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { AfxMessageBox("99"); CWnd::OnLButtonDown(nFlags, point); } void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { AfxMessageBox("99"); CWnd::OnLButtonDblClk(nFlags, point); }

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • ウィンドウの破棄について

    アプリの中から動的に新規にウィンドウを作っています。 この新規に作ったウィンドウをそのウィンドウのクライアント領域を右クリックして破棄したいと思います。 とりあえず以下のようにしてみましたが、不正な処理で落ちてしまいます。 どこが悪いのでしょうか? よろしくお願いいたします。 ********************** void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) { ::DestroyWindow(m_hWnd); CWnd::OnRButtonDown(nFlags, point); }

  • 子ウィンドウから親ウィンドウへデータを渡すには?

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、ダイアログのテキストボックスに入力した文字をウィンドウに表示しています。 また、ウィンドウ生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_moji=m_InputData; //テキストボックスの文字をウィンドウに表示されるう変数m_mojiに代入 pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログを非表示から表示にし、ウィンドウに表示されている文字をダイアログのテキストボックスに表示させるために以下のようにしましたが、文字は表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point) { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->m_InputData=m_moji;//変数に正しい文字が代入されていることは確認できました UpdateData(FALSE); pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • Cwndクラスの派生クラスmCWndクラスのOnDrawについて

    OnDraw関数が呼び出しされていません。 どうすればいいですか? よろしくお願いします。 class mCWnd :public CWnd { public: DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags,CPoint point) { AfxMessageBox("子ウインドウ"); CDC *pDC=GetDC(); pDC->TextOut(0,0,"HELLO"); ReleaseDC(pDC); Invalidate(); } virtual void OnDraw(CDC* pDC) { AfxMessageBox("OnDraw"); pDC->FillSolidRect(CRect(0,0,300,300),RGB(255,255,255)); } }; BEGIN_MESSAGE_MAP(mCWnd, CWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() ------------------------------------------- //***View.cpp (mCWnd cw) void CKoDlg::OnBnClickedButton1() { CRect rect=CRect(50,50,190,250); cw.Create(NULL,"Hello",WS_CHILD|WS_VISIBLE,rect,this,5000,0); // TODO : ここにコントロール通知ハンドラ コードを追加します。 }

  • 画像をクリックしたときに右クリック禁止を発動したい

     Bodyタグなどに「oncontextmenu=return false」と書くと、右クリックを禁止できますが、最初から右クリックを禁止するのではなく、ある特定の画像をクリックしたときに発動させたいのですが。  それを例えばダイナミックHTML(?)的に「<img src="xxx.jpg" onmousedown="document.body.background='壁紙'">」のようなやり方を応用して、「oncontextmenu=return false」を発動できないか試してみましたが、(文法を根本的に知らないので)どうも上手く出来ません。  (※<img src="a.jpg" oncontextmenu=return false>と書けば、その画像の右クリックだけは禁止できますが)  Javaスクリプトを使えばこのコントロールが可能かと思いますが、もしこの「onmousedown="document.body.background='壁紙'"」レベルの単純な指示で、右クリック禁止が発動できる方法が何かございましたら、お教えいただければ幸いです。 (※右クリック禁止をさせても、結局のところソースを見られたりするのを禁止する事は出来ない、というのは知っています。そういう内容の質問ではありません)

    • ベストアンサー
    • HTML
  • 右クリック禁止が効かないのですが

    作成しているHPで右クリック禁止を設定したのですが、一部のPCで効きません。 「右クリック禁止」の表示は出るのですが、「OK」ボタンを押すと、 従来通り、保存などのメニュー画面が出てきます。 OSはWindowsXP。IE6使用です。 何が要因なのでしょうか。 ちなみに<body oncontextmenu="alert('右クリック禁止');return false;">を使いました。 大変困っております。 どうぞよろしくお願い致します。

    • ベストアンサー
    • HTML
  • Modalダイアログを他のThreadから閉じたい

    VC++6.0のMFCプロジェクトで、Modalダイアログを他のThreadから閉じる処理を行いたいと考えています。 以下のようなことを実行しているのですが、3.で"MyDialog"にメッセージが送信されません。 1.あるFormView上で、他のスレッド("WorkerThread"とします)を起動する。 2.上記FormView上で、Modalダイアログ("DialogTest"とします)を開く。 3."WorkerThread"にて、一定の処理後にSendMessageを実行して、"MyDialog"にメッセージを送り、EndDialog()を実行させる。 /*----- WorkerThread関数内-----*/ //"TestDialog"のハンドルを取得する。 HWND hWnd = ::FindWindowEx(NULL, NULL, _T("#32770"), NULL); if (hWnd) { CWnd* pWnd = FromHandle(hWnd); if (pWnd) { //処理がここに入っていることは確認できます。 pWnd->SendMessage(WM_MESSAGE_CLOSEDIALOG, 0, 0); } } /*-----定義用ヘッダーファイル------*/ const UINT WM_MESSAGE_CLOSEDIALOG =::RegisterWindowMessage(_T("UWM_MESSAGE_CLOSEDIALOG")); /*-----DialogTest.h------*/ //{{AFX_MSG(CWaitingSearchDialog) //}}AFX_MSG afx_msg void OnCloseDialog(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() /*-----DialogTest.cpp------*/ void DialogTest::OnCloseDialog() { EndDialog(IDOK); } BEGIN_MESSAGE_MAP(DialogTest, CDialog) //{{AFX_MSG_MAP(DialogTest) //}}AFX_MSG_MAP ON_REGISTERED_MESSAGE(WM_MESSAGE_CLOSEDIALOG, OnCloseDialog) END_MESSAGE_MAP() 間違いありましたら、ご指摘いただけないでしょうか。よろしくお願いいたします。 (ところで、私が同カテゴリに先日投稿した「"複数プロジェクトをビルドしたとき、DLLに新しく追加したClassのみがリンクエラーになる "」は、自己解決できました。 もしどなたか適当な回答を投稿してもらえれば、その旨を書けます。お暇な方、お願いできないでしょうか)

  • 右クリックしたときに

    ファイルを右クリック→プロパティの中の 全般タブでファイルの「作成日時」はあるのですが、 更新日時とかは追加できないのでしょうか? 作成日時だけじゃ用が足りないことがしばしば... そのダイアログのカスタマイズの方法がありましたら教えてください。

  • オーバーライドとオーバーロードについて

    1.CTestDlgクラスを作成 class CTestDlg : public CDialog { // コンストラクション public: BOOL Create(CWnd *pWnd); CWnd * m_pParent; CTestDlg(CWnd* pParent = NULL); // 標準のコンストラクタ・ ・ 2.メンバ関数の定義 BOOL CTestDlg::Create(CWnd *pWnd) { m_pParent = pWnd; BOOL bret = CDialog::Create( CTestDlg::IDD, m_pParent); if( bret == TRUE) { this->ShowWindow( SW_SHOW); } return bret; 以上のような場合において、 1.Create(CWnd *pWnd)は、引数が異なるため virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); をオーバーライドしたとは言わず、オーバーロードしたということで良いのでしょうか? 2.オーバーロードしたということであれば、 Create(CWnd *pWnd)と virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); の両方の関数が使えると思っていたのですが、後者方は引数が異なるとエラーが出て使えませんでした。 どうしてなのでしょうか? 以上、2点についてご教授ください。