MFC CSliderCtrl滑块直接定位到鼠标的点击x坐标

来源:互联网 发布:在淘宝买steam游戏 编辑:程序博客网 时间:2024/05/18 02:10

项目中使用到CSliderCtrl控件来设置并显示当前进度。在设置进度时,每点击一下,滑标就会往相应的方向滑动一个步距。然而,这并不符合使用习惯:希望滑标直接定位到鼠标点击处。

实现对CSliderCtrl消息的响应时,在父窗口类中重载OnNotify虚函数:
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);

BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) {    // TODO: Add your specialized code here and/or call the base class    NMHDR* nmhdr = (LPNMHDR)lParam;    if(ID_SLIDER_FOR_REPLAY == wParam && NM_RELEASEDCAPTURE == nmhdr->code)    {        CPoint point;        GetCursorPos(&point); //获取点击坐标        //do something here        //return FALSE;    }    return CMDIFrameWndEx::OnNotify(wParam, lParam, pResult);}

NM_RELEASEDCAPTURE,是子控件被鼠标按住拖动到适当位置以后鼠标释放时子控件向父控件产发送的消息,对于Slider来说就是每次滑块被鼠标拖曳完鼠标释放的时候滑块给Slider发送的消息。
另:虽然在MSDN中表明NMHDR(Contains information about a notification message)和NM_RELEASEDCAPTURE的Minimum supported client为Windows Vista [desktop apps only],但在XP上测试运行正常。

然后,就可以将点击坐标转换为滑标在滑道的相应位置:

        //...        CRect rect;        m_pSlidCtrl.GetWindowRect(&rect);  //获取CSliderCtrl控件相对屏幕的位置        CRect channelRect;        m_pSlidCtrl.GetChannelRect(&channelRect); //获取滑道相对于控件的位置        int pointX = clickX - channelRect.left - rect.left;   //clickX是上一段代码清单中获取到的点击横坐标        int rangeWidth = channelRect.Width();        int pos = (int)pointX * m_pSlidCtrl.GetRangeMax() / rangeWidth;        m_pSlidCtrl.SetPos(pos)        //...

VS2010生成的exe文件图标使用的是Icon下ID值最小的图标,顺次为IDR_MAINFRAME、IDR_ICONTETYPE…

0 0