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

一、实验目的

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

}

}

程序运行结果:

三、实验结果

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

第四章 Windows的图形设备接口及Windows绘图 P83 4-6的更多相关文章

  1. Windows的图形设备接口与Windows绘图

    本次学习目标 理解DC, 映像模式, 坐标系统, 窗口和视口; 学习获取绘图工具(画笔/画刷)的句柄, 设置颜色, 能定义映像模式; 会使用常用的绘图函数. 编写程序: 在屏幕上出现一个圆心沿正弦曲线 ...

  2. [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】

    第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...

  3. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  4. Windows程序设计(第五版)学习:第四章 文本输出

    第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域.   2,大多数 ...

  5. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第六十四章:接口与静态方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. Windows PE 第四章 导入表

    第四章 导入表 导入表是PE数据组织中的一个很重要的组成部分,它是为实现代码重用而设置的.通过分析导入表数据,可以获得诸如OE文件的指令中调用了多少外来函数,以及这些外来函数都存在于哪些动态链接库里等 ...

  9. Java程序设计(2021春)——第四章接口与多态笔记与思考

    Java程序设计(2021春)--第四章接口与多态笔记与思考 本章概览: 4.1 接口(接口的概念和声明接口.实现接口的语法) 4.2 类型转换 4.3 多态的概念 4.4 多态的应用 4.5 构造方 ...

随机推荐

  1. flask第二十一篇——练习题

    自定义url转化器 实现一个自定义的URL转换器,这个转换器需要满足的是获取从多少到多少的url,例如,你输入的地址是http://127.0.0.1:8000/1-5/,那么页面返回[1,2,3,4 ...

  2. WPF 程序 处理未捕获异常,和程序莫名终止说拜拜

    http://www.cnblogs.com/liuyueyu/p/4476151.html 百密一疏的Bug很难避免,没有谁能保证,我的程序永远 0 BUG; 突然接手一个很庞大的项目,在项目运行期 ...

  3. 纯php实现中秋博饼游戏(2):掷骰子并输出结果

    这篇是纯php实现中秋博饼游戏系列博文(2) 上文是:纯php实现中秋博饼游戏(1):绘制骰子图案 http://www.cnblogs.com/zqifa/p/php-dice-1.html要纯ph ...

  4. 手写简易WEB服务器

    今天我们来写一个类似于Tomcat的简易服务器.可供大家深入理解一下tomcat的工作原理,本文仅供新手参考,请各位大神指正!首先我们要准备的知识是: Socket编程 HTML HTTP协议 服务器 ...

  5. [转]无网络环境,在Windows Server 2008 R2和SQL Server 2008R2环境安装SharePoint2013 RT

    无网络环境,在Windows Server 2008 R2和SQL Server 2008R2环境安装SharePoint2013 RT,这个还有点麻烦,所以记录一下,下次遇到省得绕弯路.进入正题: ...

  6. WCF揭秘学习笔记(3):使用DataContractSerializer

    使用DataContractSerializer 终结点(包括地址.绑定.契约)可通过代码以编程方式添加到服务中.如: using(ServiceHost host =new ServiceHost( ...

  7. SQL2008如何清空压缩数据库日志

    SQL2008如何清空压缩数据库日志 编写人:左丘文 2015-4-10 近期在给一系统初始化资料时,不断的导入导出,因此一不小心,就将数据的SQL(sql2008R2)的是日志档弄得比数据库还大,给 ...

  8. VC++常规错误之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005

    VC++常规错误之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005 (1)错误案例:在写日志程序中出现,工程是MFC程序(注:win32控制台应用程序,不 ...

  9. Bootstrap-CL:面板

    ylbtech-Bootstrap-CL:面板 1.返回顶部 1. Bootstrap 面板(Panels) 本章将讲解 Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一 ...

  10. 揭秘 Python 中的 enumerate() 函数

    原文:https://mp.weixin.qq.com/s/Jm7YiCA20RDSTrF4dHeykQ 如何以去写以及为什么你应该使用Python中的内置枚举函数来编写更干净更加Pythonic的循 ...