Windows实验报告(计算机科学与技术学院计1121113022032康照玲)一、实验一1、题目:在窗口上显示一个正方形内切圆,单击左键或者停顿5秒后显示正方形外接圆,在此之间交替显示。2、关键代码分析本次试验我是主要是实现定时5秒的转换,首先在创建窗口时设置定时器,在窗口函数中响应其信息,然后对设置的标志进行赋值,一次实现其定时功能。关键代码如下:HDChDC;//定义设备环境句柄.intx,y,z;//标志窗口处的坐标点PAINTSTRUCTps;//定义绘图结构体变量.staticBOOLflag=TRUE;//标志定时功能HBRUSHhBrush;//SetTimer(hWnd,1,2000,NULL);switch(iMessage){caseWM_CREATE:return0;caseWM_TIMER:flag=!flag;InvalidateRect(hWnd,NULL,TRUE);return0;caseWM_PAINT:hDC=BeginPaint(hWnd,&ps);GetClientRect(hWnd,&Rect1);//获得用户区的尺寸x=(Rect1.left+Rect1.right)/2;y=(Rect1.top+Rect1.bottom)/2;计算屏幕中心的坐标,即图形的中心z=min(x,y)-100;if(flag==TRUE){Rectangle(hDC,x-z,y-z,x+z,y+z);hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,255));SelectObject(hDC,hBrush);Ellipse(hDC,x-z,y-z,x+z,y+z);Sleep(1000);InvalidateRect(hWnd,NULL,1);//刷新用户区.DeleteObject(hBrush);}else{Ellipse(hDC,x-z,y-z,x+z,y+z);hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,255));SelectObject(hDC,hBrush);Rectangle(hDC,x-(sqrt(2))/2*z,y-(sqrt(2))/2*z,x+(sqrt(2))/2*z,y+(sqrt(2))/2*z);InvalidateRect(hWnd,NULL,1);Sleep(1000);DeleteObject(hBrush);//刷新用户区.}flag=!flag;EndPaint(hWnd,&ps);break;二、实验二1、题目:请编写程序,要求如下:(1)、定义一只红色的画笔,绘制一个等边五边形。(2)、用不同颜色的线条连接互不相邻的两个点(3)、用不同颜色的画刷填充用上述方法所形成的图形中的每一个区域2、关键代码分析HDChDC;//定义设备环境句柄.HBRUSHhBrush;//定义画刷句柄HPENhPen;//定义画笔句柄PAINTSTRUCTPtStr;//定义包含绘图信息的结构体变量doubledfRadious0=100.0,dfRadious1;//定义外部和内部正五边形外接圆半径.POINTlpOuterPoints[5],lpInnerPoints[5];//定义外,内正五边形点结构数组.POINTlpTriangle[3];//定义三角形点结构数组.dfRadious1=dfRadious0*sin(0.1*Pi)/sin(126.0/180*Pi);//根据外圆半径计算内园半径.//计算内外正五边形的点坐标.for(inti=0;i5;i++){lpOuterPoints[i].x=(long)(dfRadious0*cos(i*72.0/180*Pi));lpOuterPoints[i].y=(long)(dfRadious0*sin(i*72.0/180*Pi));lpInnerPoints[i].x=(long)(dfRadious1*cos(i*72.0/180*Pi+36.0/180*Pi));lpInnerPoints[i].y=(long)(dfRadious1*sin(i*72.0/180*Pi+36.0/180*Pi));}switch(iMessage){caseWM_PAINT://处理绘图消息.hDC=BeginPaint(hWnd,&PtStr);//得到设备环境句柄SetMapMode(hDC,MM_ANISOTROPIC);//设置映射模式.SetWindowOrgEx(hDC,-100,-100,NULL);//设置坐标原点.hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));//创新红色画笔.SelectObject(hDC,hPen);//将画笔选入.Polygon(hDC,lpOuterPoints,5);//画正五边形.//填充正五边形的不同区域.for(inti=0;i5;i++){lpTriangle[0]=lpOuterPoints[i%5];//生成图形中的三角形区域的坐标.lpTriangle[1]=lpInnerPoints[i%5];lpTriangle[2]=lpOuterPoints[(i+1)%5];//创新新画刷.hBrush=CreateSolidBrush(RGB(i*10,i*20,i*30));SelectObject(hDC,hBrush);//选入新画刷.Polygon(hDC,lpTriangle,3);//画三角形区域.lpTriangle[2]=lpInnerPoints[(i+4)%5];//生成图形中的三角形区域的坐标.hBrush=CreateSolidBrush(RGB(i*1000,i*20,i*10));//创新画刷.SelectObject(hDC,hBrush);//选入画刷.Polygon(hDC,lpTriangle,3);//画三角形区域.}hBrush=CreateSolidBrush(RGB(255,0,255));//创新白画刷.SelectObject(hDC,hBrush);//选入画刷.Polygon(hDC,lpInnerPoints,5);//画中心的五边形.//用不同种颜色的画笔来绘制五角星.MoveToEx(hDC,lpOuterPoints[0].x,lpOuterPoints[0].y,NULL);for(inti=1;i=5;i++){hPen=CreatePen(PS_SOLID,1,RGB(0,i*51,0));SelectObject(hDC,hPen);LineTo(hDC,lpOuterPoints[(i+2)%5].x,lpOuterPoints[(i+2)%5].y);}hPen=(HPEN)(GetStockObject(PS_NULL));DeleteObject(hPen);//删除画笔.DeleteObject(hBrush);//删除画刷.EndPaint(hWnd,&PtStr);//结束绘图.return0;caseWM_DESTROY://处理关闭窗口信息.PostQuitMessage(0);//向应用程序发送WM_QUIT消息.return0;default:return(DefWindowProc(hWnd,iMessage,wParam,lParam));}三、实验三1、题目:设计一个窗口,在窗口中有五行文字,字体分别为楷体、宋体、仿宋体、黑体、幼圆,字号由8到40线性增长,每行的文字相继出现后不消失,而且每一行文字的颜色有RGB(0,0,0)到RGB(255,255,255)线性增长。点击左键后在工作区中每行文字由40到8线性减小,颜色有RGB(255,255,255)到RGB(0,0,0)线性减小。2、关键代码分析inta=0;HDChDC;//定义设备环境句柄.HFONThF;//定义字体句柄.PAINTSTRUCTps;//定义包含绘图信息的结构体变量TEXTMETRICtm;//定义包含字体信息的结构体变量.staticcharlpsz_1[]=无边落木萧萧下,不尽长江滚滚来。;//定义输出的字符串.charchFont[20];//定义字体种类的字符串.intX=0,Y=0,i;staticintnCharlen=strlen(lpsz_1);//定义字符串长度变量.switch(iMessage){caseWM_PAINT://处理绘图消息.hDC=BeginPaint(hWnd,&ps);//获得设备环境指针.for(i=0;inCharlen;i+=2)//采用某种字体和颜色输出字符串.{SetTextColor(hDC,RGB((long)(255.0/nCharlen*i),//设置字体颜色.0,0));if(iFontSign%5==0)strcpy(chFont,楷体_GB2312);//设置包含字体信息的字符串.elseif(iFontSign%5==1)strcpy(chFont,宋体);//iFont%表示以5为周期循环改变字体.elseif(iFontSign%5==2)strcpy(chFont,仿宋体);elseif(iFontSign%5==3)strcpy(chFont,黑体);elsestrcpy(chFont,幼圆);hF=CreateFont(//定义字体句柄.(long)(8+32.0*i/nCharlen),//字体高度.0,//由系统根据高宽比选取字体最佳宽度值.0,//文本倾斜度为0,表示水平.0,//字体倾斜度为0.400,//字体粗度.400为正常.0,//非斜体字,0,//无下划线.0,//无删除线.GB2312_CHARSET,//表示所用的字符集为GB2312_CHARSETOUT_DEFAULT_PRECIS,//删除精度为缺省值.CLIP_DEFAULT_PRECIS,//裁剪精度为缺省值.DEFAULT_QUALITY,//输出质量为缺省值.DEFAULT_PITCH|FF_DONTCARE,//字间距和字体系列使用缺省值.chFont);//字体名称.SelectObject(hDC,hF);//选入字体.GetTextMetrics(hDC,&tm);//得到包含字体信息的结构体.X=X+tm.tmAveCharWidth*2;//设置输出字符的X坐标.Y=iFontSign%5*40+tm.tmExternalLeading;//设置输出字符的Y坐标.TextOut(hDC,X,Y,&lpsz_1[i],2);//输出第i个字符.产生滚动的效果.Sleep(200);//暂停0.4秒.DeleteObject(hF);//删除字体句柄.}iFontSign++;//字体标志增加InvalidateRect(hWnd,NULL,0);//刷新用户区.EndPaint(hWnd,&ps);//删除设备用户指针.return0;break;caseWM_LBUTTONDOWN:InvalidateRect(hWnd,NULL,1);//刷新用户区.iFontSign=0;for(;a5;a++){X=0;Y=0;hDC=BeginPaint(hWnd,&ps);//获得设备环境指针.for(i=0;inCharlen;i+=2)//采用某种字体和颜色输出字符串.{SetTextColor(hDC,RGB((long)(255-255.0/nCharlen*i),//设置字体颜色.0,0));if(iFontSign%5==0)strcpy(chFont,楷体_GB2312);//设置包含字体信息的字符串.elseif(iFontSign%5==1)strcpy(chFont,宋体);//iFont%表示以5为周期循环改变字体.elseif(iFontSign%5==2