导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

托盘程序问题,如何获得当前鼠标的屏幕坐标?

cchon 2004-04-04 10:41:59
我的这段程序,鼠标的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);
}
...全文
31 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoiseLI 2004-04-05
先使用GetCursorPos()得到当前鼠标位置,然后再调用TrackPopupMenu

我就是这么做的呀
回复
gjd111686 2004-04-05
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;
}
回复
cchon 2004-04-05
我想知道这样做为什么不正确:

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;
回复
cchon 2004-04-05
我想知道这样做为什么不正确,这一段程序有什么问题:

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;

回复
cchon 2004-04-04
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),还是不正确!
回复
oldforest 2004-04-04
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;
回复
oldforest 2004-04-04
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;
回复
SDK下
POINT pos;
GetCursorPos(&pos);
回复
CPoint pos;
GetCursorPos(&pos);
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……