逻辑坐标和设备坐标的区别(二)

2014-11-24 03:11:25 · 作者: · 浏览: 1
ntDC dc(this); //然后绘制一条线! dc.MoveTo(m_ptOr); dc.LineTo(m_ptDe); CScrollView::OnLButtonUp(nFlags, point); }
然后窗口重绘时,我们仍然画出这条直线!

void CMyScrollView::OnDraw(CDC* pDC)
{
	CScrollDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	pDC->MoveTo(m_ptOr);//画一条线
	pDC->LineTo(m_ptDe);
}

看一下执行结果:

先将滚动条拉下来,在下方绘制一条直线!

\

然后切换一下窗口!结果很有趣!

\

看见没有,直线移上去了,我来解释解释这种现象!不过在这之前,先吃一个饭,然后再来说明吧!

当我们切换窗口时,程序发出WM_PAINT消息,这个消息由CXXView::OnPaint()函数处理!具体看文件前面的说明!调用顺序如下:

CView::OnPaint() -> CScrollView::OnPrePareDC() -> CXXView::OnDraw()

在CScrollView::OnPrePareDC()中:

\

所谓视口原点,也可以说是设备坐标系的原点!

然后执行OnDraw函数:

\

怎么处理?

利用函数CDC的函数DPtiLP将设备坐标变换成逻辑坐标即可!只需要更改OnLButtonDown和OnLButtonUp两个函数即可!

void CMyScrollView::OnLButtonDown(UINT nFlags, CPoint point) 
{

	//现在来绘制一个点!
    CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.DPtoLP(&point);
	m_ptOr = point; //现在将这个点的坐标记录下来,待会儿再重绘回来!
	//dc.SetPixel(point, RGB(255, 0, 0));
	
	CScrollView::OnLButtonDown(nFlags, point);
}

void CMyScrollView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	
	CClientDC dc(this);
	OnPrepareDC(&dc);
	dc.DPtoLP(&point);
	m_ptDe = point;  //先将终点坐标记录下来!
	//然后绘制一条线!
	dc.MoveTo(m_ptOr);
	dc.LineTo(m_ptDe);
	CScrollView::OnLButtonUp(nFlags, point);
}