资源描述
实验二 图形与文本
一、 实验目的和要求
1、了解CDC类的使用
2、掌握常用绘图函数的使用
3、学会设置字体
4、掌握画笔和画刷的使用
5、了解不同文本输出函数的用法
二、 实验内容
1、编写程序Sy2_1,在客户区显示一行文本,要求文本颜色为红色、背景为黄色。
如下图所示:
代码如下
void CSy2_1View::OnDraw(CDC* pDC)
{
CSy2_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(255,255,0));
pDC->TextOut(20,30,"红色字体,黄色背景!");
}
2、 编写一个应用程序Sy2_2,在客户区使用不同的画笔和画刷绘制点、折线、曲线、圆角矩形、弧、扇形和多边形等几何图形。
如图
代码如下:
void CSy2_2View::OnDraw(CDC* pDC)
{
CSy2_2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen *penOld,penNew;
CBrush *brushOld,brushNew;
penNew.CreatePen(PS_SOLID,5,RGB(255,0,0));
pDC->SelectObject(&penNew);
pDC->SetPixel(CPoint(100,100),RGB(255,0,0));
pDC->MoveTo(150,70);
pDC->LineTo(300,100);
pDC->LineTo(400,240);
pDC->LineTo(200,270);
pDC->MoveTo(500,100);
pDC->Arc(20,200,200,300,200,250,20,200);
pDC->RoundRect(450,100,600,200,30,30);
pDC->Arc(100,300,300,500,300,400,200,300);
pDC->MoveTo(300,400);
pDC->LineTo(200,400);
pDC->MoveTo(200,300);
pDC->LineTo(200,400);
POINT pt[6]={{400,300},{500,300},{550,385},{500,460},{400,460},{350,385},};
pDC->Polygon(pt,6);
}
3、 编写Sy2_3,利用函数CreateFontIndirect()创建黑色字体,字体高度为30像素,宽度为25像素,并利用函数DrawText()在客户区以该字体输出文本“VC++”。
如图
代码如下:
void CSy2_3View::OnDraw(CDC* pDC)
{
CSy2_3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rect;
rect.SetRect(CPoint(50,60),CPoint(300,200));
CFont*OldFont,NewFont;
LOGFONT MyFont={
30,25,0,0,0,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,
"黑体"
};
NewFont.CreateFontIndirect(&MyFont);
OldFont=pDC->SelectObject(&NewFont);
pDC->DrawText("VC++",&rect,DT_WORDBREAK|DT_CENTER);
NewFont.DeleteObject();
}
4、 编写单文档应用程序Sy2_4,在视图中显示三个圆,通过使用不同颜色的画笔及画刷来模拟交通红绿灯。
如图:
代码如下:
void CSy2_4View::OnDraw(CDC* pDC)
{
CSy2_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen *OldPen,NewPen;
CBrush *OldBrush,NewBrush;
COLORREF rgb[]={RGB(255,0,0),RGB(255,255,0),RGB(0,255,0)};
for(int i=0;i<3;i++){
NewBrush.CreateSolidBrush(rgb[i]);
OldBrush=pDC->SelectObject(&NewBrush);
pDC->Ellipse(70+100*i,70,150+100*i,150);
NewBrush.DeleteObject();
}
}
5、 编写程序Sy2_5,实现一行文本水平滚动显示,要求每个周期文本为红、黄两种颜色,字体为宋、楷两种字体。
如图
代码如下:
void CSy2_5View::OnDraw(CDC* pDC)
{
CSy2_5Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CFont *OldFont,NewFont;
if(flag%2==0)
{
pDC->SetTextColor(RGB(255,0,0));
NewFont.CreatePointFont(200,"宋体",NULL);
}
if(flag%2==1)
{
pDC->SetTextColor(RGB(255,255,0));
NewFont.CreatePointFont(200,"楷体",NULL);
}
OldFont=pDC->SelectObject(&NewFont);
pDC->TextOut(x,50,"漂移");
pDC->SelectObject (OldFont);
SetTimer(1,10,NULL);
NewFont.DeleteObject();
}
void CSy2_5View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
x++;
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
if(x>=rect.right)
{
x=0;
flag++;
}
Invalidate();
CView::OnTimer(nIDEvent);
}
三、 实验总结
这次的实验做的时间有点长,不过收获还是蛮多的,比如如何设置文本的字体、颜色等属性。其中很关键的是通过第五个实验使我了解到OnTimer()函数的用法以及对Invalidate()函数的使用。
展开阅读全文