弄了个程序,想在鼠标在某个按钮上按下的时候记录一下位置,
抬起的时候记录一下位置,跟一个按钮位置比较,得出用户抬起
时是在按钮的哪个方向。结果搞了半天没弄出来,头都大了。
搞不明白这里面的坐标都是怎么回事了。先后用到以下函数m_Button.GetClientRect(&rect);
m_Button.GetWindowRect(&rect);
OnLButtonUp(UINT nFlags,CPoint point);
ClientToWindow()
GetCursorPos()搞不清这几个函数返回的坐标是怎么回事了。一片混乱函数大概是如下这样,哪里出了问题呢?:
void CTestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
int nClickType=CLICK_NOT;
CRect rect;

if(m_bPressInButton)
{
m_Button.GetWindowRect(&rect);
POINT pt;
GetCursorPos(&pt);
if(pt.x<rect.left)
nClickType=CLICK_LEFT;
else if(pt.x>rect.right)
nClickType=CLICK_RIGHT;
else
nClickType=CLICK_CENTER;
}
m_bPressInButton=false;
CDialog::OnLButtonDown(nFlags,pt);
}
void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rect;
m_Button.GetWindowRect(&rect); POINT pt;
GetCursorPos(&pt); if(pt.x>=rect.left && pt.x<=rect.right && pt.y>=rect.top && pt.y<=rect.bottom)
m_bInButton=true;
else
m_bInButton=false; CDialog::OnLButtonDown(nFlags,point);
}

解决方案 »

  1.   

    你那个代码是不对的,你在按钮上按下 鼠标或者松开鼠标的时候,这两个事件根本就没有触发OnLButtonDown OnLButtonUp 你可以跟踪一下试试看看,要想在鼠标按下按钮的时候触发这些事件必须压迫在
    BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if (pMsg->message == WM_LBUTTONDOWN)
    {
    //...
    }
             else if (pMsg->message == WM_LBUTTONUP)
             {
                      //...
             }

    return CDialog::PreTranslateMessage(pMsg);
    }
    这个里面来实现你的事件都没有触发 你怎么会得到你想要的结果呢,楼主设置端点跟踪。
      

  2.   

    这个问题我已经解决了啊。
    派生了个类,里面处理了WM_LBUTTONDOWN and UP
    主要就是判断点和按钮位置的关系有问题
    BOOL CNewButton::PreTranslateMessage(MSG* pMsg)
    {
     if(pMsg->message==WM_LBUTTONDOWN||pMsg->message==WM_LBUTTONUP)
     {
     if(m_hDlgHWND)
    ::SendMessage(m_hDlgHWND,pMsg->message,pMsg->wParam,pMsg->lParam);
     }
     return FALSE;
    }