------框架窗口程序和GDI图形程序设计
姓名:
专业:
学号:
2012.3.24
Windows编程实验一
----框架窗口程序和GDI图形程序设计
一.实验目的:
1.熟悉在Visual C++ 6.0 IDE中编辑、编译、调试和运行一个实际窗口式应用程序的步骤和方法;
2.理解并掌握VC++的API编程步骤与方法;
3.能进行简单的Windows绘图程序设计;提高实际动手能力。
二.实验要求:
1.利用VC++6.0 IDE编写Win32 Application的方法步骤有一个较为全面的了解,并能较好地理解利用API函数编写的WinApp框架的作用;
2.能在集成环境中较好的实现API可视化应用程序的编辑、编译、调试和运行的全过程;
3.实验前认真准备、仔细计划,查找相关资料,写出预做报告,促进理性思维能力;
4.实验中以理性实践的态度,积极思考,认真领悟实验过程出现的各种实验现象,注意总结积累经验,完成实验要求,达到实验目标,提高应对问题、解决问题的能力。
三、实验内容:
题目一:设计程序使 “圆心沿正弦曲线轨迹移动的实心圆”能够循环 往复地不断运动。
1.打开Visual C++ 6.0,选择“文件”“新建”“win32 Application”命令,输入工程名,弹出“创建程序”对话框,选择建立一个空文档,进入工作区“Source file”,点击右键添加文件。打开添加的文件进行编译。
2.在代码编辑窗口内添加如下代码:
#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 dfRange=100.0; //正弦曲线的角度变量.
long i=0,j=0;
long lCentreX=0,lCentreY=0,lRadious;
//定义圆心坐标和圆半径
POINT lpSin[100]; //定义正弦曲线的点坐标.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) //主函数
{
MSG Message; //定义消息变量.
HWND hWnd; //定义窗口句柄.
WNDCLASS WndClass; //定义窗口类.
WndClass.cbClsExtra=0; //无窗口类扩展.
WndClass.cbWndExtra=0; //无窗口实例扩展.
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口用箭头光标
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//用缺省图标
WndClass.hInstance=hInstance; //当前应用程序句柄.
WndClass.lpfnWndProc=WndProc; //窗口处理函数.
WndClass.lpszClassName="SIN"; //窗口类名称.
WndClass.lpszMenuName=NULL; //无窗口菜单.
WndClass.style=0; //窗口类型为缺省类型.
if(!RegisterClass(&WndClass)) //注册窗口.
{
MessageBeep(0);
return FALSE;
}
hWnd=CreateWindow("SIN", //窗口类名.
"ex4_3沿正弦曲线移动的实心圆",//标题名.
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);
//设置原点坐标为(-200,-200).
hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));//创新画笔.
SelectObject(hDC,hPen); //选入画笔.
Polyline(hDC,lpSin,100); //绘制正弦曲线.
if(i%100<=25) //第一个1/4周期.
{
hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
//创新红笔.
hBrush=CreateSolidBrush(RGB(255,0,0));
//创新红画刷.
}
else if(i%100<=50)//第二个1/4周期.
{
hPen=CreatePen(PS_DOT,1,RGB(0,255,0));
//创新绿笔.
hBrush=CreateSolidBrush(RGB(0,255,0));
//创新绿刷.
}
else if(i%100<=75)//第三个周期.
{
hPen=CreatePen(PS_DASH,1,RGB(0,0,255));
//创新蓝笔
hBrush=CreateSolidBrush(RGB(0,0,255));
//创新蓝刷.
}
else//第四个周期.
{
hPen=CreatePen(PS_DASHDOT,1,RGB(250,250,0));
//创新黄笔
hBrush=CreateSolidBrush(RGB(255,255,0));
//创新黄刷.
}
lRadious=(long)(dfRange*(0.2+i%25*0.4/25));
//计算半径.
SelectObject(hDC,hBrush); //选入画刷.
SelectObject(hDC,hPen); //选入画笔.
lCentreX=lpSin[i%100].x; //圆心x坐标.
lCentreY=lpSin[i%100].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<100) InvalidateRect(hWnd,NULL,1);
//刷新用户区,并发送消息WM_PAINT
return 0;
case WM_DESTROY: //关闭窗口.
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
3.选择单击工具栏上的按钮,进行调试,未出现错误则单击按钮运行程序,查看运行结果。
4.保存程序代码,进行分析。
题目二.设计程序在窗口中使用定时器,每隔1秒交替地用红、绿、蓝色画刷来填充整个窗口客户区。
1.打开Visual C++ 6.0,选择“文件”“新建”“win32 Application”命令,输入工程名,弹出“创建程序”对话框,选择建立一个空文档,进入工作区“Source file”,点击右键添加文件。打开添加的文件进行编译。
2.在代码编辑窗口内添加如下代码:
#include "windows.h"
#include "string.h" //加载相应的头文件
#include "stdlib.h"
#include "stdio.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口"; //窗口类名
char lpszTitle[]="定时刷新窗口"; //窗口标题
wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; //窗口类型
wndclass.lpfnWndProc=WndProc; //窗口处理函数为WndProc
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口最小化图标为默认图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色
wndclass.lpszMenuName=NULL; //窗口中无菜单
wndclass.lpszClassName=lpszClassName; //窗口类名
if(!RegisterClass(&wndclass)) //如果窗口注册失败发出警告声音
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(
lpszClassName, //窗口类名
lpszTitle, //窗口实例句柄的标题名
WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL, //窗口风格
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐标为默认值
CW_USEDEFAULT, //窗口的高和宽为默认值
NULL, //此窗口无父窗口
NULL, //此窗口无主菜单
hInstance, //创建此窗口的应用程序当前句柄
NULL //不使用该值
);
ShowWindow(hwnd,nCmdShow); //显示窗口
UpdateWindow(hwnd); //绘制用户区
while(GetMessage(&Msg,NULL,0,0)) //消息循环
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam; //程序终止时将信息返回系统
}
//窗口函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc; //定义指向设备上下文的句柄
HBRUSH hB1,hB2,hB3; //定义指定的画刷
PAINTSTRUCT ps; //定义指向绘图信息的结构体变量
switch(message) //处理消息
{
case WM_PAINT: //处理绘图消息
hdc=BeginPaint(hwnd,&ps); //取得环境设备句柄
SetMapMode(hdc,MM_TEXT); //设置映射模式
hB1=CreateSolidBrush(RGB(255,0,0)); //创建红色画刷
hB2=CreateSolidBrush(RGB(0,255,0)); //创建绿色画刷
hB3=CreateSolidBrush(RGB(0,0,255)); //创建蓝色画刷
SelectObject(hdc,hB1); //选择红色画刷
Rectangle(hdc,0,0,800,800); //填充整个用户区
Sleep(1000); //设置定时器,间隔1秒
SelectObject(hdc,hB2); //选择绿色画刷
Rectangle(hdc,0,0,800,800); //填充整个用户区
Sleep(1000); //设置定时器,间隔1秒
SelectObject(hdc,hB3); //选择蓝色画刷
Rectangle(hdc,0,0,800,800); //填充整个用户区
InvalidateRect(hwnd,NULL,1); //刷新窗口,重新绘图
EndPaint(hwnd,&ps); //释放设备环境句柄
DeleteObject(hB1);
DeleteObject(hB2); //删除画刷句柄
DeleteObject(hB3);
break;
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
3.选择单击工具栏上的按钮,进行调试,未出现错误则单击按钮运行程序,查看运行结果。
4.保存实验代码,分析程序。
四.实验总结:
1.Windows应用程序包括入口函数WinMain和窗口函数WndProc。
2.绘图工具使用的一般步骤: 1.获取Win系统库存画笔/刷或创建画笔/刷;2.将画笔/刷选入设备环境,使用函数:SelectObject(hdc,hP/hBr);3.删除画笔/刷,使用函数:DeleteObject(hP/hBr)。
3.Windows应用程序变化万千,但消息机制和窗口过程却是Windows应用程序的基石和骨架,贯穿于所有Windows应用程序之中。
.....
五.实验心得:
………………………….
Windows编程实验报告1GDI图形程序设计姓名专业学号框架窗口程序和20xx3241Windows编程实验报告1Windows…
院系计算机科学学院专业网络工程年级20xx级课程名称Windows编程学号10066070姓名王彦廷指导教师熊志勇20xx年1月6…
Windows程序设计实验报告实验室S306308学院计算机科学与技术专业计算机科学与技术目录实验一熟悉visualc的编程环境3…
Windows程序设计实验报告河南理工大学测绘学院Windows程序设计实验报告班级地信101姓名薛山学号311005030124…
Windows程序设计实践总结报告班级姓名学号任课教师一功能介绍1用户验证用户通过系统登陆窗体输入相应的账户和密码通过验证的用户可…
Windows体系及编程实验指导书实验一类Windows进程任务管理器实验实验名称进程管理实验实验类型设计性实验学时4适用对象软件…
附件3科技学院课程设计综合实验报告2020年度第学期名称Windows体系编程题目院系信息工程系班级软件09k2学号学生姓名闫雪峰…
Windows程序设计实验报告实验一绘图和绘钟实验二简易扫雷程序班级姓名学号班内序号时间20xx54实验一绘图和绘钟一实验要求利用…
中南民族大学计算机科学学院Windows系统编程课程设计报告题目人事管理系统人事档案管理设计专业自动化学生姓名段广帅班级学号1班0…
苏州市职业大学实习实训报告名称20xx年12月24日至20xx年12月28日共1周院系计算机工程系班级11网络技术1班姓名系主任教…