将图形显示在屏幕坐标系中的过程称为映射,映射模式分为逻辑坐标和设备坐标。逻辑坐标单位时米制尺度,设备坐标单位是像素。默认情况使用设备坐标系,一个设备坐标等于一个像素,像素的物理大小随设备的不同而不同,设备坐标系原点位于客户区的左上角,x轴水平向右,y轴垂直向下,设备坐标基本单位为一个像素。
“窗口”与“视区”的概念。“窗口”理解为一种逻辑坐标系下的矩形区域,“视区”是设备坐标系下的矩形区域。x方向和y方向的比例因子:x方向比例因子=视区cx / 窗口cx, y方向比例因子=视区cy / 窗口cy 。如果设置SetWindowExt(100,100),SetViewportExt(200,200),则x方向和y方向的比例因子都为2,说明窗口的一个逻辑坐标映射为视区的两个像素。
void CTestView::OnDraw(CDC* pDC){
CTestDoc * pDoc = GetDocument();
CRect rect; //声明CRect类矩形对象
GetClientRect(&rect); //使用CWnd类的成员函数GetClientRect(LPRECT lpRect)获得客户区大小
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式为MM_ANISOTROPIC
PDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右,y轴垂直向下
pDC->SetViewportOrg(rect.width()/2,rect.Heigth()/2); //客户区中心为坐标系原点
}
绘制直线段函数:
MoveTo()和LineTo()函数
每次绘制直线段都是以当前位置为起点,直线段绘制结束后,直线段的终点又成为当前位置。
设置当前位置函数:CDC::MoveTo
原型:
CPoint MoveTo(int x,int y);
CPoint MoveTo(POINT point);
绘制直线段函数:CDC::LineTo
原型:
BOOL LineTo(int x,int y);
BOOL LineTo(POINT point);
举例:
void CTestView::OnDraw(CDC * pDC)
{
CTestCoc * pDoc = GetDocument();
CRect rect;
GetClientRect(&rect);
pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式为MM_ANISOTROPIC
PDC->SetWindowExt(rect.Width(),rect.Height()); //设置窗口
pDC->SetViewportExt(rect.Width(),-rect.Height()); //设置视区:x轴水平向右,y轴垂直向下
pDC->SetViewportOrg(rect.width()/2,rect.Heigth()/2); //客户区中心为坐标系原点
CPoint p0(-100,-50),p1(100,50);
Cpen NewPen,*pOldPen;
NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
pOldPen = pDC->SelectObject(&NewPen);
pDC->MoveTo(p0);
pDC->LineTo(p1);
pDC->SelectObject(pOldPen);
}
在MFC框架中输出图形和文本,如果不在OnDraw()函数中输出,则首先需要获得设备上下文,然后才能调用相应的CDC类的成员函数回吐。在任何时刻最多获得5个设备上下文,所以绘图完成后应释放所获得的设备上下文。
CDC* GetDC();
如果调用成功,返回当前屏幕客户去的设备上下文指针,否则,返回NULL
int ReleaseDC(CDC* pDC);
pDC是被释放的设备上下文指针,如果调用成功,返回“非0”,否则,返回“0”。