中国石油大学(华东)VC++实验5_vc大作业中国石油大学
中国石油大学(华东)VC++实验5由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“vc大作业中国石油大学”。
实验五 定时器编程实验
一、实验目的(1)熟悉Visual C++ 6.0 开发环境;
(2)掌握API 编程模式中定时器的使用方法
(3)熟练掌握在Visual C++ 6.0 开发环境调试程序的方法。
二、实验内容
设计一个窗口,在窗口中间位置绘制一个红色粗实线的圆角矩形,并用交替使用三种不同样式的画刷填充矩形的内部,每次刷新的时间间隔为1.0 秒。
三、实验报告
(1)列出定时器操作相关的程序清单;
#include//包含应用程序中所需的数据类型和数据结构的定义 #include int nMode;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明 //---------------以下初始化窗口类----------------------int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow){ HWND hwnd;MSG Msg;WNDCLASS wndcla;// LPCWSTR lpszClaName =_T(“窗口”);//窗口类名 // LPCWSTR lpszTitle=L“My_Windows”;//窗口标题名
char lpszClaName[] = “窗口”;//窗口类名
char lpszTitle[]= “My_Windows”;//窗口标题名
//窗口类的定义
wndcla.style=0;//窗口类型为缺省类型
wndcla.lpfnWndProc=WndProc;//定义窗口处理函数
wndcla.cbClsExtra=0;//窗口类无扩展
wndcla.cbWndExtra=0;//窗口实例无扩展
wndcla.hInstance=hInstance;//当前实例句柄
wndcla.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标
wndcla.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口采用箭头光标
wndcla.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景为白色
wndcla.lpszMenuName=NULL;//窗口中无菜单
//wndcla.lpszClaName=(LPCWSTR)lpszClaName;wndcla.lpszClaName=lpszClaName;//窗口类名为“窗口” //---------------以下进行窗口类的注册-------if(!RegisterCla(&wndcla))//如果注册失败则发出警告 { MeageBeep(0);return FALSE;} //----------------创建窗口-------------------hwnd=CreateWindow
(// _T(“Title”),lpszClaName, //窗口类名
lpszTitle, //窗口实例的标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT,CW_USEDEFAULT, //窗口左上角坐标为缺省值
CW_USEDEFAULT,CW_USEDEFAULT, //窗口的高和宽为缺省值
NULL,//此窗口无附窗口
NULL,//此窗口无主菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL
//不使用该值);
//---------------显示窗口----------------------ShowWindow(hwnd, nCmdShow);//--------------绘制用户区---------------------UpdateWindow(hwnd);//---------------消息循环----------------------while(GetMeage(&Msg, NULL, 0, 0)){
TranslateMeage(&Msg);
DispatchMeage(&Msg);} return Msg.wParam;//消息循环结束即程序终止时将信息返回系统 }
LRESULT CALLBACK WndProc(HWND hWnd, UINT meage, WPARAM wParam, LPARAM lParam){ HDC hdc;HBRUSH hb;HPEN hp;PAINTSTRUCT ps;static int state=0;static int TIMERID=1;switch(meage){ case WM_CREATE: SetTimer(hWnd, TIMERID, 1000, NULL);
break;case WM_TIMER: if(wParam==TIMERID){ state=state%3;InvalidateRect(hWnd, NULL, TRUE);} break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SetMapMode(hdc,MM_TEXT);
hp=(HPEN)GetStockObject(BLACK_PEN);SelectObject(hdc,hp);
if(state==0){ hb=CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc,hb);
RoundRect(hdc,400,120,700,420,15,15);
DeleteObject(hb);}//定义红色画刷填充 if(state==1){
hb=CreateSolidBrush(RGB(0,255,0));
SelectObject(hdc,hb);
RoundRect(hdc,400,120,700,420,15,15);
DeleteObject(hb);
}//定义绿色画刷填充
if(state==2)
{
hb=CreateSolidBrush(RGB(255,255,0));
SelectObject(hdc,hb);
RoundRect(hdc,400,120,700,420,15,15);
DeleteObject(hb);
}//定义黄色画刷填充 state++;EndPaint(hWnd,&ps);break;
case WM_DESTROY:
PostQuitMeage(0);
break;
default:
return DefWindowProc(hWnd, meage, wParam, lParam);} return 0;} 实验结果如下:
间隔0.1秒。
(2)总结定时器消息编程的步骤,以及程序设计过程中需要注意的问题; 定时器消息编程的步骤: 1.定时器消息
定时器时间到时,向窗口发送WM_TIMER 消息,应用程序窗口通过处理该消息来对定时器事件进行处理,该消息的参数说明如下:
WM_TIMER wTimerID = wParam;// 定时器标识符
tmprc =(TIMERPROC *)lParam;// 定时器回调函数的地址
其中定时器回调函数在使用 SetTimer 启动定时器时指定,如果没有指定定时器回调函数则可直接处理WM_TIMER 消息。2.启动定时器
使用 SetTimer 函数创建一个定时器,并制定超时时间,然后启动定时器。该函数说明如下:
UINT SetTimer(HWND hWnd, // 创建定时器的窗口句柄 UINT nIDEvent, // 定时器标识符
UINT uElapse, // 定时时间,单位是16毫秒 TIMERPROC lpTimerFunc // 定时器回调函数地址);3.销毁定时器
定时器在不使用时要使用KillTimer 函数进行销毁,该函数说明如下: BOOL KillTimer(HWND hWnd, // 创建定时器的窗口句柄 UINT uIDEvent // 定时器标识符);程序设计过程中需要注意的问题:
定时器的使用时,要严格按照定时器消息的编写,启动定时器,销毁定时器这三个步骤来做,缺少其中任何一个步骤,都没有可能实现给定的功能。
特别是最后一个步骤,很容易忘记。我就忘记了,费了好大劲,才知道哪里错了。(3)总结实验的心得体会,实验中遇到的困难以及解决的方法等。
通过这次试验,我熟悉了Visual C++ 6.0的 开发环境;了解了API 编程模式中定时器的使用方法,掌握了在Visual C++ 6.0 开发环境调试程序的方法。
在VC课上,老师留了作业,让我们自愿课下编写一个关于定时器的程序,并做个PPT给同学们讲讲,我不会,菅学辉同学上去讲的,讲得很好,很羡慕他,自己也想编一个,可自己不会,很遗憾。这次试验后,我会了,知道了如何编写一个定时器的程序,自己真的很高兴。定时器消息的编写,启动定时器,销毁定时器这三个步骤,一定要一步一步的来做,不能把最后一个步骤给忘了。