ポップアップメニューの表示方法について

[戻る]
Taro 2002/04/24(水) 12:13:46
はじめまして。 日曜プログラマのTaroと申します。

下記のようにCView.cpp内にコーディングしても
ポップアップがうまく表示されません。
どうすれば良いでしょう?
void CXXXView::OnRButtonDown(UINT nFlags, CPoint point) 
{
    ClientToScreen( &point );
    SetForegroundWindow();
       CMenu Popup;
    if(Popup.LoadMenu(IDR_POPUPMENU1)!=0){
    Popup.TrackPopupMenu( TPM_CENTERALIGN | TPM_LEFTBUTTON, 
     point.x, point.y, this);
  }
    CWnd::OnRButtonDown(nFlags, point);
}
環境はWindows98SEでVC++SP5パッチをあててます。
基本的な質問ですみません。 よろしくお願いします.

Bun 2002/04/24(水) 12:53:45
LoadMenuした後にPopupからGetSubMenu()せにゃあかんのでわ?

くたくた 2002/04/24(水) 12:55:33
Popup.TrackPopupMenu( ... )
         ↓
CMenu*   p = Popup.GetSubMenu( 0 );
p->TrackPopupMenu( ... )

このようにしてみて下さい。

Taro 2002/04/24(水) 13:13:15
ありがとうございます。
説明不足ですみませんが実はその方法で
やってみたのですが、lpRectやm_hWndのシンボルが
"Error:式を評価できない"ようです。
なにか他にやることはありますか?
考えられる原因があればよろしくお願いします。

Bun 2002/04/24(水) 13:36:38
this ぢゃなくて AfxGetMainWnd() としてみてわ?

メニューを所有するウィンドウは通常CMainFrameですから。

さなえ 2002/04/24(水) 14:15:59
Bunさん お久しぶり

私としては
>CWnd::OnRButtonDown(nFlags, point);
が気に入らないのですが。
CView:: じゃないのかな?というのと先にやっちゃえば?
と思うのですが 関係ないかな?

あとリソースのメニューの作り方にコツがなかったですか?

Taro 2002/04/24(水) 14:20:54
Popup.TrackPopupMenu( TPM_CENTERALIGN | TPM_LEFTBUTTON,
    point.x, point.y, AfxGetMainWnd());
として、リビルドした後に実行してみてのですが、
同じ結果になりました。 なにか他の原因はないでしょうか?

Taro 2002/04/24(水) 14:25:48
"リソースのメニューの作り方"にコツってなんですか?

Bun 2002/04/24(水) 14:48:02
>Bunさん お久しぶり

ちわ。お久しゅうごぢぇーます。

>>CWnd::OnRButtonDown(nFlags, point);
>が気に入らないのですが。

あ、ホントだ。

>はじめまして。 日曜プログラマのTaroと申します。

ちわ。

------------------------------------------------------
疑問点1

今日は何曜日?(爆)

疑問点2

右クリックメニューってWM_CONTEXTMENUを使いません?
ClientToScreen()がいらない分だけ、効率的でわあーりませんか。

void ChogeView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
  CMenu menu;
  if (menu.LoadMenu(IDR_MENU1))
    menu.GetSubMenu(0)->TrackPopupMenu(
      TPM_LEFTALIGN, point.x, point.y, AfxGetMainWnd(), NULL );
}

自分のソースを見たら、アサートもせずに、こんな風で動いてました。

Bun 2002/04/24(水) 14:58:33
>Popup.TrackPopupMenu( TPM_CENTERALIGN | TPM_LEFTBUTTON,
>    point.x, point.y, AfxGetMainWnd());
>として、リビルドした後に実行してみてのですが、
>同じ結果になりました。 なにか他の原因はないでしょうか?

くたくたさんのアドバイス通りの方法でやってますか?

通常サブメニューのポインタを取得するから

p->TrackPopupMenu() という形でアクセスするんぢゃないかな?

これでダメならソースをそっくりのせてみますか?

Taro 2002/04/24(水) 14:59:38
a1. 日曜プログラマ->水曜プログラマの間違えでした。

a2. Bunさんのとおりにやってみました。やはり"Error"です。
  半日もこの問題にハマってます。助けてください。

dairygoods 2002/04/24(水) 15:05:48
ちょっと前にもこんなのがありました。
参考になるかもしれません。

ツリービューと右クリックメニューについて
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200204/02040009.txt

Taro 2002/04/24(水) 15:23:06
[[解決]]
みなさん ありがとうございました。
メニューリソースを削除したのち新しく作り直したら、
無事に走りました。
リソースメニューの作りかたのコツ知りませんでした。
これからもお世話になります。 よろしく。

ワルツ 2002/04/24(水) 15:38:10
で、lpRectやm_hWndはどっからでてきたのでしょうか?
最初の質問では使用していないようですが。

ちなみに、「Error」というのウォッチ式での話ですよね。
コンパイルもリンクもうまくいき、それで実行してもうまく表示されないんですよね?

あと皆さんがいっているようにGetSubMenuは必須でしょう。
このときに、ウォッチ式に「Error」がでると何かまずいのでしょうか?

古いスレッドには追加発言できません。