发觉X/Y是以屏幕X/Y的。怎么回事?有什么办法就在ListView区域内弹出菜单?BOOL CClearFileDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if((int)wParam == IDC_LIST_FILE)
{
NMHDR *pnmh = (LPNMHDR)lParam;
if(pnmh->code == NM_RCLICK)
{
NMITEMACTIVATE *nmitem = (LPNMITEMACTIVATE)lParam;
CString str;
CRect rect;
GetDlgItem(IDC_LIST_FILE)->GetWindowRect(rect);
//this->ScreenToClient(rect);
str.Format(TEXT("%d %d"), nmitem->ptAction.x, nmitem->ptAction.y);
CMenu *pSub = m_hMenu.GetSubMenu(0);
pSub->TrackPopupMenu(TPM_LEFTALIGN, nmitem->ptAction.x, nmitem->ptAction.y,GetDlgItem(IDC_LIST_FILE), NULL);
/*MessageBox(str);*/
}
}
return CDialog::OnNotify(wParam, lParam, pResult);
}

解决方案 »

  1.   

    GetCursorPos( &point );
    menu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTALIGN | TPM_LEFTBUTTON, point.x, point.y, this );
      

  2.   


    HMENU refresh_copyMenu;
    void show_my_menu(HWND handle) {
    HMENU mmainmenuu = refresh_copyMenu = CreatePopupMenu();
    POINT pi;
    GetCursorPos( &pi );
    MENUITEMINFO mi;
    mi.cbSize = sizeof( MENUITEMINFO );
    mi.fMask = MIIM_TYPE | MFT_STRING ;//| MIIM_SUBMENU;
    mi.fType = MFT_STRING;
    mi.dwTypeData = "我的菜单";
    AppendMenu(mmainmenuu, MF_STRING , (int)mi.dwTypeData, mi.dwTypeData);
    char* rtgp = (char*)TrackPopupMenu( refresh_copyMenu, TPM_RETURNCMD ,
    pi.x, pi.y, 0, handle, NULL );
    if(rtgp != 0){
    if(strcmp( "我的菜单", rtgp ) == 0){
    //菜单被点击了,你想干什么
    }
    }
    }然后在 NOTIFY消息里 执行 show_my_menu(hDlg)就ok
      

  3.   

    我是这么做的:
    POINT curPos;                        
    GetCursorPos(&curPos); //得到鼠标(屏幕)坐标
    POINT ClientPos=curPos;
    ScreenToClient(&ClientPos);//转换为鼠标(客户)坐标