我建立了一个基于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);
}
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);
}
头文件中加以下两行
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);
}