Windows编程实验报告

      

windows编程实验报告             

                                   

                                   

                                      

                                      ------框架窗口程序和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应用程序之中。

.....

五.实验心得:

          ………………………….

相关推荐