打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆,且每隔四分之一周期,圆的填充色和圆的周边颜色都发生变化,同时圆的半径在四分之一周期之内由正弦曲线幅值的0.2倍至0.6倍线性增长。

南京信息工程大学  实验(实习)报告

实验(实习)名称 图形程序设计及其应用  实验(实习)日期

一、实验目的

1.熟悉图形设备接口的概念及其应用。

  

二、实验内容及步骤

 实验任务

1.熟悉基于图形应用的程序设计;

2.掌握刷新技术及其应用;

3.掌握映射模式的应用;

4.掌握绘图工具的使用。

 实验内容

   编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆,且每隔四分之一周期,圆的填充色和圆的周边颜色都发生变化,同时圆的半径在四分之一周期之内由正弦曲线幅值的0.2倍至0.6倍线性增长。

程序代码:

#include<windows.h>

#include<stdlib.h>

#include<string.h>

#include<math.h>

#define Pi 3.1415926

 

long WINAPI WndProc(HWND hWnd,UINT iMessage,UINTwParam,LONG lParam);

double dfTheta=0,dfRange=100.0;

long i=0,j=0;

long lCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange);

POINT lpSin[100];

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCEhPrevInst,LPSTR lpszCmdLine,int nCmdShow)

{

HWND hwnd ;

MSG Message ;

WNDCLASS wndclass ;

wndclass.cbClsExtra=0;                  //窗口类无扩展

wndclass.cbWndExtra=0;               //窗口实例无扩展

wndclass.hInstance=hInstance;       //当前实例句柄

   wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ;      //窗口采用箭头光标

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);  //窗口背景为白色

wndclass.lpszMenuName=NULL; //窗口中无菜单

wndclass.lpszClassName="SIN" ;  //窗口类名为"窗口"

    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);     //窗口的最小化图标为缺省图标

    wndclass.lpfnWndProc=WndProc;   //定义窗口处理函数

    wndclass.style=0;

    if(!RegisterClass(&wndclass))       //如果注册失败则发出警告

{ MessageBeep(0) ;     

return FALSE ;

}

//---------------- 创建窗口 -------------------

hwnd=CreateWindow(

           "SIN",        //窗口类名

           "4_6",                  //窗口实例的标题名

           WS_OVERLAPPEDWINDOW,   //窗口的风格

           CW_USEDEFAULT,

           0,      //窗口左上角坐标为缺省值

           CW_USEDEFAULT,

           0,      //窗口的高和宽为缺省值

           NULL,                          //此窗口无父窗口

           NULL,                          //此窗口无主菜单

           hInstance,             //创建此窗口的应用程序的当前句柄

         NULL                          //不使用该值

           );

//--------------- 显示窗口----------------------

ShowWindow( hwnd, nCmdShow) ;

//-------------- 绘制用户区---------------------

UpdateWindow(hwnd);

//--------------- 消息循环----------------------

for(int j=0;j<100;j++)    //生成正弦曲线的点坐标

 {

lpSin[j].x=(long)(j*2*Pi/100*60);

lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));

 }

 

while( GetMessage(&Message, 0, 0, 0))

{

           TranslateMessage(&Message) ;

           DispatchMessage(&Message) ;

}

return Message.wParam;       //消息循环结束即程序终止时将信息返回系统

}

long WINAPI WndProc(HWND hWnd,UINT iMessage,UINTwParam,LONG lParam)

{

    HDC hDC;                   //定义指向设备的句柄

HBRUSH hBrush;     //定义指向画刷的句柄

HPEN hPen;                 //定义指向画笔的句柄

PAINTSTRUCT PtStr;//定义指向包含绘图信息的结构体变量

switch(iMessage)                                             //处理消息

{

case WM_PAINT:                                         //处理绘图消息

           hDC=BeginPaint(hWnd,&PtStr);

           SetWindowOrgEx(hDC,-200,-200,NULL);      //设置映像模式

           hPen=CreatePen(PS_DASH,1,RGB(255,0,0));         //黑色画笔

           SelectObject(hDC,hPen);      //选择画笔

           Polyline(hDC,lpSin,100);

    if(i<=25)                       //第一个1/4周期

{

  hPen=CreatePen(PS_DASH,1,RGB(255,0,0));

            

 hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));

 lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//计算半径

}

           elseif(i<=50)

{

  hPen=CreatePen(PS_DASH,1,RGB(0,255,0));

            

 hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,0));

  lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//计算半径

}

else if(i<=75)

{

  hPen=CreatePen(PS_DASH,1,RGB(0,0,255));

            

 hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,255));

 lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//计算半径

}

else

{

  hPen=CreatePen(PS_DASH,1,RGB(255,255,0));

            

 hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,255,0));

 lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//计算半径

}

SelectObject(hDC,hBrush);     //选择画刷

SelectObject(hDC,hPen);     

       lCentreX=lpSin[i].x;                  //圆心x坐标

           lCentreY=lpSin[i].y;              //圆心y坐标

           Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious,

                  lCentreX+lRadious,lCentreY+lRadious);  //画圆

 

           i++;

           DeleteObject(hPen);               //删除画笔

           DeleteObject(hBrush);  //删除画刷

           EndPaint(hWnd,&PtStr);       //删除设备环境指针

    Sleep(100);                    //0.1

           if(i<100)InvalidateRect(hWnd,NULL,1);         //刷新用户区

           return0;

case WM_DESTROY:          //关闭窗口

           PostQuitMessage(0);            

           return0;

default:

        return(DefWindowProc(hWnd,iMessage,wParam,lParam));

                     }

}

程序运行结果:

 

 

三、实验结果

   通过本次试验我了解了基于图形应用的程序设计,掌握刷新技术及其应用;学会了映射模式的应用;并且基本了解了绘图工具的使用;进一步加深了对可视化的了解。

 

 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言编程案例(二)
Windows 的多线程程序设计初步zz
調色盤管理器
Bezier曲线原理及实现代码(c++)
Windows GDI绘图基础与轻量进阶
谈GDI绘图中的资源释放
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服