Last Updated 2002/12/04
 Programming Tips  Visual C++ MFC メニュー  索 引 
CTreeViewでのポップアップメニュー不具合
2002/12/04

CTreeView およびその派生クラスにて,マウスの右クリックにてメニューを表示させる時には注意が必要である.
OnRButtonDown() にてメニューを表示,メニュー項目選択にてダイアログボックスを表示させるとアクティブに見えてもフリーズしたかのような状態になる.
(タイトルバーはアクティブになっている)
(しかしダイアログの操作は行えない)
他のアプリケーションを1度アクティブにしてから再びこのアプリをアクティブにするとダイアログボックスの操作が可能になる.

OnRButtonUp() に実装してみるとどうなるか?
右ボタンダブルクリックか右ボタンドラッグをしないとメニューが表示されなくなる.(ダイアログボックスは操作できる)

CView から派生させたものは正常に動作する.

void CMyTreeView::OnRButtonDown(UINT nFlags, CPoint point) 
{

  //ポップアップメニューの呼び出し
  CMenu menu;
  menu.LoadMenu(IDR_MAINFRAME);
  CMenu *menu_sub = menu.GetSubMenu(3);
  ClientToScreen(&point);
  menu_sub->TrackPopupMenu( TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);

  CTreeView::OnRButtonDown(nFlags, point);
}


CTreeView にて右クリックメニューを表示するのは,NM_RCLICK ハンドラに記述するとよい.

void CMyTreeView::OnRClick(NMHDR* /*pNMHDR*/, LRESULT* pResult) 
{
    CMenu menu;
    CPoint posMouse;

    VERIFY(menu.LoadMenu(IDR_POPUP_MENU));
    ::GetCursorPos(&posMouse);
    menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, posMouse.x, posMouse.y, this);

    *pResult = 0;
}

原因は不明である.


参照
前後のTips
CTreeViewでのポップアップメニュー不具合

DSS ProgrammingTipsCGI Ver2.00