永发信息网

该代码是如何产生ON_WM_TIMER()消息的?

答案:1  悬赏:50  手机版
解决时间 2021-02-07 03:32
MFC一个应用程序
点击IDC_SETTIME按钮ON_BN_CLICKED(IDC_SETTIME, OnSettime)调用
void CTimeExitDlg::OnSettime() 函数,函数如下:
void CTimeExitDlg::OnSettime()
{
// TODO: Add your control notification handler code here
CHAR szText[MAX_PATH];
GetDlgItem(IDC_EDIT_T)->GetWindowText(szText, MAX_PATH);
g_nSDTime = atoi(szText);
if(g_nSDTime == 0)
{
MessageBox("请输入一个大于0的数值!", "出错啦", MB_OK|MB_ICONERROR);
//return 0;
}
else
{
g_bIsApply = TRUE;
}
}
该函数执行完后,会产生ON_WM_TIMER()消息调用OnTimer(UINT nIDEvent),函数如下:
void CTimeExitDlg::OnTimer(UINT nIDEvent)
{
CHAR szFormat[] = "现在时间:%d:%d:%d%d";
SYSTEMTIME st;
GetLocalTime(&st);
if(st.wSecond < 10)
wsprintf(g_szTime, szFormat, st.wHour, st.wMinute, st.wSecond/10, st.wSecond%10);
TextOut(g_hdc, 65, 60, g_szTime, lstrlen(g_szTime));
::InvalidateRect(g_hWnd, NULL, FALSE);
::UpdateWindow(g_hWnd);
if(g_bIsApply)
{
g_nCounter++;
if(g_nCounter == 60)
{
g_nCounter = 0;
g_nSDTime--;
}
CHAR szLeaveMinute[] = "距离关机还有 %d 分钟";
CHAR szLeaveSecond[] = "距离关机还有 %d 秒";
CHAR szBuffer[MAX_PATH];
if(g_nSDTime >1)
wsprintf(szBuffer, szLeaveMinute, g_nSDTime);
else if(g_nSDTime == 1 && g_nCounter < 60)
wsprintf(szBuffer, szLeaveSecond, 60-g_nCounter);
GetDlgItem(IDC_JLGJ)->SetWindowText(szBuffer);
if(g_nSDTime == 0)
{
GetDlgItem( IDC_JLGJ)->SetWindowText( "正在关机...");
OnShutdown();
}
}
else
{
GetDlgItem(IDC_JLGJ)->SetWindowText("尚未设置定时关机");
}
CDialog::OnTimer(nIDEvent);
}
我想问的是:void CTimeExitDlg::OnSettime() 函数是如何产生ON_WM_TIMER()消息的?
最佳答案
OnSettime() 并没有产生ON_WM_TIMER()消息。

MFC是对Windows SDK的OO封装。 它是通过在你的应用中建立所谓的消息映射Message Map来处理Windows系统的消息序列的。

首先是建立消息映射。 代码的头文件中应该有类似的片段:
class CTimeExitDlg : public CDialog
{
public:
...
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnSettime();
..
DECLARE_MESSAGE_MAP()
...
};
在相应的cpp中,应该有类似的东东:
BEGIN_MESSAGE_MAP(CTimeExitDlg, CDialog)

...

ON_WM_TIMER()
ON_BN_CLICKED(IDC_SETTIME, OnSettime)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
...
END_MESSAGE_MAP()

这样Dialog的消息映射就建立了。

其次是产生消息。 在int CTimeExitDlg::OnCreate(...) 或者 BOOL CTimeExitDlg::OnInitDialog(...)中应该有类似的函数调用: SetTimer(...); 这才是WM_TIMER的消息产生源头。 如果没有定义相应的TimerProc,那么Windows就会向你的窗口post一个WM_TIMER消息, ON_WM_TIMER()只是映射了这点,捕获消息后,交给你的程序处理。。。。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
嘉华汽修(邯郸复兴区)地址有知道的么?有点事
好再来川菜馆这个地址在什么地方,我要处理点
请问河南灵宝地区一般结婚彩礼都给多少?
单侧不可复性关节盘前移位可能出现的开口型异
傅氏水务地址在哪,我要去那里办事
鸿顺汽贸(邯郸曲周县)地址在什么地方,想过去
人体的血液循环系统由血液、心脏和血管组成血
苏州市林红工艺绣品厂怎么去啊,有知道地址的
幻世录2一共有几轮
教我如何不想她
华信认证二手车(邯郸邯郸县东环路与人民路交
斯维尔软件和广联达软件哪个简单
招行QQ会员联名卡怎样关联QQ号码
09年中考正定中学需要多少分?
MFC中怎样将编辑框里的默认0去掉?
推荐资讯
红细胞内含有血红蛋白这一含铁的蛋白质,这种
婚前男方买的房子,写两个人的名字,是共同财
新的小型汽油单缸四冲程发动机带负荷即熄火是
和男友抱抱时怎样让他产生欲望
东方美苑地址在什么地方,想过去办事
无锡尚德这个厂有多少一线员工,详细!!!!
飞飞舞蹈地址好找么,我有些事要过去
淄博市城市管理监督指挥中心在哪里啊,我有事
我初中毕业。想自考专科。应该报读什么专业
崇领车业地址好找么,我有些事要过去
格莱美奖很权威吗
忠记二手车咨询行地址好找么,我有些事要过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?