はじめましてMIAMIAMと申します。
現在VC6+WindowsXPで開発をしています。
右クリックメニューを作ろうとして、以下のようなソースを記述しましたが、途中でAccess Violationエラーが発生してしまいます。
void CTestDlg::OnRButtonDown( UINT nFlags, CPoint point )
{
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, WM_USER+1, "テスト");
ClientToScreen(&point);
menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,point.y, this );
menu.DestroyMenu();
}
エラーはポップアップされたメニューを選択した直後に発生しているようです。
デバッグモードで追っていくと、TrackPopupMenuの直後で発生しているのですが、エラーの原因がわかりません。メニューを選択しなかった場合はエラーは発生しません。アドバイスお願いいたします。
この部分だけコピペしてみましたが、きちんと表示されました。
(OSはwin2000ですが)
他の部分(ON_COMMANDハンドラの方とか)に原因があるのではないでしょうか。
あと余計な事かもしれませんが、
普通はOnContextMenu(WM_CONTEXTMENU)に記述します。
座標計算しなくてすみます。
それとRButtonDownって押しつづけると、何回も呼ばれるんですよね。
(問題ないみたいでしたが)
てつやさんアドバイス有難うございました。
ハンドラはOnContextMenuを使うようにします。
専用の物があったのですね。知りませんでした。。
指摘して頂いた、ON_COMMANDですが、次のように記述してあり、
エラーにつながるような問題があるように思えません。
ON_COMMAND(WM_USER+1, OnMenuTest)
void CTestDlg::OnMenuTest()
{
TRACE("OnMenuTest\n");
}
デバッグモードでTRACEの部分で止めると、既にAccess Violationエラーがデバッグ画面に表示されています。
ステップ実行で動作を追って行ったところ、MFCのCMenu::TrackPopupMenu関数内の
BOOL bOK = ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0,
pThreadState->m_hTrackingWindow, lpRect);
という記述の後にエラーが発生しているようです。
エラーの発生場所は分かったのですが、その原因が分かりません。(;_;)
VC6+WindowsXP(SP1)でコピペして動かしてみましたが、
エラーはでませんでした。
> BOOL bOK = ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0,
> pThreadState->m_hTrackingWindow, lpRect);
エラーで止まった時にm_hMenuやpThreadState->m_hTrackingWindowに
NULLや変な値が入っていないか確認してみてはいかがでしょうか。
みいさんアドバイスありがとうございました。
止まる箇所で値の確認をしましたが、異常な値が入っている様子はありませんでした。
てつやさんやみいさんの環境ではエラーが出ないとのことなので、
僕も別の環境で実行してみました。
結果、エラーは出ませんでした。
OSの問題ということなのでしょうかね…。
とりあえずプログラムに問題は無さそうという事で、解決にします。
てつやさん、みいさん、ご助言有難うございました。
ツイート | ![]() |