中南大学吧 关注:529,801贴子:19,179,331
  • 39回复贴,共1

[求助]SetTimer函数看不懂,有人教么?

只看楼主收藏回复

一楼旺哥


1楼2012-11-06 19:27回复
    没学过,定时器?


    IP属地:广东2楼2012-11-06 19:28
    收起回复
      被抽了?求不沉


      3楼2012-11-06 19:34
      回复
        懂C语言的大神呢?


        4楼2012-11-06 19:38
        回复
          怎么你是大一的么,怎么水成这样的?


          5楼2012-11-06 19:40
          收起回复
            自己写代码测试 或者把书上的例子敲出来运行看看就知道了


            IP属地:上海6楼2012-11-06 19:59
            收起回复
              @张友旺 @CHRFLYsky 


              7楼2012-11-06 21:22
              收起回复
                我是谁并不重要 只是道上的人都称我一声锁爷


                IP属地:中国香港9楼2012-11-06 22:18
                收起回复
                  这个已经不属于c语言标准库的函数了。。。这个函数是win32的api函数,也就是说只能在windows下面才能使用这个函数。。。几乎每个windows应用程序底层都会调用到这个函数的。。。这个是一个底层硬件定时器(就是数电中的定时器)的扩展,如果楼主对win32和消息循环不了解的话我觉得还是难理解的。。。如果只是为了学习c语言可以忽略这个函数。。。
                  楼主如果想具体研究这个函数请参见charles petzold大神的windows程序设计第五版第八章定时器,我手头的是第五版珍藏版实体书在263页,网上应该有电子书,自行查看吧。。。


                  IP属地:广东11楼2012-11-06 22:30
                  收起回复
                    //vs中需要包含此头文件#include "stdafx.h"#include <windows.h>//定义计时器编号#define ID_TIMER 1//声明窗口过程函数LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//win32程序入口主函数,相当于c语言的main函数,win32程序从此函数开始执行int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ /*定义程序名字字符串,注意编写win32程序的时候,为了保持8位字符和16位字符的兼容性, *不要直接使用szAppName[] = "Beeper1";定义,所有字符串常量要使用Text("字符串常量")定义 *主要是为了兼顾ascii和unicode字符串的兼容性,windows内部通过宏定义实现字符类型转换 */ static TCHAR szAppName[] = TEXT ("Beeper1") ; //句柄,如果不知道句柄是什么。。。。那我觉得不用往下看了。。 HWND hwnd ; MSG msg ; WNDCLASS wndclass ; //设置窗口参数 wndclass.style = CS_HREDRAW | CS_VREDRAW ; //此处设置窗口过程函数,即下面定义的WndProc用来处理窗口消息循环 wndclass.lpfnWndProc = 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 = szAppName ;
                    //注册窗口 if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } //创建窗口,此函数执行完后窗口已经在内存中创建,但是并未显示出来 hwnd = CreateWindow (szAppName, TEXT ("Beeper1 Timer Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; //显示窗口 ShowWindow (hwnd, iCmdShow) ; //重绘窗口,向WndProc发送 WM_PAINT消息来实现窗口重绘,此时窗口已经显示出来 UpdateWindow (hwnd) ;
                    


                    IP属地:广东12楼2012-11-07 10:40
                    回复
                      //消息循环,win32编程基础概念,如果不懂,自行百度 //GetMessage (&msg, NULL, 0, 0)函数从消息队列中对消息进行检索 while (GetMessage (&msg, NULL, 0, 0)) { //将msg结构返还给windows以进行某些键盘消息的装换,参见第六章 TranslateMessage (&msg) ; //将msg结构返还给windows,windows会将这条消息发送给合适的窗口过程(WndProc)来处理, //也就是说,windows调用了窗口过程 DispatchMessage (&msg) ; } return msg.wParam ;
                      }//窗口过程函数,进行窗口消息处理LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam){ static BOOL fFlipFlop = FALSE ; HBRUSH hBrush ; HDC hdc ; PAINTSTRUCT ps ; RECT rc ;
                      switch (message) { //窗口创建消息 case WM_CREATE: //设置定时器,定时时间到时引出WM_TIMER消息 SetTimer (hwnd, ID_TIMER, 1000, NULL) ; return 0 ; //响应定时器消息 case WM_TIMER : MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; //调用InvalidateRect函数,产生WM_PAINT消息,即下一个case clause进行窗口重绘,实现窗口闪烁 InvalidateRect (hwnd, NULL, FALSE) ; return 0 ; //窗口重绘消息,移动客户群,改变客户区大小时 发出此消息 case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rc) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; EndPaint (hwnd, &ps) ; DeleteObject (hBrush) ; return 0 ; //窗口销毁消息 case WM_DESTROY : //程序退出前,kill掉timer KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } //其他消息由windows处理 return DefWindowProc (hwnd, message, wParam, lParam) ;
                      }


                      IP属地:广东13楼2012-11-07 10:40
                      收起回复


                        


                        IP属地:广东14楼2012-11-07 10:47
                        收起回复