前面写了两个小程序,没有说明原理(逻辑关系):这里一并说明。
1.首先我们得理解消息机制,也就是应用程序在和操作系统交互的时候(为什么是操作系统而不是用户,其实是一个意思,因为用户的数据需要先经过操作系统),应用程序所处的状态,一共有五种,1.阻塞,2.不阻塞,3.select即阻塞于select是介于1和2之间的实现,4.信号或者说消息,5.类信号机制。消息机制原理和中断系统原理一样,系统不需要轮询应用程序,用户需要注册回调函数(类似于中断处理函数),然后应用程序该干嘛就干嘛。当应用程序声明的事件(中断产生)产生,操作系统会自动调用回调函数。
2.句柄,windows系统中用来唯一标识一个对象,或者一个程序的多个实例的整型数值。就像linux里面用PID标识一样。用于对对象的操作。
时钟实现,是用户设置定时器事件和定时器回调函数,回调函数里处理系统时间即可。
代码如下:
View Code
1 #include "stdafx.h" 2 #include <windows.h> 3 #include <windowsx.h> 4 #include "resource.h" 5 #include "MainDlg.h" 6 7 8 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 9 { 10 switch(uMsg) 11 { 12 HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); 13 HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); 14 HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); 15 } 16 17 18 return FALSE; 19 } 20 21 VOID CALLBACK mytimerproc ( 22 HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) 23 { 24 SYSTEMTIME stlocal; 25 GetLocalTime(&stlocal);//取系统时间 26 TCHAR strtime[256]; 27 wsprintf(strtime,"%i年%i月%i日 %i:%i:%i",stlocal.wYear,stlocal.wMonth,stlocal.wDay,stlocal.wHour,stlocal.wMinute,stlocal.wSecond); 28 SetDlgItemText(hwnd,IDC_EDIT1,strtime); 29 //SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2);//close monitor 30 //SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, -1);//open monitor 31 32 33 34 35 36 } 37 38 39 40 BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) 41 { 42 SetTimer(hwnd,0,1000,mytimerproc); 43 return TRUE; 44 } 45 46 void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 47 { 48 switch(id) 49 { 50 case IDC_OK: 51 { 52 53 } 54 break; 55 default: 56 break; 57 } 58 } 59 60 void Main_OnClose(HWND hwnd) 61 { 62 EndDialog(hwnd, 0); 63 }
运行结果: