导航
  • 主页
  • VC/MVC基础类
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC/MFC&Web
  • Doc/View
  • VC++技术资源

在Dialog上的控件List上实现OnMouseMove 怎样得到List上的坐标

majiaLT01 2009-08-07 09:35:46
对Dialog能实现OnMouseMove的移动,但是我在Dialog里添加了List Control控件,用来显示某些参数,

因为是在手机里运行大多数用手操作,右侧的滚动条不太方便,我想做成能够用手在List上,
上下拖动(OnMouseMove是在Dialog上,现在让OnMouseMove在List上实现)但是不影响单击List的触发。

现在思路是 取得在List上移动的坐标,再将移动的值传给Scroll函数,继而实现移动,可是怎样得到

鼠标在list上停留 移动的坐标呢??
...全文
268 点赞 收藏 30
写回复
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
skynfly 2009-08-07
[Quote=引用 16 楼 zhaofei_33101 的回复:]
怎样判断是否在List上移动啊 好像没有进展
[/Quote]

我给你的那段代码,就是判断是否在List上移动啊!
回复
skynfly 2009-08-07
[Quote=引用 15 楼 skynfly 的回复:]
要先判断鼠标是不是在List中移动吧,
然后再得到鼠标位置
[/Quote]
我给你的那段代码,就是判断是否在List上移动啊!
回复
majiaLT01 2009-08-07
怎样判断是否在List上移动啊 好像没有进展
回复
skynfly 2009-08-07
要先判断鼠标是不是在List中移动吧,
然后再得到鼠标位置
回复
fishion 2009-08-07
不能在OnLButtonDown捕捉消息,要在PreTranslateMessage里捕捉消息
回复
majiaLT01 2009-08-07
[Quote=引用 10 楼 dengxuxing 的回复:]
这个能取到光标在LIST控件上的位置
CListCtrl* plist = (CListCtrl*)GetDlgItem(IDC_LIST);
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos),HIWORD(dwPos));
plist->ScreenToClient(&point);
[/Quote]


我在OnLButtonDown(UINT nFlags, CPoint point) 里面写了这个代码

发现只有在Dialog上点击时有坐标,在List上move还是没反应,除非点击Item触发点击List事件 而没有得到坐标。
回复
majiaLT01 2009-08-07
谢谢各位 我试试
回复
skynfly 2009-08-07
[Quote=引用 8 楼 ghost90 的回复:]
5楼方法不行在对话框上拦不到鼠标在List上的坐标位置
[/Quote]

鼠标在List控件上移动时,OnMouseMove进来了没?
这里判断是不是在List控件上移动,List上坐标还要转换下吧
回复
dengxuxing 2009-08-07
这个能取到光标在LIST控件上的位置
CListCtrl* plist = (CListCtrl*)GetDlgItem(IDC_LIST);
DWORD dwPos = GetMessagePos();
CPoint point(LOWORD(dwPos),HIWORD(dwPos));
plist->ScreenToClient(&point);
回复
zhuzhenlei 2009-08-07
http://k.pconline.com.cn/question/1686435.html
参考下吧
回复
Ghost90 2009-08-07
5楼方法不行在对话框上拦不到鼠标在List上的坐标位置
回复
Ghost90 2009-08-07
鼠标钩子

HHOOK hHook;
LRESULT ProcHook(int nCode,WPARAM wParam,LPARAM lParam)
{
if(wParam==WM_RBUTTONDOWN)
{
POINT pt;
GetCursorPos(&pt); //得到鼠标坐标



}

return CallNextHookEx(hHook,nCode,wParam,lParam);

}


hHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)ProcHook,hInstance,GetCurrentThreadId());
回复
yuhudie203 2009-08-07
[Quote=引用 4 楼 zhaofei_33101 的回复:]
GetCursorPos可以取到Dialog 的坐标 但是在List控件上move是 取不到坐标
[/Quote]
进行一下坐标转换~
回复
skynfly 2009-08-07
在对话框中拦截WM_MOUSEMOVE消息
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_MOUSEMOVE)
{
SendMessage(WM_MOUSEMOVE,pMsg->wParam,pMsg->lParam);
}
return CDialog::PreTranslateMessage(pMsg);
}

然后再OnMouseMove()中判断在不在List控件里面
void CTestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
CRect rect;
CListCtrl* plist = (CListCtrl*)GetDlgItem(IDC_LIST);
plist->GetClientRect(&rect);
plist->ClientToScreen(&rect);
ScreenToClient(&rect);
if (PtInRect(&rect,point))
{
TRACE("InList\r\n");
}
}
回复
majiaLT01 2009-08-07
GetCursorPos可以取到Dialog 的坐标 但是在List控件上move是 取不到坐标
回复
majiaLT01 2009-08-07
[Quote=引用 1 楼 fishion 的回复:]
派生一个CListCtrl类,在里面添加方法
[/Quote]

派生只是停留在理论 没实际用过 能帮我写下模板么 谢谢
回复
zhuzhenlei 2009-08-07
GetCursorPos不行吗
回复
fishion 2009-08-07
派生一个CListCtrl类,在里面添加方法
回复
majiaLT01 2009-08-07
谢谢你 帮助我的大忙啦 这个问题基本就搞定了 谢谢 给分
回复
skynfly 2009-08-07
plist->GetClientRect(&rect);//得到LIST窗体的客户区大小
DWORD dwPos = GetMessagePos();//the cursor position for the last message
CPoint spoint(LOWORD(dwPos),HIWORD(dwPos)); //转换成坐标点
plist->ScreenToClient(&spoint); //上面得到的是屏幕坐标,转换成list的客户区坐标


spoint就是你要的list的坐标
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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