先看一下我的消息处理代码,以及执行效果
//窗口过程函数的实现(消息处理函数)
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)
看一下网上的介绍