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));
    
                         }
    
    }
    

      

    程序运行结果:

     

    三、实验结果

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

  • 相关阅读:
    wget(转)
    852. Peak Index in a Mountain Array
    617. Merge Two Binary Trees
    814. Binary Tree Pruning
    657. Judge Route Circle
    861. Score After Flipping Matrix
    832. Flipping an Image
    461. Hamming Distance
    654. Maximum Binary Tree
    804. Unique Morse Code Words
  • 原文地址:https://www.cnblogs.com/wangprince2017/p/9235987.html
Copyright © 2011-2022 走看看