第四章 Windows的图形设备接口及Windows绘图 P83 4-6
Posted wangprince2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章 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));
}
}
程序运行结果:
三、实验结果
通过本次试验我了解了基于图形应用的程序设计,掌握刷新技术及其应用;学会了映射模式的应用;并且基本了解了绘图工具的使用;进一步加深了对可视化的了解。
以上是关于第四章 Windows的图形设备接口及Windows绘图 P83 4-6的主要内容,如果未能解决你的问题,请参考以下文章