admin 管理员组文章数量: 887032
计时器
1 UINT SetTimer(
HWND hWnd, //窗口句柄
UINT nIDEvent, //计时器ID
UINT uElapse, //时间间隔
TIMERPROC lpTimerFunc );//回调函数
第一个参数:窗口句柄,他表示了调用定时器的窗口,若该参数为空,则第二个参数将被忽略。
第二个参数:计时器的ID,通过此参数可以标识多个定时器,为非零值。
第三个参数:时间间隔。以毫秒为单位。
第四个参数:回调函数。操作系统将在每个我们定义的间隔过去后调用该函数。若该参数为NULL,操作系统将发送WM_TIMER消息到应用程序的消息队列中。
回调函数有一定的格式:
void CALLBACK TimerProc(
HWND hwnd, //窗口句柄
UINT uMsg, //消息
UINT idEvent, //定时器ID
DWORD dwTime );//操作系统自开机经过的毫秒数。
计时器的用法:
①:
SetTimer(hwnd,1,uiMsecInerval,NULL);
给据上面我门对计时器参数的解释可知:当最后一个参数为NULL的时候,操作系统将发送WM_TIMER消息到应用程序。我们来看一个程序来理解这个用法:
Code:- #include <windows.h>
- #include <mmsystem.h>
- LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
- int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
- PSTR szCmdLine, int iCmdShow)
- {
- static TCHAR szAppName[] = TEXT ("HelloWin") ;
- HWND hwnd ;
- MSG msg ;
- WNDCLASS wndclass ;
- wndclass.style = CS_HREDRAW | CS_VREDRAW ;
- 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 ("This program requires Windows NT!"),
- szAppName, MB_ICONERROR) ;
- return 0 ;
- }
- hwnd = CreateWindow( szAppName, // window class name
- TEXT ("The Hello Program"), // window caption
- WS_OVERLAPPEDWINDOW, // window style
- CW_USEDEFAULT,// initial x position
- CW_USEDEFAULT,// initial y position
- CW_USEDEFAULT,// initial x size
- CW_USEDEFAULT,// initial y size
- NULL, // parent window handle
- NULL, // window menu handle
- hInstance, // program instance handle
- NULL) ; // creation parameters
- ShowWindow (hwnd, iCmdShow) ;
- 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 ;
- static bool flag = false;
- HBRUSH brush;
- PAINTSTRUCT ps ;
- RECT rect ;
- switch (message)
- {
- case WM_CREATE:
- SetTimer(hwnd,1,1000,NULL);
- return 0 ;
- case WM_PAINT:
- hdc = BeginPaint (hwnd, &ps) ;
- GetClientRect(hwnd,&rect);
- FillRect(hdc,&rect,CreateSolidBrush(RGB(255,0,0)));
- EndPaint (hwnd, &ps) ;
- DeleteObject(brush);
- return 0 ;
- case WM_TIMER:
- flag = !flag;
- hdc = GetDC(hwnd);
- GetClientRect(hwnd,&rect);
- brush = CreateSolidBrush(flag?RGB(0,0,255):RGB(255,0,0));
- FillRect(hdc,&rect,brush);
- ReleaseDC(hwnd,hdc);
- DeleteObject(brush);
- return 0;
- case WM_DESTROY:
- KillTimer(hwnd,1);
- PostQuitMessage (0) ;
- return 0 ;
- }
- return DefWindowProc (hwnd, message, wParam, lParam) ;
- }
本程序的用途是设计一个定时器,让窗口根据定时器来改变窗口的背景颜色.
这里的知识点有:
① 我们都知道我们要想做些初始化的工作可以在WM_CREATE消息里进行。故我们可以在这里设定我们的定时器。即在窗口创建时我们就为他设定好定时器。但是这里千万别忘了在WM_DESTROY消息中关闭定时器。即:在我们窗口关闭前关闭我们所设定的定时器.
② 得到窗口的客户区
我们用BOOL GetClientRect( HWND hWnd, LPRECT lpRect ); 函数来得到窗口的客户区。
③ 创建画刷
我们使用HBRUSH CreateSolidBrush( COLORREF crColor); 函数来创建画刷。该函数返回一个画刷句柄。画刷使用完毕要记得用DeleteObject删除创建的画刷。
④ 用画刷填充制定区域
我们使用了int FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr);来填充。
⑤ 这里涉及到了两种获得hdc的方法
一种为利用 HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lpPaint);来返回。
一种是利用HDC GetDC( HWND hWnd);返回。这两种都可以获得HDC,不过前一种只能在WM_PAINT消息中使用。这里需要注意的是,当我们利用BeginPaint得到HDC别忘了调用BOOL EndPaint( HWND hWnd, CONST PAINTSTRUCT *lpPaint ); 来结束绘图。利用GetDC得到HDC后不要忘了用ReleseDC来释放HDC.
SetTime(hwnd,1,1000,NULL);这个用法的意思是每隔一定的时间操作系统就发送WM_PAINT消息给窗口。然后来执行相应的操作。对于本题来看另外一种方法:
Code:- #include <windows.h>
- #include <mmsystem.h>
- LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
- int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
- PSTR szCmdLine, int iCmdShow)
- {
- static TCHAR szAppName[] = TEXT ("HelloWin") ;
- HWND hwnd ;
- MSG msg ;
- WNDCLASS wndclass ;
- wndclass.style = CS_HREDRAW | CS_VREDRAW ;
- 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 ("This program requires Windows NT!"),
- szAppName, MB_ICONERROR) ;
- return 0 ;
- }
- hwnd = CreateWindow( szAppName, // window class name
- TEXT ("The Hello Program"), // window caption
- WS_OVERLAPPEDWINDOW, // window style
- CW_USEDEFAULT,// initial x position
- CW_USEDEFAULT,// initial y position
- CW_USEDEFAULT,// initial x size
- CW_USEDEFAULT,// initial y size
- NULL, // parent window handle
- NULL, // window menu handle
- hInstance, // program instance handle
- NULL) ; // creation parameters
- ShowWindow (hwnd, iCmdShow) ;
- 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 ;
- static bool flag = false;
- HBRUSH brush;
- PAINTSTRUCT ps ;
- RECT rect ;
- switch (message)
- {
- case WM_CREATE:
- SetTimer(hwnd,1,1000,NULL);
- return 0 ;
- case WM_PAINT:
- hdc = BeginPaint (hwnd, &ps) ;
- GetClientRect(hwnd,&rect);
- brush = CreateSolidBrush(flag?RGB(0,0,255):RGB(255,0,0));
- FillRect(hdc,&rect,brush);
- EndPaint (hwnd, &ps) ;
- DeleteObject(brush);
- return 0 ;
- case WM_TIMER:
- flag = !flag;
- InvalidateRect(hwnd,NULL,FALSE);
- return 0;
- case WM_DESTROY:
- KillTimer(hwnd,1);
- PostQuitMessage (0) ;
- return 0 ;
- }
- return DefWindowProc (hwnd, message, wParam, lParam) ;
- }
该方法里使用了函数
BOOL InvalidateRect( HWND hWnd , const RECT * lpRect , BOOL bErase );第一个参数为窗口句柄。但本参数为NULL时,操作系统将会使整个窗口无效并重划整个窗口,并在函数返回前发送WM_ERASEBKGND消息给窗口函数。
第二个参数为将要更新的坐标区域。若此参数为NULL,整个客户区将会被更新。即发送WM_PAINT消息。
第三个参数是一个bool类型。如果为true,背景将会在BeginPaint调用时被擦除。若为false将不会被擦除。
本文标签: 计时器
版权声明:本文标题:计时器 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687880904h152755.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论