正在写一个模拟splitter的东西,使用按钮充当分隔条(上下分隔型的),现遇到2个问题。问题代码如下:
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rect;
if (this->ifBtnDown)
{
this->GetClientRect(&rect);
this->MoveWindow( rect.left, point.y, rect.right-rect.left, rect.bottom-rect.top, TRUE);
return;
}
CButton::OnMouseMove(nFlags,point);
//................
}
问题描述:
1.我拖动按钮的时候,是希望按钮左右不移动,上下移动。但是我用上面的方式转换,按钮都会往左偏移一段。而且上下位置相差很大。
2.我希望在按钮CMyButton::OnLButtonUp(鼠标左键放开)中释放我按钮的焦点。

解决方案 »

  1.   

    附带一问
    CButton::OnMouseMove(nFlags,point);
    这句话必要否?必要的话一般放在最上面还是哪里?
      

  2.   

    point 要进行个ScreenToClient的转换吧。
      

  3.   

    GetClientRect(&rect)得到客户端窗口的矩形区域,一般情况下rect.left,rect.right均为零。而MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE )中,x,y为对应的父窗口的左上角的坐标。OnMouseMove( UINT nFlags, CPoint point );Point.x,Point.y是相对窗口而言的相对坐标。把这些坐标的关系搞清楚,不难得出答案。如果父窗口,屏幕坐标难以计算,可以都转化成屏幕坐标
    ClientToScreen(&rect);
    ClientTopScreen(&point);
    或者客户窗口坐标
    ScreenToClient(&rect);
    ScreenToClient(&point);
      

  4.   

    CButton::OnMouseMove(nFlags,point); 
    放在最后吧子类没有处理的其他消息交给父类去处理
      

  5.   

    把这段代码放到Dialog::MouseMove里,然后改一下
    m_button.GetWindowRect(&rect);
    ScreenToClient(&rect);
    m_button.MoveWindow(.......);
      

  6.   

    其实我原本就是楼上说的做的
    this->GetWindowRect(&rect);
    this->ScreenToClient(&rect);
    this->MoveWindow(rect.left,point.y,rect.right-rect.left,rect.bottom-rect.top,TRUE);
    return;
    但我经过转换后rect.left总是等于0,而point.y永远等于1.不知道为啥
      

  7.   

    CRect的事情想明白了
    坐标转换函数得换成按钮的父窗口对象现在就是CPoint那个不知道为啥有问题了。point.y永远等于1
      

  8.   

    MoveWindow应该是相对父窗口的坐标,先用GetWindowRect得到在屏幕上的坐标,再ScreenToClient得到在父窗口中的坐标,最后再MoveWindow
      

  9.   

    可能是取到相对button的坐标了?
      

  10.   

    全都想明白了,我的程序是写在CMyButton::OnMouseMove中,所以一切this出来的函数都是针对CButton的,也就是说那些rect和point都是指button内部的所以必须在父窗口中处理。谢谢大家,结贴!