【程序4:】 编写一个单文档的应用程序,在视图窗口中显示3个圆,通过使用不同颜色的画笔以及画刷来模拟交通红绿灯。
关键代码:
void CTest2View::OnDraw(CDC* pDC) { CTest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPen *PenOld,PenNew; CBrush *BrushOld,BrushNew;
PenOld = (CPen *) pDC->SelectStockObject(BLACK_PEN);//使用库存黑色画笔 BrushNew.CreateSolidBrush(RGB(255,0,0));//红色 BrushOld=pDC->SelectObject(&BrushNew); CRect rect1(0,0,100,100); pDC->Ellipse(&rect1);
BrushNew.DeleteObject();//每次使用完新画刷,释放掉新画刷 BrushNew.CreateSolidBrush(RGB(255,255,0));//黄色 pDC->SelectObject(&BrushNew); CRect rect2(0,100,100,200); pDC->Ellipse(&rect2); BrushNew.DeleteObject();
BrushNew.CreateSolidBrush(RGB(0,255,0));//绿色 pDC->SelectObject(&BrushNew); CRect rect3(0,200,100,300); pDC->Ellipse(&rect3); BrushNew.DeleteObject(); //恢复系统默认的GDI对象 pDC->SelectObject(PenOld); pDC->SelectObject(BrushOld); }
结果截图:
5
【程序5:】 编写一个单文档的应用程序,在视图窗口实现一行文本的水平滚动显示,要求每个周期文本为红、黄两种颜色,字体为宋、楷两种字体。
关键代码: public:
bool flag;//用于标记当前文本颜色字体状态 int x; //用于指定文本的起始位置 //初始化变量
CSy2_5View::CSy2_5View() {
x=0;//文字滚动起点 flag=1;//标记当前文字出于哪种状态,初始定为宋体红字 // TODO: add construction code here }
void CSy2_5View::OnDraw(CDC* pDC) { CSy2_5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here SetTimer(0,100,NULL);//启动定时器,每隔0.1秒执行一次任务 CString outString=\滚动的文字\ COLORREF strRgb[]={RGB(255,0,0),RGB(255,255,0)};
6
}
pDC->SetBkMode(TRANSPARENT);//设置背景模式 CRect r1;
GetClientRect(&r1);//获取当前客户区的矩形大小赋值给r1 CFont *OldFont,NewFont; if( flag == 1) {
NewFont.CreatePointFont(200,\宋体\pDC->SetTextColor(strRgb[0]);
OldFont=pDC->SelectObject(&NewFont); pDC->TextOut(0+x,0,outString); pDC->SelectObject(OldFont); NewFont.DeleteObject();
if(x>=r1.right) //如果大于视图边界就切换文本颜色和字体属性,令flag=0; { x=0; flag=0; } }
if( flag == 0) { }
NewFont.CreatePointFont(200,\楷体\pDC->SetTextColor(strRgb[1]);
OldFont=pDC->SelectObject(&NewFont); pDC->TextOut(0+x,0,outString); pDC->SelectObject(OldFont); NewFont.DeleteObject(); if(x>=r1.right) { x=0; flag=1; }
//定义定时器
void CSy2_5View::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default this->Invalidate();//重绘视图窗口 x+=10; CView::OnTimer(nIDEvent); }
结果截图:
7
四、实验总结 本次实验熟悉了Windows编程的基本操作,并且初步掌握了利用GDI绘制图形和文本的方法,是一次很有意义的上机训练。
8