我的这段程序,鼠标的x坐标取的好象不对!LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static HINSTANCE hInstance;
static HMENU popMenu,hMenu;
static POINT pt;
char buff[50]; switch(msg)
{
case WM_CREATE:
hInstance=((LPCREATESTRUCT)lParam)->hInstance;
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_TRAY_MENU));
popMenu=GetSubMenu(hMenu,0);
return 0;
case WM_COMMAND: switch(LOWORD(wParam))
{
             case IDM_ABOUT_DIALOG:
                  DialogBox (hInstance, MAKEINTRESOURCE(IDD_TESTTRAY_DIALOG), hwnd, AboutDlgProc) ;
  return 0;
 case IDM_EXIT:
 SendMessage(hwnd,WM_DESTROY,0,0);
 return 0;
}
return 0;
case WM_LBUTTONDOWN:
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
wsprintf(buff,"x is %d",pt.x);
MessageBox(NULL,buff,"",MB_OK);
return 0; case WM_SIZE:
if(wParam==SIZE_MINIMIZED)
{
myTray.hWnd=hwnd;        //把当前窗口加到SysTray
myTray.AddIcon();
ShowWindow(hwnd,SW_HIDE);
}
return 0; case TRAY_NOTIFYICON:   //NOTIFYICONDATA.uCallbackMessage
switch(lParam)
{
case WM_RBUTTONDOWN:
pt.x=LOWORD(lParam);
//pt.y=HIWORD(lParam);
ClientToScreen(hwnd,&pt);
/*这一句:menu 没有显示在鼠标的当前位置*/
TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
return 0;
case WM_LBUTTONDBLCLK:
 myTray.DeleteIcon();
 ShowWindow(hwnd,SW_SHOW);
 return 0;
}
return 0; case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}

解决方案 »

  1.   

    CPoint pos;
          GetCursorPos(&pos);
      

  2.   

    SDK下
      POINT pos;
      GetCursorPos(&pos);
      

  3.   

    case WM_LBUTTONDOWN:
    ClientToScreen(&pt);  // 加上这句
    pt.x=LOWORD(lParam);
    pt.y=HIWORD(lParam);
    wsprintf(buff,"x is %d",pt.x);
    MessageBox(NULL,buff,"",MB_OK);
    return 0;
      

  4.   

    case WM_LBUTTONDOWN:
    pt.x=LOWORD(lParam);
    pt.y=HIWORD(lParam);
    ClientToScreen(&pt);  // 加上这句
    wsprintf(buff,"x is %d",pt.x);
    MessageBox(NULL,buff,"",MB_OK);
    return 0;
      

  5.   

    case WM_RBUTTONDOWN:
    pt.x=LOWORD(lParam);
    pt.y=HIWORD(lParam);
    ClientToScreen(hwnd,&pt);
    /*这一句:menu 没有显示在鼠标的当前位置*/
    TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
    return 0;其实我加了ClientToScreen(hwnd,&pt),还是不正确!
      

  6.   

    先使用GetCursorPos()得到当前鼠标位置,然后再调用TrackPopupMenu我就是这么做的呀
      

  7.   

    我想知道这样做为什么不正确:case WM_RBUTTONDOWN:
    pt.x=LOWORD(lParam);
    pt.y=HIWORD(lParam);
    ClientToScreen(hwnd,&pt);
    /*这一句:menu 没有显示在鼠标的当前位置*/
    TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
    return 0;
      

  8.   

    LRESULT CQQDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
    {
    switch(lParam)
    {
    case WM_RBUTTONUP:
    {
    CMenu m_Menu;
                if(m_Menu.LoadMenu(IDR_MENU))
                {
    CMenu* pPop=m_Menu.GetSubMenu(0);
                    CPoint m_Point;
    if(IsWindowVisible())
    m_Menu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"隐藏");
    else
    m_Menu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"显示");
    if(bStatus)
    {
    m_Menu.ModifyMenu(IDC_STATUS,MF_STRING,IDC_STATUS,"禁用");
    }
    else
    {
    m_Menu.ModifyMenu(IDC_STATUS,MF_STRING,IDC_STATUS,"启动");
    }
    GetCursorPos(&m_Point);
                    SetForegroundWindow();
                    pPop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,m_Point.x,m_Point.y,this);
    }
    }
    break;
    case WM_LBUTTONDOWN:
    {
    OnShow();
    }
    break;
    }
    return 0;
    }
      

  9.   

    我想知道这样做为什么不正确,这一段程序有什么问题:case WM_RBUTTONDOWN:
    pt.x=LOWORD(lParam);
    pt.y=HIWORD(lParam);
    ClientToScreen(hwnd,&pt);
    /*这一句:menu 没有显示在鼠标的当前位置*/
    TrackPopupMenu(popMenu, TPM_RIGHTALIGN|TPM_LEFTBUTTON, pt.x, GetSystemMetrics(SM_CYSCREEN)-50, 0, hwnd, NULL) ;
    return 0;