先看一下我的消息处理代码,以及执行效果
//窗口过程函数的实现(消息处理函数) LRESULT CALLBACK MyWindowProc( HWND hwnd, // handle to window 窗口句柄 UINT uMsg, // message identifier 消息标识 WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_PAINT: { TCHAR str[] = _T("这是一个Windows的SDK程序!"); HDC hDc; PAINTSTRUCT Ps; hDc = BeginPaint(hwnd,&Ps); //获取设备环境句柄 SetTextColor(hDc,RGB(13,25,200)); //设置文本颜色 TextOut(hDc,0,0,str,18); //输出文字 EndPaint(hwnd,&Ps); //释放资源 SetTimer(hwnd,1,5000,NULL);//设定了一个编号为1的时钟,5s }; break; case WM_CLOSE: //点击"X"按钮时发送此消息,使消息循环停止 if(IDYES == MessageBox(hwnd,_T("是否要退出?"),_T("提示"),MB_YESNO)) { DestroyWindow(hwnd); //销毁窗口,发送WM_DESTROY消息,注意程序进程还没退出 }; break; case WM_DESTROY: { KillTimer(hwnd,1);//销毁时钟 PostQuitMessage(NULL); //进程结束,完全退出程序 } break; case WM_TIMER://时钟消息处理,间隔5s { TCHAR str[20]; memset(str,0,20); SYSTEMTIME SystemTime; //一个结构体 GetLocalTime(&SystemTime);//获取系统时间 wsprintf(str,_T("现在时间: %d:%d:%d"),SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond); //这个wsprintf()函数的记一下,使用 Unicode 字符集会遇到很多麻烦,终于找到这个函数 MessageBox(hwnd,str,_T("消息框"),MB_OK); }; break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); //处理未处理的消息 break; } return 0; }
设定了时间是每隔5s将发送一个WM_TIMER消息给系统,使用SetTimer()函数来创建一个定时器
UINT_PTR SetTimer(
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数 ,为NULL时表示使用系统默认回调函数
);
程序结束前要销毁定时器,函数KillTimer()
BOOL KillTimer(
);
系统时间的结构体SYSTEMTIME
SYSTEMTIME结构体中包括:
WORD wYear; //年
WORD wMonth; //月
WORD wDayOfWeek; // 星期
WORD wDay; //日
WORD wHour; //时
WORD wMinute; //分
WORD wSecond; // 秒
WORD wMilliseconds; //微秒
因为我使用 Unicode 字符集,造成了好多麻烦,出现好多错误
下面的情况也许你会遇到,也就是char str[]与LPCWSTR类型的转换问题,如果直接使用(LPCWSTR)str强制转换会出问题
先看一下情况
最后使用到的方法是用到了wsprintf()函数,以前我还真的没见过这个函数,是我为了解决上面问题网上搜索找到的
TCHAR类型也就是wchar_t类型,使用了wsprintf()这个函数后我的程序才能正确运行
有时候会在MFC编程中遇到CString转为LPCWSTR的问题,
可以直接使用强制转换(LPCWSTR)(LPCSTR)
看一下网上的介绍