zoukankan      html  css  js  c++  java
  • 第四章 Windows的图形设备接口及Windows绘图 P83 4-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,UINT wParam,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,HINSTANCE hPrevInst,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,UINT wParam,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);//计算半径
    
    }
    
               else if(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);         //刷新用户区
    
               return 0;
    
    case WM_DESTROY:          //关闭窗口
    
               PostQuitMessage(0);            
    
               return 0;
    
    default:
    
             return(DefWindowProc(hWnd,iMessage,wParam,lParam));
    
                         }
    
    }
    

      

    程序运行结果:

     

    三、实验结果

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

  • 相关阅读:
    说说C#的数学类,Math,浮点数(上)
    Activity设置切换动画时黑屏问题的解决
    機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现
    Hadoop简单介绍
    Hdu 2018 母牛的故事
    object hook实现禁止创建文件
    django 查询如何使用 or
    Python 实现字符串转换成列表 实现str转换list
    django如何修改开发服务器的端口
    如何修改Linux系统的 /etc/ssh/sshd_config 文件 "/etc/ssh/sshd_config" E212: Can't open file for writin
  • 原文地址:https://www.cnblogs.com/wangprince2017/p/9235987.html
Copyright © 2011-2022 走看看