开发工具:VS.Net 2003各位好啊,碰到如下问题,不解,很纳闷,请指教!问题描述:我想用鼠标右键点击动态所创建的一个对象OO,
类似于在对话框编辑器放置的一个按钮控件BB。我写的一个类CX,继承于CWnd 类,
然后在// AutoTestFlatDlg.cpp 文件中动态创建OO,创建的同时,加载一副位图显示到OO上,该OO非常类似于BB,当程序运行时,可以用鼠标来改变OO的大小和移动它的位置。现在,我想当OO被鼠标选中之后,光标在OO所在矩形区域内时,点右键即弹出菜单。可是,选中OO之后,将光标移动到对话框的其它地方才能弹出菜单。当我在函数头设置断点后,调试,发现当光标在OO所在矩形区域内根本不执行OnRButtonDown函数,请问这怎么回事呢? 代码://断点// void CAutoTestFlatDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nFlags = MK_RBUTTON )
{
BringWindowToTop(); //CWnd * dlg = m_pSelectedCtrl->GetParent();
//CRect WndRect;
//dlg->GetWindowRect(&WndRect);
//dlg->ScreenToClient(&WndRect); //::GetCursorPos(&point);
//ScreenToClient(&point);
//m_pSelectedCtrl->GetDlgItem(dlgID);
//m_pSelectedCtrl->SetFocus(); if (m_pSelectedCtrl) //当所创建的对象被选中时,便执行if语句里的内容
{
CWnd *pWnd = ChildWindowFromPoint(point);
CMenu bar;
if (bar.LoadMenu(IDR_MENU2))
{
CMenu & popup = *bar.GetSubMenu(0);
ASSERT(popup.m_hMenu != NULL); ClientToScreen(&point);
popup.TrackPopupMenu(TPM_RIGHTBUTTON, point.x, point.y, pWnd); 
} }
} CDialog::OnRButtonDown(nFlags, point);
}

解决方案 »

  1.   

    你的OO是控件吧?它自己攔截了鼠標消息,然後你在父窗口裡邊處理右鍵消息,自然收不到。
    可以做消息反射,或者子類化OO這個控件
      

  2.   

    请问一下,如果用消息反射做的话,是不是要在AutoTestFlatDlg.cpp 中添加OnNotify函数呢?如下,BOOL CAutoTestFlatDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
    // TODO: 在此添加专用代码和/或调用基类 if (m_pSelectedCtrl)
    {
    if (ReflectLastMsg(m_pSelectedCtrl->m_hWnd, pResult)) //此时,m_pSelectedCtrl->m_hWnd,为发送窗口,即子窗口的窗口句柄 
    return TRUE; // 子窗口已处理了此消息 
    } return CDialog::OnNotify(wParam, lParam, pResult);
    }
    可是没反应啊,还是不解!请指点,谢谢了。
      

  3.   

    popup.TrackPopupMenu(TPM_RIGHTBUTTON,point.x, point.y,pWnd);  这句。最后一个参数应该决定了右键菜单在哪个窗口显示。