我建立了一个基于CScrollView类的SDI 我实现了按下鼠标左键可以画橡皮筋  也可以选中和改变橡皮筋的大小 现在我遇到的问题是  我画出来的矩形当滚动条滑动的时候橡皮筋不跟着滑动 他们说是坐标问题 可是我一直没解决 希望大家可以帮我 我把代码贴出来哈
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(m_bRectangle)
{  

for (int i=0;i<NumberOfRect;i++)
{
m_rectTracker[i].m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;
m_rectTracker[i].Draw(pDC);
if (i==SelectedRect)
{
     m_rectTracker[i].m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;
     m_rectTracker[i].Draw(pDC);
     pDC->FillSolidRect(m_rectTracker[i].m_rect,RGB(255,255,0));
}

}
}
}
void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
m_bRectangle=true;
int  Number=0;  
CPoint ScrollPosition=GetScrollPosition();
for (int i=0;i<NumberOfRect;i++)
{
if (m_rectTracker[i].HitTest(point) > 0)
{
Number++;
SelectedRect=i;
}
}
if (Number>0)
{
m_rectTracker[SelectedRect].Track(this, point, TRUE);
Invalidate();

}
else
{  

m_rectTracker[NumberOfRect].TrackRubberBand(this, point, TRUE);
if (m_rectTracker[NumberOfRect].m_rect.Width()>5||m_rectTracker[NumberOfRect].m_rect.Height()>5)
{
                        NumberOfRect++;
Invalidate();
}

}
CScrollView::OnLButtonDown(nFlags, point);
}

解决方案 »

  1.   

    http://download.csdn.net/down/1312108/qiaoleihao
      

  2.   

    滚动的时候,得调整tracker的rectangle吧。
      

  3.   

    我的分不够 你可不可以传一个给我呢 谢谢 [email protected]
      

  4.   

    例子已经回复到你邮箱,关键代码如下。
    头文件中加以下两行
    CRect m_rect;
    BOOL m_bNewRect;构造函数中初始化。
    CTest1View::CTest1View()
    {
    // TODO: add construction code here
    m_rect.SetRect(0,0,0,0);
    m_bNewRect = FALSE;
    }
    void CTest1View::OnDraw(CDC* pDC)
    {
    CTest1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CRectTracker rectTracker;
    CRect rc;
    if(m_bNewRect)
    {
    //m_rect 第一次存放设备坐标,是从OnLbuttondown取得的,在OnLButtonDown中不好转换,所以放在这里转,你也可以在OnLButtonDown
    //中转换,但要先得到pDC。
    //转换一次后,m_rect中始终存放的是逻辑坐标
    pDC->DPtoLP(&m_rect);
    m_bNewRect = FALSE;
    }
    rc = m_rect;
    pDC->LPtoDP(&rc);//CRectTracker类需要的是设备坐标,所以再转一次,新增一个变量rc是因为LPtoDP的参数是指针,也就是说要改变参数rect的值的。
    //不希望每次刷新m_rect的值都被变掉。m_rect的值应该只能在OnLButtonDown中变。
    rectTracker.m_rect = rc;
    rectTracker.m_nStyle = CRectTracker::resizeInside|CRectTracker::dottedLine;
    rectTracker.Draw(pDC);
    }void CTest1View::OnLButtonDown(UINT nFlags, CPoint point)  
    {
    // TODO: Add your message handler code here and/or call defaultCRectTracker tracker;
    tracker.TrackRubberBand(this, point, TRUE);
    tracker.GetTrueRect(m_rect);
    m_bNewRect = TRUE;
    Invalidate();
    CScrollView::OnLButtonDown(nFlags, point);
    }