MFC中逻辑坐标(文档坐标)和设备坐标(视图坐标)之间的转换
各位朋友:大家好!我这里有一个程序,希望各位帮我看一下,应该如何修改,指点一下,谢谢!
这个程序的内容是:在一个可拆分窗口中,视图类(View类)是继承CScrollView来的,将视图窗口拆分为左右两块,在任何一边任何位置画圆(按下鼠标左键时产生一个随意大小的圆),在另一边也能同时同步显示,补充一下,滚动条移动后也能作图,在另一边也能同步显示。各个类代码如下:
添加新类:
class CDrawRect : public CObject
{
public:
CRect m_DrawRect;
};
文档类(当然,在StdAfx.h中添加#include<afxtempl.h>):
class CExp6_4Doc : public CDocument
{
public:
CArray<CRect,CRect&> m_Rectag;
};
CExp6_4Doc::CExp6_4Doc()
{
// TODO: add one-time construction code here
m_Rectag.SetSize(256,256);
}
视图类:
class CExp6_4View : public CScrollView
{
public:
CDrawRect *m_ViewDrRect;
};
CExp6_4View::CExp6_4View()
{
// TODO: add construction code here
m_ViewDrRect=new CDrawRect;
}
void CExp6_4View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
//CSize sizeTotal;
// TODO: calculate the total size of this view
//sizeTotal.cx = sizeTotal.cy = 100;
//SetScrollSizes(MM_TEXT, sizeTotal);
CSize sizeTotal(3000,2000);
CSize sizePage(50,50);
CSize sizeLine(10,10);
SetScrollSizes(MM_TEXT,sizeTotal,sizePage,sizeLine);
}
void CExp6_4View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);//获得视图类dc
OnPrepareDC(&dc);//这是一个和坐标映射相关的函数
dc.DPtoLP(&point);//在绘图之前把鼠标位置坐标转换为逻辑坐标*/
CExp6_4Doc *pDoc=GetDocument();
int r=rand()%50+5;
CRect Ret(point.x-r,point.y-r,point.x+r,point.y+r);
pDoc->m_Rectag.Add(Ret);
m_ViewDrRect->m_DrawRect=Ret;
dc.LPtoDP(&Ret);//在显示数据之前把逻辑坐标转换为设备坐标
InvalidateRect(Ret,FALSE);
pDoc->UpdateAllViews(this,0L,m_ViewDrRect);
CScrollView::OnLButtonDown(nFlags, point);
}
问题主要在这个函数中间红色部分:
void CExp6_4View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
CDrawRect *pDrawRect=(CDrawRect*)pHint;
CRect Rect;
Rect=pDrawRect->m_DrawRect;
CClientDC dc(this);
OnPrepareDC(&dc);
dc.LPtoDP(&Rect);//在显示数据之前把逻辑坐标转换为设备坐标
InvalidateRect(Rect,FALSE);
}
void CExp6_4View::OnDraw(CDC* pDC)
{
CExp6_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//pDC->TextOut(10,10,"View");
for(int i=0;i<pDoc->m_Rectag.GetSize();i++)
{
pDC->Ellipse(pDoc->m_Rectag[i]);
}
}
小弟是初学者,希望高手帮帮小弟,谢谢!