Windows实验报告(计算机科学与技术学院计112 1113022032 康照玲)一、实验一1、题目:在窗口上显示一个正方形切圆,单击左键或者停顿5秒后显示正方形外接圆,在此之间交替显示。
2、关键代码分析本次试验我是主要是实现定时5秒的转换,首先在创建窗口时设置定时器,在窗口函数中响应其信息,然后对设置的标志进行赋值,一次实现其定时功能。
关键代码如下:HDC hDC; //定义设备环境句柄.int x,y,z ; // 标志窗口处的坐标点PAINTSTRUCT ps; //定义绘图结构体变量.static BOOL flag=TRUE; //标志定时功能HBRUSH hBrush;// SetTimer(hWnd,1,2000,NULL);switch(iMessage){case WM_CREATE:return 0;case WM_TIMER:flag=!flag;InvalidateRect(hWnd,NULL,TRUE);return 0;case WM_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、关键代码分析HDC hDC; //定义设备环境句柄.HBRUSH hBrush; //定义画刷句柄HPEN hPen; //定义画笔句柄PAINTSTRUCT PtStr; //定义包含绘图信息的结构体变量double dfRadious0=100.0,dfRadious1; //定义外部和部正五边形外接圆半径.POINT lpOuterPoints[5],lpInnerPoints[5];//定义外,正五边形点结构数组.POINT lpTriangle[3]; //定义三角形点结构数组.dfRadious1=dfRadious0*sin(0.1*Pi)/sin(126.0/180*Pi);//根据外圆半径计算园半径.//计算外正五边形的点坐标.for(int i=0;i<5;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){case WM_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(int i=0;i<5;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(int i=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); //结束绘图.return 0;case WM_DESTROY: //处理关闭窗口信息.PostQuitMessage(0); //向应用程序发送WM_QUIT消息.return 0;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、关键代码分析int a=0;HDC hDC; //定义设备环境句柄.HFONT hF; //定义字体句柄.PAINTSTRUCT ps; //定义包含绘图信息的结构体变量TEXTMETRIC tm; //定义包含字体信息的结构体变量.static char lpsz_1[]="无边落木萧萧下,不尽长江滚滚来。
"; //定义输出的字符串.char chFont[20]; //定义字体种类的字符串.int X=0,Y=0,i;static int nCharlen=strlen(lpsz_1); //定义字符串长度变量.switch(iMessage){case WM_PAINT: //处理绘图消息.hDC=BeginPaint(hWnd,&ps); //获得设备环境指针.for(i=0;i<nCharlen;i+=2) //采用某种字体和颜色输出字符串.{SetTextColor(hDC,RGB((long)(255.0/nCharlen*i),//设置字体颜色.0,0));if(iFontSign%5==0) strcpy(chFont,"楷体_GB2312"); //设置包含字体信息的字符串.else if(iFontSign%5==1) strcpy(chFont,"宋体"); //iFont%表示以5为周期循环改变字体.else if(iFontSign%5==2) strcpy(chFont,"仿宋体");else if(iFontSign%5==3) strcpy(chFont,"黑体");else strcpy(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); //删除设备用户指针.return 0;break;case WM_LBUTTONDOWN:InvalidateRect(hWnd,NULL,1);//刷新用户区.iFontSign=0;for(;a<5;a++){X=0;Y=0;hDC=BeginPaint(hWnd,&ps);//获得设备环境指针.for(i=0;i<nCharlen;i+=2) //采用某种字体和颜色输出字符串.{SetTextColor(hDC,RGB((long)(255-255.0/nCharlen*i), //设置字体颜色.0,0));if(iFontSign%5==0) strcpy(chFont,"楷体_GB2312"); //设置包含字体信息的字符串.else if(iFontSign%5==1) strcpy(chFont,"宋体"); //iFont%表示以5为周期循环改变字体.else if(iFontSign%5==2) strcpy(chFont,"仿宋体");else if(iFontSign%5==3) strcpy(chFont,"黑体");else strcpy(chFont,"幼圆");hF=CreateFont( //定义字体句柄.(long)(40-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); //删除设备用户指针.}InvalidateRect(hWnd,NULL,1);//刷新用户区.return 0;break;case WM_DESTROY:PostQuitMessage(0);return 0;default:return(DefWindowProc(hWnd,iMessage,wParam,lParam));}四、实验四1、题目:设计一个鼠标程序,在按Ctrl键的同时单击鼠标左键,在窗口中拖动鼠标,可画出一个圆;在按Shift键的同时单击鼠标左键,在窗口中拖动鼠标,画出一个矩形;当按下Shift+Ctrl的同时拖动鼠标画出1个正方形中切圆。